PHP自动化白盒审计技能与完成
国内揭露的PHP自动化审计技能资料较少,相比之下,国外现已呈现了比较优异的自动化审计完结,比方RIPS是依据token流为根底进行一系列的代码剖析。传统静态剖析技能如数据流剖析、污染传达剖析应用于PHP这种动态脚本语言剖析相对较少,可是却是完结白盒自动化技能中比较要害的技能点。今日笔者首要介绍一下最近的研讨与完结作用,在此抛砖引玉,期望国内更多的安全研讨人员将精力投入至PHP自动化审计技能这一有意义的领域中。
0x01 根底常识
自动化审计的完结办法有多种,比方直接运用正则表达式规矩库进行定位匹配,这种办法最简略,可是准确率是最低的。最牢靠的思路是结合静态剖析技能领域中的常识进行规划,一般静态剖析安全东西的流程大多是下图的方式:
静态剖析作业所要做的第一件作业便是将源码进行建模,浅显一点讲,便是将字符串的源码转为便利于咱们后续缝隙剖析的中心表明方式,即一组代表此代码的数据结构。建模作业中一般会选用编译技能领域中的办法,如词法剖析生成token,生成笼统语法树,生成操控流程图等。建模作业的好坏,直接影响到后续污染传达剖析和数据流剖析的作用。
履行剖析便是结合安全常识,对载入的代码进行缝隙剖析和处理。最终,静态剖析东西要生成判别成果,然后完毕这一阶段的作业。
0x02 完结思路
通过一段时间的尽力,笔者和小伙伴也大致完结了一款针对自动化的静态剖析东西。详细完结思路正是选用了静态剖析技能,假如想深化了解完结思路,能够阅览之前发过的文章。 在东西中,自动化审计流程如下:
首要载入用户输入的待扫描的工程目录中一切的PHP文件,并对这些PHP文件做判别,假如扫描的PHP文件是Main file,即实在处理用户恳求的PHP文件,那么对这品种型的文件进行缝隙剖析。假如不是Main file类型,比方PHP工程中的类界说,东西函数界说文件,则越过不做剖析。
其次进行大局数据的搜集,要点搜集的信息有待扫描的工程中类信息的界说,如类地点的文件途径、类中的特点、类中的办法以及参数等信息。一起对每个文件生成文件摘要,文件摘要中要点搜集各个赋值句子的信息,以及赋值句子中相关变量的净化信息和编码信息。
大局初始化之后,进行编译前端模块的相关作业,运用开源东西PHP-Parser对待剖析的PHP代码进行笼统语法树(AST)的构建。在AST的根底上,运用CFG构建算法构建操控流图,并实时地生成基本块的摘要信息。
编译前端的作业中,假如发现灵敏函数的调用,就停下来进行污染传达剖析,进行进程间剖析、进程内剖析,找到对应的污点数据。然后依据数据流剖析进程中搜集的信息,进行净化信息和编码信息的判别,然后判别是否为缝隙代码。
假如上一步是缝隙代码,则转入缝隙陈述模块进行缝隙代码段的搜集。其完结的根底是在体系环境中保护一个单例形式的成果集上下文目标,假如生成一条缝隙记载,则参加至成果会集。当整个扫描工程成果之后,运用Smarty将成果集输出到前端,前端做扫描成果的可视化。
0x03 初始化作业
在实在的PHP审计中,遇到灵敏函数的调用,比方mysql_query,咱们就会情不自禁地去手动剖析第一个参数,看是否可控。事实上,许多CMS都会将一些数据库查询的办法进行封装,使得调用便利且程序逻辑明晰,比方封装为一个类MysqlDB。这时,在审计中咱们就不会搜索mysql_query要害字了,而是去找比方db->getOne这品种的调用。
那么问题来了,在自动化程序进行剖析的时分,怎么获悉db->getOne函数是个数据库的拜访类办法呢?
这就需求在自动化剖析的初期就要对整个工程的一切类与界说的办法进行搜集,以便于程序在剖析的时分寻觅需求跟进的办法体。
关于类信息和办法信息的搜集,应该作为结构初始化的一部分完结,存储在单例上下文中:
一起,需求辨认剖析的PHP文件是否是实在处理用户恳求的文件,因为有些CMS中,一般会将封装好的类写入独自的文件中,比方将数据库操作类或许文件操作类封装到文件中。关于这些文件,进行污染传达剖析是没有意义的,所以在结构初始化的时分需求进行辨认,原理很简略,剖析调用类型句子和界说类型句子的份额,依据阈值进行判别,错误率很小。
最终,对每个文件进行摘要操作,这一步的意图是为了后续剖析时碰到require,include等句子时进行文件间剖析运用。首要搜集变量的赋值、变量的编码、变量的净化信息。
0x04 用户函数处理
常见的web缝隙,一般都是因为风险参数用户可控导致的,这种缝隙称之为污点类型缝隙,比方常见的SQLI,XSS等。 PHP内置的一些函数自身是风险的,比方echo可能会形成反射型XSS。但是实在代码中,没人会直接调用一些内置的功用函数,而是进行再次封装,作为自界说的函数,比方:
1
2
3
4
function myexec($cmd)
{
exec($cmd) ;
}
在完结中,咱们的处理流程是:
使用初始化中获取的上下文信息,定位到相应的办法代码段
剖析这个代码片段,查找到风险函数(这里是exec)
定位风险函数中的风险参数(这里是cmd)
假如在剖析期间没有遇到净化信息,阐明该参数能够进行感染,则映射到用户函数myexec的第一个参数cmd,并将这个用户自界说函数作为风险函数寄存至上下文结构中
递归回来,发动污点剖析进程
[1] [2] 黑客接单网