nuclei-poc入门编写实例
1、yaml
简单来说yaml也是一种标记语言,它的设计目标是易于阅读和编写,同时也便于计算机解析。nuclei的poc是基于yaml编写的,我们可以快速的编写一个0day或者nday漏洞的POC。个人感觉比自己写用pyhton的request库,写一堆if…else…做健壮性判断简洁,也简单
而却nuclei是根据go语言开发的,他比python的并发性要好很多,也就是做批量漏洞验证的时候,会比python快很多。
2、POC语法
1) id
第一行就是我们poc的id,注意id的值是不能有空格的
例如:
id: cve-2024-44335 #这里随便写的,主要是格式不能有空格
yaml中是 key冒号+空格+值的
2)信息介绍
下面是我们的介绍信息注意:yaml和python的代码块的方式很相似,但yaml是不允许有tab的,我们只能用空格对齐,表示代码块
info:
name: test #这里是漏洞的名字 自定义的
author: LINGX5 #作者名字
severity: high #漏洞的危害等级
3)http请求
http请求的封装 nuclei中的变量用{{}}
包裹
http:
- method: GET #http的请求方法
path:
- "{{BaseURL}}" #url路径,会从命令执行的参数中读取
例:如果命令输入的是 -u https://example.com:443/foo/bar.php 变量对应的值
{{BaseURL}} | https://example.com:443/foo/bar.php |
---|---|
{{RootURL}} | https://example.com:443 |
{{Hostname}} | example.com:443 |
{{Host}} | example.com |
{{Port}} | 443 |
{{Path}} | /foo |
{{File}} | bar.php |
{{Scheme}} | https |
BaseURL是最全的,比较建议。但也看个人poc需要
4) matchers匹配
matchers匹配字段,可以匹配响应的结果
matchers:
- type: word #匹配类型
words: #定义关键字数组
- "百度"
part: body #匹配的地方,一般就body和headers
匹配的的type有
1. word 关键字符串
2. regex 正则表达式
3. DSL 匹配器
3、百度测试为例
完整的poc
id: baidu_test
info:
name: baidu test
author: LINGX5
severity: low
http:
- method: GET
path:
- "{{BaseURL}}"
matchers:
- type: word
words:
- "百度"
part: body
这段代码就是 定义了id为baidu_test的poc。
发送GET {{BaseURL}}请求,相应体匹配 关键词 百度。
匹配到输出结果,匹配不到不输出
1)测试POC正确性
#这里 -t 后边换成 自己的yaml poc 地址
.\nuclei.exe -t "D:\WebSafe\tools\漏洞扫描工具\nuclei\NucleiTP\MyPOC\test.yaml" -validate
a) 正确的结果:
最后结果 No results found. Better luck next time! 表示没有语法错误
这句话是因为 没有url匹配规则,我们用 -u 参数 传进匹配的url取
b) 错误的结果: 根据报错去调试poc
显示 mandatory ‘author’ field is missing 就是因为我把 info中的author字段删了,报的这个错。
报什么错问 gpt 或者 百度 去纠正就好
.\nuclei.exe -t "D:\WebSafe\tools\漏洞扫描工具\nuclei\NucleiTP\MyPOC\test.yaml" -u http://www.baidu.com
有一条匹配结果 [baidu_test] [http] [low] http://www.baidu.com
4 、debug调试
我们还可以使用-debug参数进行调试看具体输出结果
.\nuclei.exe -t "D:\WebSafe\tools\漏洞扫描工具\nuclei\NucleiTP\MyPOC\test.yaml" -u http://www.baidu.com -debug
看到发送的具体请求包
看到响应包里的多个匹配值