函数设计出来就是让人使用的,之所以危险,是因为其功能过于强大.开发人员特别是刚从业的人员很少会完整阅读完整个文档,再或者是没有意识到当给这些函数传递一些非常规的,外部可控的参数会带来什么影响,所以踩坑的几率非常大.
所以在进行代码审计的时候,比较多的部分都是在审计调用这些危险函数的时候,参数是不是外部可控的.有没有进行正确的过滤.
2.1 能够执行任意代码的函数有三种:
2.2 常见能够读取网络资源的函数
常见能够读取网络资源的函数,审计点一般是发起网络请求时有无白名单,否则存在SSRF漏洞
2.3 能够执行系统命令或者调用外部程序的函数
能够执行系统命令或者调用外部程序的函数,这些函数使用不当容易引起命令注入,一般需要通常需要结合escapeshellcmd或escapeshellarg函数过滤传入的变量
2.4 能够操作文件(读写,移动,删除)的函数
能够操作文件(读写,移动,删除)的函数,在审计的时候也要注意传入的变量是否可控,是否存在穿越目录,导致任意文件读写的情况
2.5 能够修改运行时候的上下文环境(覆盖变量/函数)
脚本语言的特点就是灵活,所以语言本身的设计上有很多动态的设计,比如:动态类型,可变变量,可变函数。
3.1 动态类型
动态类型可能导致一些比较条件的时候绕过,比如true == 'a'这个条件在PHP里为真,动态类型带来的条件判断问题,很多开发者都会在上面踩坑,详细的规则可以看php的官方文档
http:// php.net/manual/zh/types .comparisons.php
3.2 可变变量
可变变量就是有2个$符号的变量,比如这2行代码,其实声明了3个变量,1个是$a,1个变量是$b,还有一个是$hello,之所以有$hello这个变量,是因为第3行的$$a,是把$a的值当成一个变量名使用.当$a的值可控的时候,就可以覆盖其它已经定义的变量,比如当$a的值是b的时候,第三行的$$a就会把$b的test覆盖成world.
3.3可变函数
可变函数就是一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它,比如这段代码会输出function hello
$a = 'hello';
function hello(){
echo 'function hello';
}
$a();
所以审计的时候也需要关注可变函数的变量是否可控。
对于敏感函数的审计点,无非就是参数是否可控,是否有严格的过滤,过滤方案是不是业界最优解,然后去回溯这些参数的调用过程,看看在哪一步没有过滤或者是过滤不严的地方.整个审计的过程是比较枯燥的,而且可能要审计很久能发现一个漏洞甚至是没有任何发现。
既然审计套路这么固定,肯定有一些现成的工具,下面就给大家介绍2款。
涨姿势的点赞集合哟~