實戰篇——檔案上傳漏洞upload-labs-master靶場實戰(1)
前端驗證繞過
(1) 篡改js程式碼
直接上傳一句話木馬失敗:
檢視頁面原始碼:
可見前端透過checkFile函式對上傳檔案的字尾名進行了驗證。
使用Tampermonkey自定義js指令碼,用於刪除form表單的onsubmit屬性:
啟用指令碼,重新整理頁面,前端驗證功能已被刪除:
複製影像地址,新建標籤頁開啟,成功連線木馬:
(2) 抓包修改字尾
先將一句話木馬字尾改為.jpg,抓包:
再將字尾重新改回.php,傳送,同樣可以繞過:
後端黑名單繞過
(1) MIME繞過
程式碼審計:
可見後端對MIME進行驗證。
抓包:
將MIME改為image/jpeg,傳送:
成功連線木馬:
(2) .phtml繞過
程式碼審計:
可見黑名單不包括.phtml,當php為老版本且在httpd.conf中AddType application/x-httpd-php .php .phtml開啟(預設關閉)時,可將字尾改為.phtml實現繞過。
將字尾改為.phtml,上傳,成功連線木馬:
(3) .htaccess繞過
程式碼審計:
可見黑名單中增加了.phtml,但不包括.htaccess,當php為老版本且在httpd.conf中AllowOverride開啟(如下)(預設開啟)時,可以先上傳.htaccess配置檔案指定當前目錄下可被php解析的字尾,再將一句話木馬的字尾改為.htaccess配置檔案指定的字尾之一併上傳,實現繞過。
編輯.htaccess配置檔案,指定字尾為.jpg:
上傳.htaccess配置檔案:
將一句話木馬字尾改為.jpg,上傳,成功連線木馬:
(4) .user.ini繞過:
程式碼審計:
可見黑名單中增加了.htaccess,但減少了.ini,當php為新版本且上傳路徑下存在.php檔案時,可以先上傳.user.ini配置檔案指定插入當前目錄下所有.php檔案首部或尾部的檔案,然後將一句話木馬的字尾改為黑名單之外的字尾並上傳,最後上傳路徑下的所有.php檔案都會被插入一句話木馬,連線其中任一檔案即可。
編輯.user.ini配置檔案,指定插入檔案為webshell.jpg:
上傳.user.ini配置檔案:
將一句話木馬字尾改為.jpg,上傳,訪問readme.php(透過目錄掃描獲得),成功連線木馬:
(5) 大小寫繞過
程式碼審計:
可見沒有將字尾轉換為小寫,且黑名單過濾不充分,當php為老版本時,可以將字尾改為.PhP等實現繞過。
將一句話木馬字尾改為.PhP,上傳,成功連線木馬:
(6) [1]+$繞過
程式碼審計:
此處只對'.'和' '進行了有限次的過濾,可以將字尾改為'.php. .'等形式實現繞過。
抓包,將一句話木馬的字尾改為.php. .,傳送:
成功連線木馬:
(7) 雙寫繞過
程式碼審計:
此處將檔名中所有黑名單內的字串進行了過濾,由於只進行了有限次過濾,可以透過將字尾改為.pphphp實現繞過。(.phphpp不行)
將一句話木馬字尾改為.pphphp,上傳,成功連線木馬:
後端白名單繞過
(1) 00截斷[GET型]
程式碼審計:
此處透過GET請求獲得檔案儲存路徑,因此路徑可控,當php版本小於5.3.4且在php.ini中magic_quotes_gpc關閉時可以將路徑跟上'/webshell.php%00'等形式實現繞過。
使用Tempermonkey自定義js指令碼,修改form的action屬性,實現00截斷:
啟用指令碼,重新整理頁面,檔案儲存路徑已被修改:
將一句話木馬字尾改為.jpg,上傳,成功連線木馬:
(2) 00截斷[POST型]
程式碼審計:
唯一的區別就是將GET改為了POST,一樣的配方。
成功連線木馬:
(3) 條件競爭
程式碼審計:
此處執行邏輯為:先將檔案儲存,若檔案字尾在白名單內,則重新命名;若檔案字尾不在白名單內,則刪除。
如果在木馬儲存和刪除的時隙內訪問木馬,那麼木馬是可以被執行的,只不過很快就會被刪除。但如果上傳的木馬能夠釋放一個一句話木馬,那麼雖然上傳的木馬會被刪除,一句話木馬是不會被刪除的,由於正在執行的指令碼無法刪除,因此這種方法是可行的。
編輯載體:
上傳載體,抓包,傳送至Intruder模組,配置Continue indefinitely:
訪問載體,抓包,傳送至Intruder模組,配置Continue indefinitely:
同時開始爆破,只要成功訪問載體一次即可植入一句話木馬:
成功連線木馬:
. ↩︎