Xray POC 编写指南
字数 490 2025-08-18 11:35:59

Xray POC 编写指南

1. YAML 基础

Xray POC 使用 YAML 格式编写,具有以下特点:

  • 大小写敏感
  • 使用 # 号进行注释
  • 使用缩进表示层级关系(不允许使用 Tab,必须使用空格)

文件命名格式为:组件-编号-漏洞类型.yml,例如:node-cve-2017-14849-fileread.yml

2. POC 基本结构

2.1 基本信息部分

# 基本信息
name: poc-yaml-test  # POC名称,格式为 poc-yaml-<组件名>-<漏洞编号>-<漏洞类型>
manual: true         # 区分是否手工编写

2.2 脚本部分

全局变量设置

set:
  randInt0: randomInt(1000, 9999)     # 生成1000-9999的随机整数
  randStr1: randomLowercase(10)       # 生成10位随机小写字母字符串

通信协议

transport: http  # 支持 http/tcp/udp

3. 规则(rules)编写

3.1 基本规则结构

rules:
  r1:
    request:
      method: GET    # 请求方法
      path: "/"      # 请求路径
    
    # 判断规则是否命中
    expression: |
            response.status == 200 && response.body.bcontains(b"example")
    
    # 从响应包获取数据
    output:
      search: |
                r'(?P<info>\|.*\|)'.bsubmatch(response.raw)'
      info: search["info"]

3.2 expression 表达式

常用匹配方式:

response.status == 200                    # 匹配状态码
"zbx_session" in response.headers         # 匹配Header
response.body.bcontains(b"verify_string") # 匹配Body内容

# 匹配MD5加密值
expression: response.body.bcontains(bytes(md5(string(randNum))))

3.3 搜索字符

search: |
    "\"verify_string\":\"(?P<token>\\w+)\"".bsubmatch(response.body)

4. 规则执行顺序

expression:
  r1()                     # 执行单个规则
  r1() && r2()             # 全部规则命中时返回true
  r1() || r2()             # 任一规则命中时返回true
  r1() || (r2() && r3())   # r1命中,或者r2、r3同时命中

5. 高级功能

5.1 output 全局变量

注意:不同规则中的 search 变量会互相覆盖,正确做法是为每个规则使用不同的变量名:

r0:
  output:
    r0search: "?P<info>\\w+".bsubmatch(response.body) 
    info1: r0search["info"]
r1:
  output:
    r1search: "?P<info>\\w+".bsubmatch(response.body) 
    info2: r1search["info"]

5.2 跟随跳转

follow_redirects: false  # 默认true,设置为false不跟随30X跳转

5.3 payload 载荷

payloads:
  payloads:
    ping:
      cmd: r"ping test.com"
    curl:
      cmd: r"curl test.com"

5.4 反连平台

set:
  reverse: newReverse()
  reverseURL: reverse.url

rules:
  r1:
    request:
      method: POST
      path: "/xxx/{{reverseURL}}"
    expression: |
            reverse.wait(5)  # 等待5秒检查是否收到反连

6. 调试与测试

6.1 Xray 调试

# 格式检测
xray poclint --script poc-yaml-xxx.yml

# 功能调试(通过Burp查看请求)
xray --log-level debug webscan --url http://example.com -p ./poc-yaml-xxx.yml

6.2 Gamma 工具

# 语法检查
gamma lint --script xxx.yml

# 运行测试
gamma run --target "http://xxx.com" --script xxx.yml

# 调试模式
GAMMA_LOG_LEVEL=debug ./gamma run --no-cache --target "http://xxx.com" --script xxx.yml

# 搭配Burp调试
gamma run --target "http://xxx.com" --script xxx.yml --http-proxy http://127.0.0.1:8080

7. 辅助工具

  1. Xray POC 辅助编写工具
  2. Xray POC 生成工具

8. 完整示例

# 基本信息
name: poc-yaml-test
manual: true

# 脚本部分
set:
  randInt0: randomInt(1000, 9999)
  randStr1: randomLowercase(10)

transport: http

rules:
  r1:
    request:
      method: GET
      path: "/"
    expression: |
            response.status == 200 && response.body.bcontains(b"example")
    output:
      search: |
                r'(?P<info>\|.*\|)'.bsubmatch(response.raw)'
      info: search["info"]

expression:
  r1()

# 信息部分
detail:
  author: Chaitin(https://chaitin.com/)
  links:
    - https://docs.xray.cool/

9. 参考文档

Xray POC 编写指南 1. YAML 基础 Xray POC 使用 YAML 格式编写,具有以下特点: 大小写敏感 使用 # 号进行注释 使用缩进表示层级关系(不允许使用 Tab,必须使用空格) 文件命名格式为: 组件-编号-漏洞类型.yml ,例如: node-cve-2017-14849-fileread.yml 2. POC 基本结构 2.1 基本信息部分 2.2 脚本部分 全局变量设置 通信协议 3. 规则(rules)编写 3.1 基本规则结构 3.2 expression 表达式 常用匹配方式: 3.3 搜索字符 4. 规则执行顺序 5. 高级功能 5.1 output 全局变量 注意:不同规则中的 search 变量会互相覆盖,正确做法是为每个规则使用不同的变量名: 5.2 跟随跳转 5.3 payload 载荷 5.4 反连平台 6. 调试与测试 6.1 Xray 调试 6.2 Gamma 工具 7. 辅助工具 Xray POC 辅助编写工具 Xray POC 生成工具 8. 完整示例 9. 参考文档 Xray 官方文档 CEL 语法文档