DVWA之從SQL注入到寫入webshell
這篇文章談論簡單的技術,利用sql注入(SQLi)漏洞,并獲得一個webshell,所有的演示都是用DVWA(滲透測試演練系統)。對于SQL注入利用,有以下幾個基本步驟:
1,發現SQL注入點;
2,通過mysql數據庫幫助,進一步進行注入,獲取帳號密碼等敏感信息;
3,上傳webshell,獲得一個反向連接。
本文所有的演示都是在DVWA(Dam Vulnerable Web Application)環境演示,DVWA是用PHP+Mysql編寫的一套用于常規WEB漏洞教學和檢測的WEB脆弱性測試程序。包含了SQL注入、XSS、盲注等常見的一些安全漏洞. 安裝好之后,我們在本文的演示中需要設置腳本安全級別為low(低)。
1、發現SQL注入點
識別SQL注入是關鍵的一步,它需要大量的技能和經驗來確定注入點。通過適當的分析應用程序,可以判斷什么地方存在注入點。在下面的屏幕截圖所示,“ID”字段中可能會受到SQL注入。程序功能需要一個整數做為用戶輸入,提交之后會顯示該ID對應的姓名。
當我們在用戶ID中加一個單引號(‘),會看到產生了數據庫的報錯,本次演示使用的是mysql數據庫。
之所以產生錯誤是因為,輸入的用戶ID中,單引號不是一個整數類型的,導致后端SQL查詢產生了錯誤,可以想象一下后端SQL查詢語句大概是這樣:
Mysql>select first_name,last_name from users where user_id=”;
如果輸入變成了非整數類型的單引號,SQL語句就會變成如下:
MySQL> select first_name, last_name from users where user_id=”’ ;
因此,產生了一個語法錯誤,所以注入點被確定為id字段。前端的該語句是會在后端的sql服務器進行執行的,這將使sql注入變為可能。
2、通過mysql數據庫幫助,進一步進行注入,獲取帳號密碼等敏感信息;
進一步嘗試猜測后端查詢語句,從而獲取mysql版本、數據庫名稱、列數等,通過前端的報錯等我們猜測后端的查詢語句是這樣的:
Mysql>select first_name,last_name for user where user_id=1;
以上只是胡亂猜測,我們需要通過mysql語句更進一步的進行測試,開始使用order by 。order by 語句可以對查詢結果進行排列,上面的語句中有兩列,使用order by 語句可以按照第一列first_name或者第二列last_name對結果進行排列。假如我們想根據第三列對結果進行排序,因為查詢語句中不存在第三列,就會產生報錯:
ERROR 1054 (42S22): Unknown column ’3′ in ‘order clause’
當我們使用order by 2的時候沒有產生任何錯誤,而使用order by 3的時候產生報錯,說明數據庫中只有兩列;通過這種方法我們可以使用order by語句猜測數據庫表中的列數。
user id輸入’ order by 3+–+的時候,后端SQL查詢語句如下:
Mysql>select first_name,last_name from user where user_id=”order by 3+–+’
可以看到因為不存在第三列會產生報錯。
user id輸入’order by 2+–+的時候,后端查詢語句如下:
Mysql>select first_name,last_name from user where user_id=”order by 2+–+’
可以看到沒有產生任何錯誤。
接下來進一步使用union查詢語句
為什么要使用聯合查詢?
Union查詢結合了兩個select查詢結果,根據上文中的order by語句我們知道查詢包含兩列,為了能夠現實兩列查詢結果,我們需要用union查詢了結合我們構造的另外一個select.注意在使用union查詢的時候需要和主查詢的列數相同。
MySQL> select first_name, last_name from users where user_id=”union select 1,2 ;
使用union select之后可以看到查詢結果顯示在了頁面上.
繼續構造union select語句,來查詢正在使用中的用戶和數據庫,用以下語句:
‘union select user(),database()+–+
‘union select session_user(),current_user()+–+
‘union select 1,version()+–+ 查詢數據庫的版本。
使用聯合查詢語句構造,利用注入讀取/ect/passwd 文件(linux系統)
‘UNION SELECT 1, load_file(/etc/passwd) +–+
使用聯合查詢語句構造,利用注入讀取c:\1.txt (Windows系統)
‘ UNION SELECT 1, load_file(‘c:\\1.txt’) +–+ 或者
‘ union select 1, load_file(‘c:\/1.txt’) +–+
3、利用sql注入寫入webshell
假設我們通過phpinfo文件知道了網站的物理路徑,接下來我們通過使用union select語句來寫入webshell.寫入需要你有寫入權限等。
‘ union select 1,’‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +–+
‘ union select 1,’’ into outfile ‘c:\\2.php’+–+
本文中用到的DVWA(滲透測試演練系統):http://www.kalinux.org 帳號密碼: admin password, 暫時因為環境不支持sql injection漏洞的演練。