环境
- phpstudy
- upload-labs,Pass-18
条件竞争文件上传的原理
直接看代码进行代码审计,相关的函数我已经做了注释
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$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'];
// 查找"."在文件名中出现的最后一个位置,然后位置+1,返回后面的内容
// 其实就是截取文件的后缀名
$file_ext = substr($file_name,strrpos($file_name,".")+1);
// 文件上传的位置
$upload_file = UPLOAD_PATH . '/' . $file_name;
// 判断temp文件是否是合法的文件(通过PHP函数 POST方法上传的文件),如果是的话,将其移动到upload_file处
// 其实这步没啥用,类似于开头的if函数,如果点击submit就运行代码这样子
if(move_uploaded_file($temp_file, $upload_file)){
// 如果后缀名在ext_arr里面的话,那么上传,并且重命名文件
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 = '上传出错!';
}
}
?>
分析代码可得到文件上传的逻辑,但是此处是存在逻辑漏洞的,在我们进行文件上传时,服务器先进行文件上传操作,后判断我们上传的文件合不合法,这样我们上传的后门文件只要连接的快,那么服务器就来不及删除它。其原理就是,在我们进行文件读写操作时,是不能删除该文件的。
upload-labs less-18 演示
上传我们的php文件后门,抓取数据包
将得到的数据包发送到intruder模块中,选取UA头进行爆破(修改UA头部对数据包无影响),其实就是不断上传数据包,然后在服务器删除之前连上这个php后门,那么服务器就删除不了我们上传的后门了
设置爆破类型,Start Attack
成功上传文件