PHP任意文件上传漏洞(CVE-2015-2348)

这个漏洞只有当只有在$name是POST、GET变量时才可以触发。所以漏洞比较鸡肋。当然不排除有些程序员会这个写。
因为如果文件名称是用$_FILES[“file”][“name”]来读出的话,已经是截断后的内容了。
我们来测试一下
PHP程序如下:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"]. "<br />";
  $allow_file = explode("|", "gif|jpg|png"); //允许上传的文件类型组
  $new_upload_file_ext = strtolower(end(explode(".", $_FILES["file"]["name"]))); //取得被.隔开的最后字符串
  if (!in_array($new_upload_file_ext,$allow_file)){ //如果不在组类,提示处理
      echo "$new_upload_file_ext: False ext";      
  }
  }
?>

然后我们上传一个文件1.php,截断数据包添加%00.jpg,然后将%00解码

123

可以看到返回的结果中Upload: 1.php,说明使用$_FILES获取到的上传文件名已经是截断后的,所以还是无法突破扩展名的检测。所以我们改一下程序:

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
#  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  $filename = $_REQUEST['filename'];
  $allow_file = explode("|", "gif|jpg|png"); //允许上传的文件类型组
  $new_upload_file_ext = strtolower(end(explode(".", $filename))); //取得被.隔开的最后字符串
  if (!in_array($new_upload_file_ext,$allow_file)){ //如果不在组类,提示处理
      echo "$new_upload_file_ext: False ext";      
  }
  else {
  	echo "$new_upload_file_ext: Success ext"; 
  }
  }
?>

然后测试一下:

123