文件包含截断
利用%00截断
%00截断受限于GPC和addslashes()等函数。也就是说在开启GPC或者使用过滤函数过滤的情况下不能使用,在PHP 5.3之后的版本全面修复了文件名%00截断的问题。
<?php
include $_GET['url'].'.php';
?>

当url参数被过滤时
%00被转义成了00两个单体字符,不再具有截断功能

利用./截断
利用多个./来截断,这种方式不受限于GPC,但是同样在PHP 5.3版本之后被修复。
在windows下使用240个点(
.)连接可以截断
<?php
$str = '';
for($i = 0; $i <= 240, $i++){
$str .= '.';
}
$str = '2.txt'.$str;
echo $str;
include $str.'.php';
?>

在windows下,
./共240个能够截断。
<?php
$str = '';
for($i = 0; $i <= 118, $i++){
$str .= './';
}
$str = '2.txt'.$str;
echo $str;
include $str.'.php';
?>

linux下需要2038个
./组合才能截断。
利用?伪截断
远程包含时利用问号?来截断,不受GPC和PHP版本的影响,只要能够返回代码给包含函数,它就能执行。
在HTTP协议中,访问http://remotehost/1.txt和访问httpL://remotehost/1.txt?.php的返回结果是一样的,因为这时候WebServer把?之后的内容当作是请求参数,而txt不在WebServer里面解析,参数对访问1.txt返回的内容不影响,于是就实现了伪截断。
<?php
echo $_GET['url'].'.php';
include $_GET['url'].'.php';
?>
