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