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. 辅助工具
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/