测试空字节漏洞
问题描述:
我正在帮助我的朋友完成他的网站模块。从我对模块的第一印象中,我发现了一些非常危险的东西,但他说这种方法是安全的。代码的测试空字节漏洞
部分:
session_start();
if(isset($_POST['foo']))
{
$_SESSION['foo'] = $_POST['foo'];
}
if(isset($_SESSION['foo']))
{
$foo['foo'] = $_SESSION['foo'];
}
if(is_file("inc/". $foo['foo'] . "/bar.php")) {
// code
}
else {
// code
}
注:文件(INC /测试/ bar.php)存在;
我想测试自己的代码,我发送了以下请求:
POST :: foo的=>测试/ bar.php%00
POST :: foo的=>测试/ bar.php \ 0
curl_setopt($ ch,CURLOPT_POSTFIELDS,'foo = test/bar.php'.chr(0x00));
但是这些方法都没有奏效。该代码是否真的安全?以及如何发送一个空字节来绕过它的安全性。我想向我的朋友证明他的代码不安全。
答
Php对于空字节非常麻烦....因为PHP是建立在c上的。 在c空字节意味着字符串的结尾。
您应该删除您使用的每个字符串上的空字节。 这对于基于IO的函数(如include和move_uploaded_file)更为重要。
即使(int)的 “1 \ 01” 是vurnable因为它转换为int 1个
PHP函数可以处理空字节是例如
str_replace函数 strpos 即使在strlen的
数据库查询。 Mysql可以在char,varchar和text列上空字节
我不是一个PHP专家,所以我将这个留作评论,但是不能传递类似“../../”的内容。 ./../“并获得对文件系统的任意访问权限? – 2013-05-03 19:42:33
@ChrisThompson它在最后有“/bar.php”,所以它会在所有情况下检查../../../bar.php – John 2013-05-03 19:44:21
没问题,所以如果你有可能访问_some other_,酒吧。php'文件,你不应该访问 – 2013-05-03 19:45:35