payload 模式相比 taint 模式,优点为:
误报率比 taint 模式低,使用 payload 模式,从技术上完全把误报率降低到 1% 以下
可以不关注 source 点和 filter 点,这样即使数据经历多次中转,最后经过 sink 点的漏洞,也有能力去检测,比如说多阶 SQL 注入的情况
缺点为:
漏报率可能会比 taint 模式下高,因为可能经过各种 filter 的时候就被 payload 就会拦截下来,也可能需要特定 payload 才能触发漏洞
需要特别关注 sink 点,在 sink 点中根据各种条件判断是否为漏洞
会污染数据
下面简单的介绍一下在 payload 模式下,各种漏洞的检测方法:http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591968934833895
我知道上面的各种检测方式并不完美,每个漏洞的检测方法都有误报和漏报的情况,不过现阶段还是够用的,可以以后继续完善。
fuzzer
这里我使用 Python 写了一个比较简单的 fuzzer 放在项目 tools 目录下,目前也只是对每个 source 点增加一个 '">./../xtanzi 这样的 payload
这个 fuzzer 的 DSN 地址为 http://admin:password@ip:9090/fuzz
这里也可以根据自己的情况,重新编写 fuzzer。
Sentry 漏洞展示
至此,我们还缺少一个漏洞上报的平台,我们希望这个平台能够:
良好的权限管理,拥有的 group、project 等功能
收集到漏洞触发时的请求信息
收集到漏洞触发时的堆栈信息
能够对多个同堆栈下的重复漏洞进行去重
能够一键提交 jira 以及 git issue
各种统计功能
…
天啊,需求越来越多,我们的精力更多的被分配到了这个平台上了,请不要忘了我们本意是要做一个 PHP 运行时漏洞检测系统。 上报平台虽然重要,但不应该成为整套系统花费精力最多的部分,我们需要把时间放在漏洞检测这块。
这个时候我想起了 Sentry
Sentry is cross-platform application monitoring, with a focus on error reporting.
Sentry 本来是一个跨平台应用的异常报告系统,但在我们这套 PHP 运行时漏洞检测系统中被使用为漏洞上报平台了,理由是:
支持上面提到的需求
界面美观
DRY
我们的 prvd 可以说是 Sentry 的一个检测漏洞的 Client,只不过 prvd 的功能不是报告异常,而是报告漏洞, 由于 Sentry 支持多种语言,所以我们不仅可以给 PHP 写这样一个 Client,还可以给 Python, Ruby 等其他语言写这样检测漏洞的 Client
最后,我们拿 DedeCMS 作为测试例子,看看 prvd 的效果如何。
安装环境
首先在 dede/config.php 修改 csrf_check 函数让其直接返回 true,其次执行下面命令启动 fuzzer:python prvd/tools/fuzzer.py
然后前往 Sentry 注册一个账号,或者自建一套 Sentry 服务
剩下的可以直接使用 docker
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591969040401800
因为 taint 模式误报会比较多(taint 模式出来的漏洞在 Sentry 上会以蓝色标注),我也并不打算花时间去 review 详情,所以这里我只启用了 payload 模式。
检测过程
每个功能点都乱点一下,每个输入框都随便写写,尽量每个功能都能够瞎点瞎填覆盖到。
DedeCMS 相关漏洞中