Skip to content

PoC 编写注意事项

  1. 编写 PoC 的时候,尽量不要使用第三方模块,如果在无法避免的情况下,请认真填写 install_requires 字段,填写格式参考:《PoC 第三方模块依赖说明》
  2. 编写 PoC 的时候,尽量的使用 Pocsuite3 已经封装的 API 提供的方法,避免自己重复造轮子,对于一些通用方法可以加入到 API,具体参考《通用 API 列表》
  3. 如果 PoC 需要包含远程文件等,统一使用 Pocsuite3 远程调用文件,具体可以参考《Pocsuite3 远程调用文件列表》,不要引入第三方文件,如果缺少对应文件,可 GitHub 提交 PR。
  4. 每个 PoC 在编写的时候,尽可能的不要要求输入参数,这样定制化过高,不利于 PoC 的批量化调度执行,尽可能的 PoC 内部实现参数的构造,至少应该设置默认值,如某个 PoC 需要指定用户 id,那么应该允许使用自定义参数传入 id,也应该没有传入该参数的时候自动设置默认值,不应该影响 PoC 的正常运行与验证。
  5. 每个 PoC 在输出结果的时候,尽可能的在不破坏的同时输出取证信息,如输出进程列表,具体参考《PoC 结果返回规范》
  6. 为方便 PoC 管理,请认真填写 PoC 信息字段,其中 vulID 请填写 Seebug 上的漏洞 ID(不包含 SSV-)。
  7. 为了防止误报产生以及避免关键词被 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
  1. 任意文件读取如果需要知道网站路径才能读取文件的话,可以读取系统文件进行验证,要写 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)

  1. 检测模式下,上传的文件一定要删掉。
  2. 程序可以通过某些方法获取表前缀,just do it;若不行,保持默认表前缀。
  3. PoC 编写好后,务必进行测试,测试规则为:5 个不受漏洞影响的网站,确保 PoC 验证不成功;5 个受漏洞影响的网站,确保 PoC 验证成功

Released under the GPLv2 License.