发布于周五 14:505天前 xray支持用户以YAML格式编写自己的POC规则。 YAML 是JSON 的超集。也就是说,你甚至可以用JSON来编写POC,但仍然建议你使用YAML来编写,原因如下: \r \r 1. YAML值不需要用双引号括起来,所以特殊字符不需要转义\r 2.YAML内容更具可读性\r 3.YAML中可以使用注释\r \r ## 设计目标\r \r 设计目标:\r \r 1.简洁大方\r 2.可以覆盖最常见的扫描规则场景,包括但不限于\r 1.主机指纹识别\r 2.WEB指纹识别\r 3.主机漏洞检测\r 4.WEB漏洞检测\r \r 我们希望:\r \r 1.为规则本身提供良好的抽象,屏蔽编程语言的复杂性,只关注规则本身。 \r 2、我们希望为安全开发者提供更少的学习成本和更简单的规则编写,统一目前各种规则的复杂性。 \r \r ## POC 脚本格式\r \r - [V2版本](https://stack.chaitin.com/techblog/detail?id=50curNav=index)\r - [V1版本](https://stack.chaitin.com/techblog/detail?id=51curNav=index)\r \r ## 写入环境\r \r ### VSCode\r \r 使用VSCode,经过一些配置后,可以提供一些智能提示,方便编写POC。 \r \r 首先安装https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml插件,然后在设置中确认Extensions - YAML中的相关开关已打开。然后点击`Edit in settings.json`,将json内容修改为\r \r ```javascript\r {\r \'yaml.schemas\': {\r \'https://raw.githubusercontent.com/chaitin/gamma/master/static/schema/schema-v2.json\': [\'fingerprint-yaml-*.yml\', \'poc-yaml-*.yml\']\r }\r }\r ````\r \r 这样,当你创建一个以`poc-yaml-`开头且扩展名为`yml`的文件时,就可以自动提示。 \r \r 注意,由于插件bug,除了第一行之外,其他内容无法直接提示。需要使用快捷键让VSCode 显示提示,通常是`ctrl` + `Space`。 \r \r \r \r ### jetbrains系列IDE\r \r [下载文件](https://raw.githubusercontent.com/chaitin/gamma/master/static/schema/schema.json)\r \r ## 生命周期\r \r 为了帮助大家更好的理解poc中各部分的作用,这里我们先介绍一下一个yaml poc的执行流程。 \r \r 当yaml poc从文件加载到go的某个结构中后,首先会预编译表达式并进行静态类型检查。这个过程主要影响yaml中的set和表达式部分。这两部分是yaml poc的关键,主要使用CEL表达式。 \r \r 检查完成后,内存中的poc就处于等待调度的状态。每当**新请求**到来时,就会执行类似下面的伪代码:\r \r ```golang\r 对于rules:中的规则\r newReq=mutate_request_by_rule(req, 规则)\r 响应=发送(newReq)\r 如果不是check_response(响应, 规则):\r 中断\r ````\r \r 简单来说,就是根据rule中的规则对请求进行转换,然后得到转换后的响应,然后检查响应是否与“表达式”部分中的表达式匹配。如果匹配,则继续下一条规则;如果不匹配,则退出执行。 \r 如果最后一条规则执行成功,则说明目标存在漏洞。将详细信息附加到漏洞输出后,单个POC的整个流程就完成了。 \r \r 当前版本的实现将**新请求**定义为: **新目录**。例如,当以下URL依次进入检查队列时,执行情况如下: \r \r ````\r http://exmaple.com/将被执行,上下文为/\r http://example.com/a 不会再次执行,因为上下文也是/\r http://example.com/a/b 将在上下文/a/\r 下执行 http://example.com/a/c/不会被执行,超出深度限制(深度)\r ````\r \r 其中,`depth`是phantasm插件的配置项,用于指定检测深度。您可以参考:[插件配置](/configration/plugins?id=dirscan)\r \r ## 转义指令\r \r 在编写表达式时,需要特别注意一个问题:yaml 字符串的转义和CEL 表达式字符串的转义。 \r \r 在yaml中,如果要写字符串类型的值,可以使用引号将其包裹起来,如:\r \r ```yaml\r name: \'值\'\r ````\r \r 但如果值中有反斜杠,解析yaml时就会被转义。那么如果表达式代码中有双引号或者转义字符,转义字符就没有了,我们需要双转义。这个时候写出来的代码将会非常不可读,也难以维护。 \r \r 因此,建议使用yaml中支持的[块样式](https://yaml.org/spec/1.2/spec.html#style/block/)来表达,如:\r \r ````\r 表达式: |\r response.status==200 response.body.bcontains(b'\\x01\\x02\\x03')\r ````\r \r 此时,YAML 级别不需要转义。 \r \r ## 如何调试poc\r \r 如果poc无法扫描出预期的结果,可以按照以下思路进行调试\r \r - 确保poc语法正确并且有效负载正确。 \r - 在配置文件的`http`部分添加`proxy: \'http://proxy:port\'`,例如设置burpsuite为代理,这样就可以在burp中看到poc发送的请求,看看是否是预期的。
创建帐户或登录后发表意见