1. 程式人生 > >一個非常詳細測試上傳的姿勢

一個非常詳細測試上傳的姿勢

類型 原理 失望 php src dst gpa 小寫 普通

【情況】
上傳點界面:
技術分享



技術分享
這個上傳點只有一個界面,且上傳後會自動刪除。成功突破會返回一串秘鑰。



上傳點抓包界面如下:
技術分享
技術分享



上傳一個普通圖片,返回路徑upload/20160226222154_920.jpg


可以看到,整個上傳包沒有任何多余的參數。除了文件頭+本地文件名+圖片內容+按鈕
就沒別的東西了。




發現會自動重命名,然後下面就是想辦法搞清楚它的上傳驗證機制,通過以下動作探測。


1.驗證允許上傳的文件後綴類型。
1-1.上傳.jpg,成功上傳並返回路徑。
【得知】
上傳文件被重命名

1-2.上傳.gif,成功上傳但是返回的是.jpg
1-2-1為了驗證是否支持.gif,所以把文件頭和文件類型都改為gif的,仍然返回後綴為jpg。
【得知】
除白名單以外的後綴類型(不識別的後綴類型),均提交為jpg後綴上傳。

1-3.上傳.php後綴則失敗。
1-3-1.上傳.php1或1php或pHp或1phP1同樣失敗。
1-3-2.考慮用冷格式代替腳本,故上傳.cdx和.htr 上傳成功但是返回後綴為jpg。
【得知】
匹配到後綴中含有php則上傳失敗,並且會轉為小寫。

1-4.把上傳類型image/gif修改為php的application/octet-stream 上傳.php上傳失敗,上傳.jpg同樣失敗。
【得知】
驗證了上傳類型

1-5.上傳x.php.jpg返回後綴為jpg。
【得知】
上傳文件是從右邊匹配的,反之應該上傳失敗的。

1-6 為了測試截斷的支持情況。故;
1-6-1.上傳x.jpg□.php返回正常jpg路徑。
1-6-2.上傳x.php□.jpg則上傳失敗。
【得知】
1-6-2上傳失敗說明被成功截斷了。至於上傳失敗的原因在於1-3

1-7.上傳x.php.返回jpg後綴。
【得知】
.作為特殊符號,不在後綴匹配範圍內。所以.php.可以上傳成功。是因為把.作為後綴的一部分,所以上傳按照1-2的原則來上傳。

1-8.上傳x.j正常返回。上傳x.正常返回。上傳x正常返回。上傳.正常返回。
.上傳成功

通過以上分析得出此上傳點;
1.支持截斷,但是沒什麽卵用。因為截斷後的x.php不給上傳。
2.只要匹配到後綴有php,則上傳失敗。不識別的腳本格式均作為jpg上傳。

附上傳失敗的截圖:
技術分享







了解了他的上傳機制以後基本上就沒有思路了,主要是無處下手。別說path改路徑之類的了,就連一個多余的參數都沒有。除了文件頭+本地文件名+文件內容+按鈕。再也沒有多出一樣東西。


然後想著既然確定了驗證上傳文件類型,那我們在添加個php的類型。
1.添加好以後是兩個上傳類型並存,我們先試試jpg能不能正常上傳。測試定義兩種類型對上傳的影響。
技術分享

可以看到,左邊是image/gif(只要是圖片類型都可以) 右邊是php的類型application/octet-stream
可以正常上傳。


接著上傳php,如下圖:
技術分享


上傳失敗。
如果把文件類型定義為application/octet-stream 那麽上傳任何後綴都是失敗的,但是gif和jpg的就可以。還是說明1.驗證上傳類型為圖片 2.後綴驗證。




雖然搞清了上傳驗證規則,但是沒卵用。還是突破不了,非常遺憾。直到兩天後,看到答案以後。整個人腦子都不好使了。




【突破方法】
將multipart/form-data的大小寫改下就可以繞過了


參考資料:http://www.wooyun.org/bugs/wooyun-2015-0125982 這是逐浪CMS爆出的一個漏洞。




我看到突破方法以後很失望。首先是這種情況極少,對實際滲透的意義不大。再者就是也沒有給出分析過程和原理。
這樣我唯一的收獲就是:遇到類似驗證的上傳點可以改下文件類型大小寫試試。


又看了一下烏雲給出的上傳代碼。
技術分享



大概能看出來原理了。唉,還是有點失望。不過對以後突破上傳還是有幫助的。

一個非常詳細測試上傳的姿勢