PHP自动化白盒审计技术与实现


  本文标签:白盒审计 PHP PHP自动化审计


0x03 初始化工作

在 实在的PHP审计中,遇到敏感函数的调用, 比方mysql_query,我们就会 不禁自主地去手动 综合第一个参数,看是不是可控  。事实上,众多CMS都会将一些数据库 查问的 步骤进行封装,使得调用容易且程序逻辑清楚, 比方封装为一个类MysqlDB  。这时,在审计中我们就不会搜索mysql_query 要害字了,而是去找 比方db->getOne这 品种的调用  。

那么问题来了,在自动化程序进行 综合的时候,如何获知db->getOne函数是个数据库的 拜访类 步骤呢?

这就需求在自动化 综合的初期就要对整个工程的全部类与定义的 步骤进行 征集,以便于程序在 综合的时候寻觅需求跟进的 步骤体  。

关于类信息和 步骤信息的 征集,应该作为框架初始化的一 部分 实现,存储在单例上下文中:

同时,需求 鉴别 综合的PHP文件是不是是真正 解决消费者 申请的文件,由于有些CMS中,一般会将封装好的类写入 径自的文件中, 比方将数据库操作类或者文件操作类封装到文件中  。关于这些文件,进行 传染 流传 综合是没有 意思的,所以在框架初始化的时候需求进行 鉴别,原理很 容易, 综合调用类型语句和定义类型语句的比例,依据阈值进行 推断, 舛误率很小  。

最终,对每个文件进行摘要操作,这一步的 目标是为了后续 综合时碰到require,include等语句时进行文件间 综合 使用  。重要收集变量的赋值、变量的编码、变量的净化信息  。

0x04 消费者函数 解决

常见的web 漏洞,一般都是由于惊险参数消费者可控招致的,这种 漏洞称之为污点类型 漏洞, 比方常见的SQLI,XSS等  。 PHP内置的一些函数 本身是惊险的, 比方echo可能会造成反射型XSS  。然而 实在代码中,没人会直接调用一些内置的 性能函数,而是进行再次封装,作为自定义的函数, 比方:

1234function myexec($cmd)

{

exec($cmd) ;

}

在实现中,我们的 解决流程是:

利用初始化中猎取的上下文信息,定位到相应的 步骤代码段

综合这个代码片段,搜索到惊险函数(这里是exec)

定位惊险函数中的惊险参数(这里是cmd)

假如在 综合期间没有遇到净化信息, 注明该参数 可以进行传染,则映射到消费者函数myexec的第一个参数cmd,并将这个消费者自定义函数当做惊险函数 存放至上下文 构造中

递归返回,启动污点 综合过程

总结为一句话,我们便是跟入到相应的类 步骤、静态 步骤、函数中,从这些代码段中 查问是不是有惊险函数和惊险参数的调用,这些PHP内置的惊险函数和参数位置都是放在配置文件中的进行配置 实现的,假如这些函数和参数一旦被发现,且推断惊险参数并没有被过滤,则将该消费者自定义函数作为消费者自定义惊险函数  。一旦后续的 综合中发现调用这些函数,则马上启动污点 综合  。