常见的文件包含漏洞的形式为<?php include("inc/" . $_GET['file']); ?>
考虑常用的几种包含方式为
同目录包含file=.htaccess目录遍历?file=../../../../../../../../../var/lib/locate.db日志注入 ?file=../../../../../../../../../var/log/apache/error.log利用 /proc/self/environ其中日志可以使用SSH日志或者Web日志等多种日志来源测试
PHP
include
在包含过程中出错会报错,不影响执行后续语句include_once
仅包含一次require
在包含过程中出错,就会直接退出,不执行后续语句require_once
常见的应用在文件包含之前,可能会调用函数对其进行判断,一般有如下几种绕过方式
如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过
几乎是最常用的方法,条件是magic_quotes_gpc打开,而且php版本小于5.3.4。
Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes。
msdn定义#define MAX_PATH 260,其中第260个字符为字符串结尾的\0 ,而linux可以用getconf来判断文件名长度限制和文件路径长度限制。
获取最长文件路径长度:getconf PATH_MAX /root 得到4096 获取最长文件名:getconf NAME_MAX /root 得到255
那么在长度有限的时候,././././(n个) 的形式就可以通过这个把路径爆掉
在php代码包含中,这种绕过方式要求php版本 < php 5.2.8
allow_url_fopen和 allow_url_include主要是针对http ftp 两种协议起作用,因此可以使用SMB、WebDav协议等方式来绕过限制。
Exploit with PHP Protocols lfi cheat sheet