洞悉互聯(lián)網(wǎng)前沿資訊,探尋網(wǎng)站營銷規(guī)律
作者:Sally Zhang | 2021-11-28 09:38 |點(diǎn)擊:
很多網(wǎng)站都有上傳資源(圖片或者文件)的功能,資源上傳后一般會存儲在服務(wù)器的一個文件夾里面,如果攻擊者繞過了上傳時(shí)候的文件類型驗(yàn)證,傳了木馬或者其他可執(zhí)行的代碼上去,那服務(wù)器就危險(xiǎn)了。
我用DVWA的文件上傳來做練習(xí),low模式?jīng)]有任何驗(yàn)證,隨便上傳任意大小和類型的文件,現(xiàn)實(shí)中一般不會存在,故跳過,從medium模式開始。
進(jìn)入頁面后,我嘗試傳一個php文件上去(文件中有一段代碼,用來列出上級目錄的所有文件),下圖說明medium模式對文件類型進(jìn)行了限制(在做這個練習(xí)此之前,我覺得做了類型限制就很安全了,反正其他類型都傳不上去嘛~),其實(shí)有一些方法可以繞過這種檢測。
修改Content-Type繞過文件類型檢測(medium模式)
用Burp Suite抓包如下,content-type的類型是octet-stream。根據(jù)頁面的報(bào)錯,這個頁面只能傳jpg和png格式的圖片。
嘗試把請求中content-type改為image/jpeg,再次發(fā)送請求,上傳成功。說明medium模式只驗(yàn)證了Mime-Type,并沒有驗(yàn)證文件本身(我傳的還是php文件)
上傳成功后訪問3.php,代碼被執(zhí)行(惡意代碼被執(zhí)行的風(fēng)險(xiǎn)有多大不用多說了。。。)
比如惡意代碼為
<?php @eval($_POST['haha']) ?>
然后就可以用菜刀連接
利用圖片馬繞過(high模式)
將security level修改為high,再次使用修改content-type的方法上傳,發(fā)現(xiàn)上傳失敗,也就是說,high模式校驗(yàn)了上傳文件本身到底是不是圖片。接下來嘗試用圖片馬來繞過。什么是圖片馬,簡單來說就是在圖片中嵌入了代碼。。。步驟如下:
1. 合成圖片馬
找到一張貨真價(jià)實(shí)的圖片,然后將圖片和php文件合成另一張圖片,在命令行使用如下命令:
copy 3.png /b + test.php /a y.png (y.png就是圖片馬)
2. 上傳圖片馬
用Burp Suite抓包看到我們的代碼已經(jīng)隱藏在圖片里了,然后直接上傳即可(因?yàn)槲募袷绞欠弦蟮?
利用GIF89a繞過(high模式)
什么是GIF89a呢?先上傳一張貨真價(jià)實(shí)的gif圖片,抓包如下圖,圖片的最開始幾個字母就是GIF89a。個人理解GIF89a應(yīng)該是gif文件的開頭標(biāo)志,只要有這個標(biāo)志,就會被當(dāng)做gif圖片~
我將本地的php文件開頭加上gif89a,然后把文件重命名為.jpg,進(jìn)行上傳并上傳成功(實(shí)際上我上傳的是一段代碼)
這里有個疑問:明明只允許上傳jpeg和png,為何gif圖片也上傳了呢?我的理解是:文件類型和后綴名是分開校驗(yàn)的。校驗(yàn)文件類型的函數(shù)只校驗(yàn)了是否是圖片(沒管是什么類型的圖片),而jpeg和png的校驗(yàn)只校驗(yàn)了后綴名。
那有沒有辦法避免這種情況呢?有,把security level修改為impossible模式,圖片馬和GIF89a都不行了,因?yàn)閕mpossible模式在high的基礎(chǔ)上,還檢測了上傳文件是不是貨真價(jià)實(shí)的圖片~
一點(diǎn)點(diǎn)感悟:
1. 上傳文件類型的校驗(yàn)越嚴(yán)格越好(除了后綴名必須校驗(yàn)文件本身)
2. 上傳的文件放在單獨(dú)的文件服務(wù)器上
3. 文件上傳到服務(wù)器后對文件進(jìn)行重命名
文章來源于:https://www.cnblogs.com/sallyzhang/p/11906217.html