首页 > 编程源码 > PHP 运行时漏洞检测(上)

PHP 运行时漏洞检测(上)

楼主:资源分享 [官方] · 2020-6-12 ·  浏览780 · 编程源码 · ID:

这个帖子将简单的介绍我编写的 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 的一种。


- 版权声明 - 1、本帖所有言论和图片等纯属网友个人意见,与流星社区立场无关;
2、其他单位或个人使用、转载或引用本帖时必须同时征得该帖子作者资源分享流星社区的同意;
3、备注原文地址:https://bbs.liuxingw.com/t/30747.html,可忽略第2条;
4、帖子作者需承担一切因本文发表而直接或间接导致的相关责任;
5、如本帖内容或部分内容转载自其它媒体,这并不代表本站赞同其观点和对其真实性负责;
6、如本帖若为资源类,将仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您安装或使用的设备中彻底删除上述内容;
7、如果您喜欢该程序,请支持正版软件,购买注册,可以得到更好的正版服务;
8、如本帖侵犯到任何版权或违法问题,请立即邮件告知我们,我们将及时予以处理。
6条回复 |  最后回复于2020-6-13

资源分享 [官方]

发布于2020-6-12

回复列表

  • 内容加载中...

说点什么...

庄生ag [1级]

大佬大佬。
发布于2020-6-12

回复列表

  • 内容加载中...

说点什么...

青幼 [2级]

有什么不会的来问我,我帮你们百度
发布于2020-6-12

回复列表

  • 内容加载中...

说点什么...

资源分享 [官方]

发布于2020-6-12

回复列表

  • 内容加载中...

说点什么...

[]

我想学php
发布于2020-6-13

回复列表

  • 内容加载中...

说点什么...

资源分享 [官方]

加入MX
发布于2020-6-13

回复列表

  • 内容加载中...

说点什么...
登录注册 后才可进行评论
签到
6人签到
已签0天
  • 46568帖子
  • 1936064热点量
  • 184685火热值