實驗吧-因缺思汀的繞過

題目鏈接:http://www.shiyanbar.com/ctf/1940

查看源碼,可以看到註釋裏提示了源碼的位置,訪問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);
$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);
?>

通讀源碼可以發現,我們輸入的username與password都使用了黑名單過濾,這也告訴我們是有機會的,畢竟黑名單存在繞過的可能性。黑名單如下:

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";

過濾了之後,執行了一條sql語句:

$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";

這條語句拼接了我們輸入的uname,也就是說注入點只可能存在於uname字段,接下來判斷了sql語句的查詢結果是否只有一條數據,如果成立就把我們post過去的密碼與數據庫中存儲的密碼進行比對,如果相同就打印flag!

mark
這兒也就是我們需要繞過的地方,其中最主要的又是繞過密碼的比較。我一開始的思路是使用union語句構造一個類似於下面的語句:

}' union select 123,123#

然後密碼輸入123,就可以繞過了。但是發現繞不過它的過濾條件,搞了半天結果還是自己sql語句玩的不夠熟練,,這裏是巧妙地用了select過程中​​用group by with rollup這個統計的方法進行查詢。group by with rollup會在統計後的產生一條null信息,然後在pwd裏不寫值,if就爲true了。

所以只要我們用戶名輸入如下語句:

}' or 1 group by pwd with rollup limit 1 offset 2#

(該數據表中只有兩條信息)
然後密碼部分保持爲空就可以得到flag。
mark

關注web安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章