7

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

部分代码:

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/test/bar.php)存在;

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

POST :: foo => test/bar.php%00

POST :: foo => test/bar.php\0

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

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

4

2 回答 2

5

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

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

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

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

于 2013-05-03T19:54:11.513 回答
-2

对于 Null 字节,Php 非常容易使用......因为 php 是基于 c 构建的。在 ca 中,空字节表示字符串的结尾。

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

甚至 (int)"1\01" 也是 vurnable,因为它强制转换为 int 1

例如,可以处理 Null 字节的 PHP 函数

str_replace strpos strlen

即使在数据库查询上。Mysql 可用于 char、varchar 和 text 列上的 Null 字节

于 2013-05-17T17:26:57.763 回答