Web安全測試學習筆記 - 圖片上傳

不少網站都有上傳資源(圖片或者文件)的功能,資源上傳後通常會存儲在服務器的一個文件夾裏面,若是攻擊者繞過了上傳時候的文件類型驗證,傳了木馬或者其餘可執行的代碼上去,那服務器就危險了。php

 

我用DVWA的文件上傳來作練習,low模式沒有任何驗證,隨便上傳任意大小和類型的文件,現實中通常不會存在,故跳過,從medium模式開始。安全

進入頁面後,我嘗試傳一個php文件上去(文件中有一段代碼,用來列出上級目錄的全部文件),下圖說明medium模式對文件類型進行了限制(在作這個練習此以前,我以爲作了類型限制就很安全了,反正其餘類型都傳不上去嘛~),其實有一些方法能夠繞過這種檢測。服務器

 

修改Content-Type繞過文件類型檢測(medium模式)函數

用Burp Suite抓包以下,content-type的類型是octet-stream。根據頁面的報錯,這個頁面只能傳jpg和png格式的圖片。網站

嘗試把請求中content-type改成image/jpeg,再次發送請求,上傳成功。說明medium模式只驗證了Mime-Type,並無驗證文件自己(我傳的仍是php文件)ui

上傳成功後訪問3.php,代碼被執行(惡意代碼被執行的風險有多大不用多說了。。。)命令行

利用圖片馬繞過(heigh模式)blog

將security level修改成heigh,再次使用修改content-type的方法上傳,發現上傳失敗,也就是說,heigh模式校驗了上傳文件自己究竟是不是圖片。接下來嘗試用圖片馬來繞過。什麼是圖片馬,簡單來講就是在圖片中嵌入了代碼。。。步驟以下:圖片

1. 合成圖片馬資源

    找到一張貨真價實的圖片,而後將圖片和php文件合成另外一張圖片,在命令行使用以下命令:

    copy 3.png /b + test.php /a y.png    (y.png就是圖片馬)

2. 上傳圖片馬

    用Burp Suite抓包看到咱們的代碼已經隱藏在圖片裏了,而後直接上傳便可(由於文件格式是符合要求的)

    

利用GIF89a繞過(heigh模式)

什麼是GIF89a呢?先上傳一張貨真價實的gif圖片,抓包以下圖,圖片的最開始幾個字母就是GIF89a。我的理解GIF89a應該是gif文件的開頭標誌,只要有這個標誌,就會被當作gif圖片~

 

我將本地的php文件開頭加上gif89a,而後把文件重命名爲.jpg,進行上傳並上傳成功(實際上我上傳的是一段代碼)

這裏有個疑問:明明只容許上傳jpeg和png,爲什麼gif圖片也上傳了呢?個人理解是:文件類型和後綴名是分開校驗的。校驗文件類型的函數只校驗了是不是圖片(沒管是什麼類型的圖片),而jpeg和png的校驗只校驗了後綴名。

 

那有沒有辦法避免這種狀況呢?有,把security level修改成impossible模式,圖片馬和gif89a都不行了,由於impossible模式在high的基礎上,還檢測了上傳文件是否是貨真價實的圖片~

 

一點點感悟:

1. 上傳文件類型的校驗越嚴格越好(除了後綴名必須校驗文件自己)

2. 上傳的文件放在單獨的文件服務器上

 

如需轉載,請註明出處,這是對他人勞動成果的尊重~

相關文章
相關標籤/搜索