第一次成功復現一個簡單漏洞,於是寫下這篇隨筆記錄一下
首先我們來看dvwa中low級的sql注入的源碼
源碼文件路徑如下圖:
源碼如下:
1 <?php 2 3 if(isset($_GET['Submit'])){ 4 5 // Retrieve data 6 7 $id = $_GET['id']; 8 9 $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 10 $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 11 12 $num = mysql_numrows($result); 13 14 $i = 0; 15 16 while ($i < $num) { 17 18 $first = mysql_result($result,$i,"first_name"); 19 $last = mysql_result($result,$i,"last_name"); 20 21 $html .= '<pre>'; 22 $html .= 'ID: ' . $id . '<br>名字: ' . $first . '<br>姓氏: ' . $last; 23 $html .= '</pre>'; 24 25 $i++; 26 } 27 } 28 ?>
簡單分析一下源碼,
當php確認用戶提交表單后開始執行,接受id參數給$id,未經任何過濾直接用sql語句查詢數據庫,最后將查詢后的結果集中的數據打印出來
接下來為了復現漏洞,用phpMyAdmin創建一個新數據庫
創建了一個test的數據庫,庫里創建了users表,表中隨便寫了一些數據如下:
然后寫一個可以查詢數據庫內容的網頁,開始復現漏洞
代碼如下:
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 5 </head> 6 <body> 7 <form action="" method="GET"> 8 <p>id:<br/><input type="text" name="id"> <input type="submit" name='submit' value="submit"/> 9 </p> 10 </form> 11 <?php 12 13 error_reporting(E_ALL&~E_NOTICE); 14 15 // 連接數據庫和test表 16 $con=mysql_connect("localhost","root","root"); 17 if (!$con){ 18 die('Could not connect: ' . mysql_error()); 19 } 20 $db_selected = mysql_select_db("test", $con); 21 22 23 if(isset($_GET['submit'])){ //判斷表單是否提交 24 $id=$_GET['id']; //接受表單中id的參數賦給$id 25 $sql="SELECT user_name FROM users WHERE user_id='$id'"; //sql查詢語句 26 27 //執行查詢語句並將結果集賦給$result 28 $result=mysql_query($sql) or die('<pre>' . mysql_error() . '</pre>' ); 29 30 31 $num = mysql_numrows($result); 32 $i = 0; 33 while ($i < $num) { 34 35 //提取$result的結果集中的user_name的數據並將其賦給$name 36 $name = mysql_result($result,$i,"user_name"); 37 38 // 將$id和$name的值拼接在變量$html上最后打印出來 39 $html .= '<pre>'; 40 $html .= 'ID: ' . $id . '<br>名字: ' . $name; 41 $html .= '</pre>'; 42 $i++; 43 } 44 echo $html; 45 } 46 47 ?> 48 </body> 49 </html>
測試
先試試正常的輸入,顯示出與用戶ID相應的用戶名
接着試試 萬能密碼 ,顯示出了所有用戶名
接着就是查看數據庫及其管理員賬號
接着是一系列sql注入
爆數據庫名
爆列名(這里好像把dvwa數據庫的users表里的內容也爆出來了……)
爆user_pwd里的內容
總結
復現漏洞的過程中,能逐漸理解、明白漏洞的原理,清楚代碼的構造,收獲很大。