poc编写(支持xray&xpoc)
简介
此次编写的poc仅适配xray和xpoc工具;详情见如下链接:
此次只讲解一下编写poc过程中的疑点,至于poc编写模板,可以参考长亭提供的官方文档:https://docs.xray.cool/xpoc#/guide/yaml/yaml_poc_template
正则表达式
匹配string格式路径
文件上传响应内容如下
eg: /c0fig_20231014092232997.php
# 方法一:
file: response.body_string // 直接获取返回值
path: '{{file}}' // GET请求直接单引号包裹变量,即可显示原格式,即:/c0fig_20231014092232997.php
# 方法二:
file: replaceAll(response.body_string, "/", "") // 使用replaceAll函数将c0fig_20231014092232997.php前面的/替换为空
path: /{{file}} // 这样拼接的时候就不会出现//c0fig_20231014092232997.php的情况
这里和上面的结果还是一样的。
匹配json格式路径
eg: [("retCode":"1","file":"c0fig. jsp","path":"/../upload/php/c0fig_20231014092232997.php"]
search: '"path\":\"(?P<dir>.+?)\"".bsubmatch(response.body)' // 结果:/../upload/php/c0fig_20231014092232997.php
file: replaceAll(search["dir"], "/../upload/php/", "") // 正则表达式将/../upload/php/替换为空
匹配xml格式路径
eg: <?xml version="v1.0" encoding="utf-8"><root>20231014092232997_asoias.php</root>
search: '"<root>+(?P<filename>.+php)+</root>".bsubmatch(response.body)'
uploadfilename: search["filename"] // filename的结果:20231014092232997_asoias.php
HTTP请求体格式
xml格式
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element attribute="value">Text</element>
</root>
请求包会按照原本的格式发送。
文件上传格式
这里body的内容一定要注意格式,防止被转义。
请求头
添加自定义请求头,这里一定要单引号包裹空格,不输入空格不生效,或者随便输入一个字符都可以。
headers:
xxxx: ' '
headers:
xxxx: s
这里把s替换为null关键字也是不可以的。
目录遍历
continue:命中一个是否继续
payloads:
continue: false
payloads:
p1:
dirt: |
"1.txt"
p2:
dirt: |
"2.txt"
当1.txt不存在的时候,才会请求2.txt
如果1.txt存在,并且满足条件时,就不会继续请求后面的2.txt、3.txt等等。
当设置为true时,当1.txt满足条件,仍会继续请求2.txt
payloads:
continue: true
payloads:
p1:
dirt: |
"1.txt"
p2:
dirt: |
"2.txt"
目录遍历(不同请求地址,不同响应内容):https://docs.xray.cool/xpoc#/guide/course/phaseIII
命中规则
状态码302,无响应内容
这种情况下,为了减少误报,可以从响应头进行判断
expression: response.headers["Content-Type"].contains("application/json")
以下情况适用于302跳转登陆。
1) 使用正则表达式去匹配
expression: '"(?m)^(?:Location\\s*?:\\s*?)(?:https?://|//)(?:[a-zA-Z0-9\\-_\\.@]*)xxx\\.sh.*$".bmatches(response.raw_header)'
2) 使用Location字段去匹配
expression: response.status == 302 && response.headers["location"] == "http:/interact.sh?" && response.body.bcontains(b"http:/interact.sh?\">Found</a>.")
返回包显示base64编码的内容
eg:响应包返回C:\Windows\win.ini内容的base64编码。
OyBmb3IgMTYtYml0IGFwcCBzdXBwb3J0DQpbZm9udHNdDQpbZXh0ZW5zaW9uc10NClttY2kgZXh0ZW5zaW9uc10NCltmaWxlc10NCltNYWlsXQ0KTUFQST0xDQpbUmVzcG9uc2VSZXN1bHRdDQpSZXN1bHRDb2RlPTBz
匹配规则
expression: response.status == 200 && "for 16-bit app support".matches(base64Decode("(?P<base64>.*)".bsubmatch(response.body)["base64"]))
反连设置
还在测试中。。。
代理验证poc
xpoc和xray都是不支持命令行参数添加代理的,都是需要通过配置文件进行添加
xpoc配置文件
xray配置文件
调试(重要)
# 脚本格式检测
xray_windows_amd64.exe poclint --script poc-yaml-xxx.yml
# 调试
xray_windows_amd64.exe --log-level debug webscan -u http://example.com -p ./poc-yaml-xxx.yml
xray&xpoc使用自定义poc脚本
xpoc
# 加载单个poc文件进行扫描
xpoc.exe -r poc-yaml-test.yml -t http://www.example.com/
# 加载多个poc文件进行扫描
xpoc.exe -r poc/ -t http://www.example.com/
xpoc支持将自定义poc添加到插件中,方便扫描(插件路径:C:\Users\用户名\.xray\xpoc\plugins
)
xpoc.exe add -f poc-yaml-test.yml
xray
# 加载单个poc文件进行扫描
xray.exe webscan --poc poc-yaml-test.yml --url http://example.com/ --ho output/h1.html
# 加载多个poc文件进行扫描
xray.exe webscan --poc poc/* --url http://example.com/ --ho output/h2.html
xray配置自动加载自己编写的poc
将自己编写的poc放置在xray.exe同级目录下,poc文件一定要以poc-*开头,使用xray扫描会自动加载。
本文作者:Cx330Lm
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
安全声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!