第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
,可以使服务器在处理文件名时,误以为空字节后的内容不存在,从而达到绕过验证的目的。
攻击步骤
- 准备恶意文件:
创建一个简单的PHP木马文件,例如 shell.php
,内容如下:
<?php phpinfo(); ?>
- 上传文件
上传shell.php
用BP抓包修改参数,然后修改后的结果为如下图所示:
在
../upload/
路径下加上shell.php+
+号
是为了方便后面修改Hex
+号
的Hex是2b
,这里我们要把它改为00
,如下图所示:
- 验证上传:
文件上传成功后,通过拷贝上传路径,如下图所示:
访问上传后的文件,例如 http://localhost/shell.php
,验证PHP代码是否被执行。如果成功,你将看到如下图的输出。
总结
Upload-Lab
第13关的%00截断法提供了一个典型的文件上传漏洞绕过示例,通过理解和掌握这种技术,安全研究人员可以更好地识别和防御实际应用中的类似漏洞。同时,开发者也应注意采取多层防御措施,确保应用的安全性。