测试空字节漏洞

时间:2013-05-03 19:36:42

标签: php security

我正在帮助我的朋友完成他的网站模块。从我第一次看到他的模块的印象,我发现了一些非常危险的东西,但他说这种方法是安全的。

部分代码:

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
  }

注意:file(inc / test / bar.php)存在;

我想测试他的代码,我发送了以下请求:

POST :: foo =>测试/ bar.php%00

POST :: foo =>测试/ bar.php \ 0

curl_setopt($ ch,CURLOPT_POSTFIELDS,'foo = test / bar.php'.chr(0x00));

但这些方法都没有奏效。这段代码真的安全吗?怎么可能有人发送空字节来绕过它的安全性。我想向我的朋友证明他的代码不安全。

2 个答案:

答案 0 :(得分:5)

我找到了this解决方案,简而言之,您的代码似乎有点脆弱,并且清理方法是这样的:

  

有许多方法可以防止PHP中的Poison Null Byte注入。这些包括使用反斜杠转义NULL字节,但是,最推荐的方法是使用类似于以下代码完全删除字节:

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

我也不是空字节攻击的专家,但这是有道理的。 更多细节here

答案 1 :(得分:-3)

Php对Null字节非常有用....因为php是在c上构建的。 在c中,空字节表示字符串的结尾。

您应该删除您使用的每个字符串上的Null字节。 这在基于IO的函数(如include en move_uploaded_file。

)上更为重要

偶数(int)“1 \ 01”是可转换的,因为它转换为int 1

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

str_replace函数 strpos strlen的

即使在数据库查询中也是如此。 Mysql可以在char,varchar和text列上用于Null字节