第13关概述

Upload-Lab第13关中,服务器会对上传的文件进行严格的扩展名检查。只有符合白名单的扩展名(如.jpg.png等)才能成功上传。我们的目标是绕过这种检查,将恶意文件(如.php)上传到服务器。以下是第13关的源码:

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单。

POST不会对里面的数据自动解码,需要在Hex中修改。

什么是%00截断法?

%00截断法,即Null Byte注入,是一种利用空字节(\x00)截断字符串的方法。在C/C++等编程语言中,字符串以空字节作为结束符。通过在文件名中插入%00,可以使服务器在处理文件名时,误以为空字节后的内容不存在,从而达到绕过验证的目的。

攻击步骤

  1. 准备恶意文件

创建一个简单的PHP木马文件,例如 shell.php,内容如下:

<?php phpinfo(); ?>
  1. 上传文件

上传shell.php用BP抓包修改参数,然后修改后的结果为如下图所示:

../upload/ 路径下加上shell.php+ +号是为了方便后面修改Hex

+号的Hex是2b,这里我们要把它改为00,如下图所示:
修改前

修改后

  1. 验证上传

文件上传成功后,通过拷贝上传路径,如下图所示:
返回上传文件路径
访问上传后的文件,例如 http://localhost/shell.php,验证PHP代码是否被执行。如果成功,你将看到如下图的输出。

总结

Upload-Lab第13关的%00截断法提供了一个典型的文件上传漏洞绕过示例,通过理解和掌握这种技术,安全研究人员可以更好地识别和防御实际应用中的类似漏洞。同时,开发者也应注意采取多层防御措施,确保应用的安全性。