文件包含漏洞利用

本文内容来自蚁景网安课程。

读取系统敏感/配置文件

方式一

直接读取

http://example.com/file.php?file=/etc/passwd
http://example.com/file.php?file=../../../../../../../etc/passwd

方式二

file://协议读取

本地文件传输协议,用于访问本地计算机中的文件。好比通过Windows的资源管理器中打开文件或者通过右键单击"打开"一样。

格式:file:///filepath

http://example.com/file.php?file=file:////etc/passwd

限制条件:无限制

方式三

php://filter协议

主要用于读取源码,由于PHP文件会被解析无法看到文件内容,因此可以用此协议读取源码。

php://filter/read=convert.base64-encode/resource=include.php

限制条件:无限制

php://filter过滤器

字符串过滤器

string.rot13 进行rot13转换

string.toupper 将字符全部大写

string.tolower 将字符全部小写

string.strip_tags 去除空字符、HTML和PHP标记后的结果

转换过滤器

convert.base64-encode base64编码

convert.base64-decode base64解码

convert.quoted-printable-encode quoted-printable 编码(也是另一种将二进制进行编码的方案)

conbert.quoted-printable-decode quoted-printablr 解码

convert.iconv 实现任意两种编码之间的转换

压缩过滤器

zlib.deflate 压缩过滤器

zlib.inflate 解压过滤器

bzip2.compress 压缩过滤器

bzip2.decompress 解压过滤器

加密过滤器

mcrypt.* 加密过滤器

mdecrypt *解密过滤器

包含上传文件获取服务器权限

方式一

直接包含上传的图片文件

格式:

http://example.com/index.php?file=upload/1.jpg

方式二

zip://、bzip2://、zlib://协议,都属于压缩流,可以访问压缩文件中的子文件。

格式:

http://example.com/index.php?file=zip://绝对路径/xx.zip%23被压缩的文件

优缺点

优点:可以绕过包含的固定后缀。

缺点:需要知道文件的绝对路径、PHP的版本大于5.3.0。

限制条件:无限制。

方式三

phar://协议,类似于zip协议,但是可以使用相对路径。

格式:

http://example.com/file.php?file=phar://[压缩文件绝对/相对路径]/[压缩文件内的子文件名]

优缺点

优点:可以绕过包含的固定后缀。

缺点:需要PHP的版本大于5.3.0。

限制条件:无限制。

其他协议

文件包含漏洞及PHP伪协议

文件包含漏洞的防御

设置白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。

路径限制:限制被包含的文件只能在某一文件夹内,PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅在该目录内搜索文件。

关闭危险配置:PHP配置中的allow_url_include选项如果打开,PHP会通过include()或require()进行文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认关闭。

过滤危险字符:严格检查用户输入,参数中不允许出../之类的目录跳转符。

尽量不要使用动态包含:可以在需要包含的页面固定写好,如:include('head.php')。