前言:
条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。
2.典型的代码(“引狼入室”)
$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 = '上传出错!';
}
}
这段代码的思路:当服务器接收到上传文件请求后,保存为临时文件,将它存入系统,然后再对其进行判定是否符合白名单要求,若符合要求则进行重命名移动,若不符合则再将该文件删除。
3.条件竞争,“竞争”二字就体现出来了,因为我们上传的文件,它是在文件目录里存在过的,但是不符合要求被删除掉了,中间有段时间是服务器检测文件是否符合要求的时间,我们可以利用这一段时间,赶在上传的恶意文件被删除之前就要访问到它。这就需要发送大量的并发请求。
实验演示:
第一步:上传一个.php类型文件,发现被禁止,提示我们只能上传图片类型的文件。
第二步:在上传一个10.jpg文件,利用它的GET请求修改文件名后,不断向服务器发送请求。找到99.php的 POST /my-account/avatar 文件上传的请求,将两者发送到 Intruder。
1.POST /my-account/avatar,设置过滤器查找到这个请求,发送到Intruder
这里选择“无负载”,让它一直发送。请求引擎里线程数我设置的是10.
2.GET /files/avatars/10.jpg,修改文件名为99.php,设置同上的有效载荷
第三步:然后点“开始攻击”,注意GET请求里的“200”响应.
这里在文件99.php被删除之前,利用GET请求不断访问,使得我们预期输入的语句被执行,并且返回结果给我们
将密码提交,实验完成!
如何防止文件上传漏洞
- 根据允许扩展名的白名单而不是禁止扩展名的黑名单检查文件扩展名。
- 确保文件名不包含任何可能被解释为目录或遍历序列 ( …/) 的子字符串。
- 重命名上传的文件以避免可能导致现有文件被覆盖的冲突。
- 在完全验证之前不要将文件上传到服务器的永久文件系统。
- 尽可能使用已建立的框架来预处理文件上传,而不是尝试编写自己的验证机制。
文中可能有的地方说的不对,还希望各位大佬多多保函,给予改正,万分感谢!