【實驗吧】CTF_Web_因缺思汀的繞過


打開頁面,查看源代碼,發現存在source.txt(http://ctf5.shiyanbar.com/web/pcat/source.txt),如下:

<?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);
//設置活動的 MySQL 數據庫
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql); 
//執行一條 MySQL 查詢
if (mysql_num_rows($query) == 1) { 
//返回結果集中行的數目
    $key = mysql_fetch_array($query);
//返回根據從結果集取得的行生成的數組,如果沒有更多行則返回 false
    if($key['pwd'] == $_POST['pwd']) {
        print "CTF{XXXXXX}";
    }else{
        print "亦可賽艇!";
    }
}else{
    print "一顆賽艇!";
}
mysql_close($con);
?>

由源碼分析,必須滿足一下條件:
1. $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)" 過濾了關鍵字
2. if (mysql_num_rows($query) == 1) 返回數據為1條
3. if($key['pwd'] == $_POST['pwd']) 傳入的pwd和查詢出來的結果一致

不適用條件1即可完成。

limit 2 offset 3 中,2表示返回2行,3表示從表的第4行開始,如下圖(建表及插入語句見http://www.cnblogs.com/caizhiren/p/7768936.html):

1' or 1 含義如下:

Group by with rollup 會在最后多計算一個總數(http://blog.csdn.net/id19870510/article/details/6254358)

 

mysql> select * from user where name = 'admin' or 1 group by name with rollup limit 1 offset 0;

 

 

 

回到本題,輸入'1 or 1 limit 1 offset 0# 和'1 or 1 limit 1 offset 1# 返回亦可賽艇!,輸入'1 or 1 limit 1 offset 2# 返回一顆賽艇!,說明一共有兩行。再帶入上面的列子,1' or 1=1 group by pwd with rollup limit 1 offset 2#, 密碼不輸入,及為空,和with rollup的結果一致,即可得CTF{with_rollup_interesting}

 

參考鏈接:http://www.bubuko.com/infodetail-2169730.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM