文件包含截断
利用%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';
?>