PoC 编写注意事项
- 编写 PoC 的时候,尽量不要使用第三方模块,如果在无法避免的情况下,请认真填写
install_requires
字段,填写格式参考:《PoC 第三方模块依赖说明》。 - 编写 PoC 的时候,尽量的使用 Pocsuite3 已经封装的 API 提供的方法,避免自己重复造轮子,对于一些通用方法可以加入到 API,具体参考《通用 API 列表》。
- 如果 PoC 需要包含远程文件等,统一使用 Pocsuite3 远程调用文件,具体可以参考《Pocsuite3 远程调用文件列表》,不要引入第三方文件,如果缺少对应文件,可 GitHub 提交 PR。
- 每个 PoC 在编写的时候,尽可能的不要要求输入参数,这样定制化过高,不利于 PoC 的批量化调度执行,尽可能的 PoC 内部实现参数的构造,至少应该设置默认值,如某个 PoC 需要指定用户 id,那么应该允许使用自定义参数传入 id,也应该没有传入该参数的时候自动设置默认值,不应该影响 PoC 的正常运行与验证。
- 每个 PoC 在输出结果的时候,尽可能的在不破坏的同时输出取证信息,如输出进程列表,具体参考《PoC 结果返回规范》。
- 为方便 PoC 管理,请认真填写 PoC 信息字段,其中 vulID 请填写 Seebug 上的漏洞 ID(不包含
SSV-
)。 - 为了防止误报产生以及避免关键词被 WAF 等作为检测特征,要求验证结果判断的时候输出随机的字符串(可以调用 API 中的
random_str
方法),而不用采用固定字符串。
比如:
检测 SQL 注入时:
token = random_str()
payload = 'select md5(%s)' % token
...
if hashlib.new('md5', token).hexdigest() in content:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
检测 XSS 漏洞时:
# 可参考 https://paper.seebug.org/1119/
token = random_str()
payload = 'alert("%s")' % token
...
if payload in content:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
检测 PHP 文件上传是否成功:
token = random_str()
payload = '<?php echo md5("%s");unlink(__FILE__);?>' % token
...
if hashlib.new('md5', token).hexdigest() in content:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
- 任意文件读取如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 Windows 版和 Linux 版两个版本。例子:
for i in ['/etc/passwd', '/windows/win.ini']:
res = self._arbitrary_file_read(i)
if b':/bin' in res or b'[fonts]' in res:
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
result['VerifyInfo'][i] = res.decode()
break
return self.parse_output(result)
- 检测模式下,上传的文件一定要删掉。
- 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。
- PoC 编写好后,务必进行测试,测试规则为:5 个不受漏洞影响的网站,确保 PoC 验证不成功;5 个受漏洞影响的网站,确保 PoC 验证成功