with rollup

实验吧的一道ctf题,这两天无聊,做做ctf题。在实验吧被一道也题卡了好久。

页面很简单就是一个登陆页面,按照之前的经验觉得应该是注入吧。再看题猜测应该是绕waf之类的。

查看页面源码找到了提供的源代码

<?php
error_reporting(0);

if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
    echo '<form action="" method="post">'."<br/>";
    echo '<input name="uname" type="text"/>'."<br/>";
    echo '<input name="pwd" type="text"/>'."<br/>";
    echo '<input type="submit" />'."<br/>";
    echo '</form>'."<br/>";
    echo '<!--source: source.txt-->'."<br/>";
    die;
}

function AttackFilter($StrKey,$StrValue,$ArrReq){  
    if (is_array($StrValue)){
        $StrValue=implode($StrValue);
    }
    if (preg_match("/".$ArrReq."/is",$StrValue)==1){   
        print "姘村彲杞借垷锛屼害鍙禌鑹囷紒";
        exit();
    }
}

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){
    AttackFilter($key,$value,$filter);
}

$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
    die('Could not connect: ' . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
    $key = mysql_fetch_array($query);
    if($key['pwd'] == $_POST['pwd']) {
        print "CTF{XXXXXX}";
    }else{
        print "浜﹀彲璧涜墖锛�";
    }
}else{
    print "涓€棰楄禌鑹囷紒";
}
mysql_close($con);

编码问题也懒得改。其实源码也蛮简单的,前面就是讲过滤了什么的,后面是sql语句。但是一看select  () sleep 这些全部没了,数组也给字符串化,基本上想要查数据就很难了。实在是头有点痛,去翻了好多大佬的博客,想看看有没有黑科技可以用的。没有找到。

最后还是屈服去看wp了。结果这个语句完全没有想到:uname=admin'|| 1 limit 1%23&pwd= 过第一重防护,最终用到uname=admin' || 1 group by pwd with rollup limit 1 offset 2 %23&pwd=这里group by是把前面的查询的内容按照pwd来分组。with rollup是统计信息的这里就是重点了,因为代码中$key['pwd'] == $_POST['pwd']用的是双等号是弱比较。而with rollup会在查询的结果后面加上一个为空的列,本地测试下:

 

所以password为空和NULL是相等的就绕过了pwd的比较。还有一点就是offset和limit的用法,有点多就不说了。

 

 

 

 

(然后这篇文章发出去两天后,大佬告诉我,这里没有过滤like是可以直接盲注出结果的~~http://www.shiyanbar.com/ctf/writeup/1197这是大佬写的盲注的方法)

 

posted @ 2017-03-25 19:22  wangshu  阅读(1478)  评论(0编辑  收藏  举报