测试空字节漏洞

问题描述:

我正在帮助我的朋友完成他的网站模块。从我对模块的第一印象中,我发现了一些非常危险的东西,但他说这种方法是安全的。代码的测试空字节漏洞

部分:

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));

但是这些方法都没有奏效。该代码是否真的安全?以及如何发送一个空字节来绕过它的安全性。我想向我的朋友证明他的代码不安全。

+0

我不是一个PHP专家,所以我将这个留作评论,但是不能传递类似“../../”的内容。 ./../“并获得对文件系统的任意访问权限? – 2013-05-03 19:42:33

+0

@ChrisThompson它在最后有“/bar.php”,所以它会在所有情况下检查../../../bar.php – John 2013-05-03 19:44:21

+0

没问题,所以如果你有可能访问_some other_,酒吧。php'文件,你不应该访问 – 2013-05-03 19:45:35

我发现this解决方案,总之,似乎你的代码有点脆弱,消毒方法是这样的:

有许多的方法来防止内毒空字节注射PHP。这些包括一个反斜杠空字节,但是,这样做最值得推荐的方法是使用类似于下面的代码完全删除字节:

$foo['foo']= str_replace(chr(0), '', $foo['foo']); 

我也没有一个专家空字节攻击,但这是有道理的。 更多详情here

+1

当从'$ _POST'将值保存到会话中时,OP甚至应该替换空字节字符!这可以防止后续和不安全地重复使用'$ _SESSION ['foo']''。 – ComFreek 2013-05-03 20:21:46

Php对于空字节非常麻烦....因为PHP是建立在c上的。 在c空字节意味着字符串的结尾。

您应该删除您使用的每个字符串上的空字节。 这对于基于IO的函数(如include和move_uploaded_file)更为重要。

即使(int)的 “1 \ 01” 是vurnable因为它转换为int 1个

PHP函数可以处理空字节是例如

str_replace函数 strpos 即使在strlen的

数据库查询。 Mysql可以在char,varchar和text列上空字节

+1

这不再适用于PHP 5.3.4及更高版本。 (这是所有当前版本。) – duskwuff 2013-05-17 17:32:47

+0

其实,这里的一些后续的东西只是错误的。 PHP的字符串处理函数(比如'strlen()')在包含空字节的字符串上工作得很好,就像MySQL一样。 – duskwuff 2013-05-17 17:35:28

+0

感谢您的-1继续甚至PHP 5.4的包括功能将打破一个空字节并运行选择“你好\ 0其中”然后你会看到.. – 2013-05-17 17:41:25