(进阶)代码审计文件包含漏洞

在代码审计审核这类漏洞的时候,需要注意以下几个函数:

include(),include_once(),require(),require_once()

通常根据这几个函数,来回溯变量,检查变量是否过滤完全。若没有进行过滤,就可能存在安全隐患。

本地文件包含

本地包含通常有以下几种利用方式:

1.上传代码执行文件,利用本地文件包含漏洞来执行代码。

2.将请求url中,加入要执行的代码,然后本地包含WebServer的日志,执行代码。

3.linux环境下可以包含/proc/self/environ

远程文件包含

在代码审计中,远程文件包含这个漏洞出现的概率并不会太大。但是比本地文件包含更容易利用。

可能出现这个漏洞的前提是:必须开启了allow_url_include=on

通常远程文件包含的利用方式和本地包含一样。但是远程文件包含自己还有一种输入输出流的利用方式:

(进阶)代码审计文件包含漏洞_第1张图片

文件包含截断:

文件包含的时候,程序代码部分往往都是有后缀的,比如开发者从前端获得一个文件名,他往往会在代码中加上.php这样的后缀。假如,我们上传的文件不是.php文件,那么若想包含成功,就必须用到截断。

%00截断

在php版本为5.3之后,就没有这种漏洞了。并且,即使在5.3之前,这个%00截断也受限于GPC过滤,addslashes过滤

(进阶)代码审计文件包含漏洞_第2张图片

多个.和多个/截断

在PHP5.3之前,利用这个多个.和/也是可以截断的。而且这种方式不受GPC限制。

windows环境,240个点可以截断,或者240个./可以截断。linux环境是2048个才可以。

(进阶)代码审计文件包含漏洞_第3张图片

利用?进行伪截断

这种截断方式不受GPC和PHP版本限制。原理就是webserver将问号后面的数据当做是参数,因此可以实现截断。

(进阶)代码审计文件包含漏洞_第4张图片

文件读取漏洞

产生原因:用户请求某个文件的读取,程序没有对请求的参数进行过滤,导致任意文件读取。

代码审计方法:
可以先进行黑盒查看功能点对应的文件,在去读相关的文件,这样找的比较快。另外,就是在代码中寻找读取文件的函数,逆向追踪相关变量,找出没有过滤的变量。

文件读取函数有:
file_get_contents() , highlight_file() , fopen() , readfile() , fread() , fgetss() , fgets() , parse_ini_file() , show_source() , file()

同时,include也可能存在文件读取漏洞。还有一种我不太懂的,php输入输出流php://filter/来读取文件。

文件上传漏洞

文件上传漏洞很好理解,就是没有过滤好。开发者在写这部分功能的时候,通常要么是利用框架写,要么是利用上传函数写。因此代码审计的时候只要搜索move_upload_file()这个函数,再去看代码是否限制上传格式,是否可以绕过。

未过滤或本地过滤

未过滤就是什么文件都能上传成功。本地过滤就是截获数据包,修改就可以上传成功。

黑名单过滤

缺点,限制扩展名不够全

(进阶)代码审计文件包含漏洞_第5张图片

还有就是容易被绕过。

比如程序过滤的时候,在前端提取的是是php+空格为后缀,程序与过滤规则进行匹配,规则中有php,但是没有空格,那么就不匹配了。另外还有%00截断。

任意文件删除漏洞

任意文件删除漏洞和读取原理一样,只不过函数变成了删除函数。

补充几个常见函数:

(进阶)代码审计文件包含漏洞_第6张图片


(进阶)代码审计文件包含漏洞_第7张图片


(进阶)代码审计文件包含漏洞_第8张图片
有感叹号!


(进阶)代码审计文件包含漏洞_第9张图片

你可能感兴趣的:((进阶)代码审计文件包含漏洞)