直接看代码进行代码审计,相关的函数我已经做了注释
<?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 = '上传出错!'; } } ?>
分析代码可得到文件上传的逻辑,但是此处是存在逻辑漏洞的,在我们进行文件上传时,服务器先进行文件上传操作,后判断我们上传的文件合不合法,这样我们上传的后门文件只要连接的快,那么服务器就来不及删除它。其原理就是,在我们进行文件读写操作时,是不能删除该文件的。
上传我们的php文件后门,抓取数据包
将得到的数据包发送到intruder模块中,选取UA头进行爆破(修改UA头部对数据包无影响),其实就是不断上传数据包,然后在服务器删除之前连上这个php后门,那么服务器就删除不了我们上传的后门了
设置爆破类型,Start Attack
成功上传文件
https://www.bilibili.com/video/BV1JZ4y1c7ro?t=4392&p=21