在代码审计审核这类漏洞的时候,需要注意以下几个函数:
include(),include_once(),require(),require_once()
通常根据这几个函数,来回溯变量,检查变量是否过滤完全。若没有进行过滤,就可能存在安全隐患。
本地文件包含
本地包含通常有以下几种利用方式:
1.上传代码执行文件,利用本地文件包含漏洞来执行代码。
2.将请求url中,加入要执行的代码,然后本地包含WebServer的日志,执行代码。
3.linux环境下可以包含/proc/self/environ
远程文件包含
在代码审计中,远程文件包含这个漏洞出现的概率并不会太大。但是比本地文件包含更容易利用。
可能出现这个漏洞的前提是:必须开启了allow_url_include=on
通常远程文件包含的利用方式和本地包含一样。但是远程文件包含自己还有一种输入输出流的利用方式:
文件包含截断:
文件包含的时候,程序代码部分往往都是有后缀的,比如开发者从前端获得一个文件名,他往往会在代码中加上.php这样的后缀。假如,我们上传的文件不是.php文件,那么若想包含成功,就必须用到截断。
%00截断
在php版本为5.3之后,就没有这种漏洞了。并且,即使在5.3之前,这个%00截断也受限于GPC过滤,addslashes过滤
多个.和多个/截断
在PHP5.3之前,利用这个多个.和/也是可以截断的。而且这种方式不受GPC限制。
windows环境,240个点可以截断,或者240个./可以截断。linux环境是2048个才可以。
利用?进行伪截断
这种截断方式不受GPC和PHP版本限制。原理就是webserver将问号后面的数据当做是参数,因此可以实现截断。
文件读取漏洞
产生原因:用户请求某个文件的读取,程序没有对请求的参数进行过滤,导致任意文件读取。
代码审计方法:
可以先进行黑盒查看功能点对应的文件,在去读相关的文件,这样找的比较快。另外,就是在代码中寻找读取文件的函数,逆向追踪相关变量,找出没有过滤的变量。
文件读取函数有:
file_get_contents() , highlight_file() , fopen() , readfile() , fread() , fgetss() , fgets() , parse_ini_file() , show_source() , file()
同时,include也可能存在文件读取漏洞。还有一种我不太懂的,php输入输出流php://filter/来读取文件。
文件上传漏洞
文件上传漏洞很好理解,就是没有过滤好。开发者在写这部分功能的时候,通常要么是利用框架写,要么是利用上传函数写。因此代码审计的时候只要搜索move_upload_file()这个函数,再去看代码是否限制上传格式,是否可以绕过。
未过滤或本地过滤
未过滤就是什么文件都能上传成功。本地过滤就是截获数据包,修改就可以上传成功。
黑名单过滤
缺点,限制扩展名不够全
还有就是容易被绕过。
比如程序过滤的时候,在前端提取的是是php+空格为后缀,程序与过滤规则进行匹配,规则中有php,但是没有空格,那么就不匹配了。另外还有%00截断。
任意文件删除漏洞
任意文件删除漏洞和读取原理一样,只不过函数变成了删除函数。
补充几个常见函数: