7

我正在尝试在上传表单上重现空字节注入攻击。我有这个代码:

<?php
if(substr($_FILES['file']['name'], -3) != "php") { 
  if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']))
    echo '<b>File uploaded</b>';
  else
    echo '<b>Can not upload</b>';
}
else
  echo '<b>This is not a valid file/b>';
?>

我正在尝试上传一个像这样命名的文件:file.php%00jpg,因此它将绕过 substr() 并将作为 file.php 上传,因为 move_uploaded_file() 应该在空字节 (%00) 处停止。

问题是上传的文件在服务器上不是名为file.php,而是file.php%00jpg(可以在url栏中输入/file.php%2500jpg访问)。
看来 move_uploaded_file() 并不关心空字节,那么它是如何工作的呢?是否可以使用我的代码上传扩展名为 .php 的文件?

谢谢 :)。

4

1 回答 1

7

HTML 表单将文件名 urlencode 为 %2500,PHP 再次将其解码为 %00(百分号、零、零)。在任何地方的测试中都没有空字节,您必须使用实际的空字节命名文件(不可能)或手动处理 HTTP 请求,而不是使用 HTML 表单。尽管如此,当前的 PHP 版本并不容易受到这种攻击,PHP 在内部将变量装箱在一个所谓的 ZVal 容器中,并允许字符串中间的空字节没有任何影响。

于 2013-02-09T22:05:48.280 回答