0x00 前言
这片博文将简单的介绍我编写的 PHP 运行时漏洞检测系统 prvd 的检测逻辑, 以及该系统在实际测试中的效果。
0x01 基本知识
在这里我们先介绍几个常用的词语:
- source数据来源点,可以是:
- 网络,例如常规的 Web 参数等
- 文件系统
- 数据库
- 等等其他用户可控或者间接可控的地方
- filter数据过滤处理点,可以是: - 编码解码,例如 base64_decode 等
- 常规字符串操作,例如 strtolower 等
- 安全过滤,例如 mysqli_escape_string 等
- 等等其他会更改字符串内容的地方
- sink漏洞触发点,可以是: - 操作文件相关行为,例如 file_put_content 等
- 操作网络相关函数,例如 curl 等
- 操作命令相关行为,例如 system 等
- 等等其他危险行为
有些地方既可以是 source 点,也可以是 sink 点,比如说 file_put_content 在参数可控的时候是 sink
点,因为返回的数据也是我们可控的,这里返回的数据也是 source 点。
0x02 xmark
我们先简单地介绍一下 xmark,这是一个 PHP7 扩展,能够直接使用 PHP 代码做到:
- 对字符串变量进行打标记
- Hook 绝大多数函数/类
- Hook 部分 opcode
基于 xmark 所提供的功能,即便是我们不熟悉 PHP 内部实现,我们也能够很简单的去实现:
- PHP RASP
- PHP 解密工具,例如 phpdecoder
- PHP 运行时漏洞检测
- …
因为 PHP 并不像 Python、Ruby 等其他语言可以很方便的 Hook 函数、类,所以我们开发了这么一个扩展来完成类似的功能。
实际上 xmark 这个项目有不少代码是直接拷贝 taint 的, 那为什么要改这样一个轮子呢?
- taint 的 source 点覆盖不全面&