无名 发表于 2022-5-8 17:37:30

【MX】PHP 运行时漏洞检测(上)

这个帖子将简单的介绍我编写的 PHP 运行时漏洞检测系统 prvd 的检测逻辑, 以及该系统在实际测试中的效果。

在这里我们先介绍几个常用的词语:

source数据来源点,可以是:
网络,例如常规的 Web 参数等
文件系统
数据库
等等其他用户可控或者间接可控的地方
filter数据过滤处理点,可以是:
编码解码,例如 base64_decode 等
常规字符串操作,例如 strtolower 等
安全过滤,例如 mysqli_escape_string 等
等等其他会更改字符串内容的地方
sink漏洞触发点,可以是:
操作文件相关行为,例如 file_put_content 等
操作网络相关函数,例如 curl 等
操作命令相关行为,例如 system 等
等等其他危险行为
有些地方既可以是 source 点,也可以是 sink 点,比如说 file_put_content 在参数可控的时候是 sink 点,因为返回的数据也是我们可控的,这里返回的数据也是 source 点。
我们先简单地介绍一下 xmark,这是一个 PHP7 扩展,能够直接使用 PHP 代码做到:

对字符串变量进行打标记
Hook 绝大多数函数/类
Hook 部分 opcode
基于 xmark 所提供的功能,即便是我们不熟悉 PHP 内部实现,我们也能够很简单的去实现:

PHP RASP
PHP 解密工具,例如 phpdecoder
PHP 运行时漏洞检测

因为 PHP 并不像 Python、Ruby 等其他语言可以很方便的 Hook 函数、类,所以我们开发了这么一个扩展来完成类似的功能。

实际上 xmark 这个项目有不少代码是直接拷贝 taint 的, 那为什么要改这样一个轮子呢?

taint 的 source 点覆盖不全面,只对 GPC 进行标记
taint 处理和漏洞相关的逻辑需要在 PHP 扩展中实现
这里我不打算花太多篇幅介绍 xmark 的实现,直接看代码更方便,更多关于 xmark 的信息可以点https://github.com/fate0/xmark
前面说了基于 xmark 我们可以实现挺多好玩的事情, 这里我选择去完成一个 PHP 运行时漏洞检测系统,也就是 prvd 这个项目, 项目名也就是 PHP Runtime Vulnerability Detection 的缩写。

prvd 有两种模式,一种是 taint 模式, 另外一种是 payload 模式。taint 模式可以选择开启,payload 模式是一直都开启的。 这两种模式都依赖外部来解决执行路径的问题。

taint 模式
这种模式下 prvd 和 taint 一样,都是 source 打上一个标记,在某些 filter 中传递这个标记,然后在 sink 点检查对应的参数是否被打上标记。

比方说:
$cmd = $_POST['cmd'];
$cmd1 .= "fate0";
$cmd2 = strtolower($cmd1);
system($cmd2);
$_POST['cmd'] 一开始就被我们打上了标记,在自赋值的时候将标记传递给了 $cmd1, 在经历 strtolower 这个 filter 的时候继续将标记传递给了 $cmd2, $cmd2 最后进入 sink 点 system 函数的时候被检测被打上了标记,从而确定是否可能存在问题。

taint 模式可以不需要输入特定的 payload 进行攻击就可能发现一些漏洞点,也不会污染数据,但是在 filter 中判断是否应该继续传递标记比较难处理, 有可能数据已经经过了很好的过滤,但是我们还是继续传递了标记,最终导致误报。也有可能数据处理不当,但我们已经去除了标记,最终导致漏报。

我们举个漏报的例子:http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1591968694180825
可控变量 $id 经过 mysqli_real_escape_string 的时候需不需清除其标记呢?

为了解决这种情况,我编写了另外一种 payload 模式。

payload 模式
有时候追踪执行流并没有什么用,整那么多玩意,还不如直接一把梭哈,直接把 payload 打过去,然后在 sink 点观测, 这就是我们的 payload 模式,这个模式的 prvd 可以归类为 IAST 的一种。

[滑稽][滑稽]
http://cdn.u1.huluxia.com/g4/M03/6A/91/rBAAdl7jhAaAVWrkAAUwnmpujdc093.pnghttp://cdn.u1.huluxia.com/g4/M03/6A/91/rBAAdl7jhAeAZ-s9AACHFJIMM_I393.jpghttp://cdn.u1.huluxia.com/g4/M03/6A/91/rBAAdl7jhAeAOtaxAACAVgZ3B-Q238.jpg
页: [1]
查看完整版本: 【MX】PHP 运行时漏洞检测(上)