poc编写(支持xray&xpoc)

简介


此次编写的poc仅适配xray和xpoc工具;详情见如下链接:

xray:https://stack.chaitin.com/tool/detail/1

xpoc:https://stack.chaitin.com/tool/detail/1036

此次只讲解一下编写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

https://cdn.nlark.com/yuque/0/2023/png/23007277/1699789361134-93e38721-a3bb-492e-878f-3bc07ebb0777.png

如果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扫描会自动加载。

posted @ 2023-11-17 14:37  Axion11  阅读(964)  评论(0)    收藏  举报