利用竞争条件实现Webshell上传

题目

image-20261013174914550

考点

本关考的是竞争条件(RaceCondition):服务端会对上传的文件做”先检查后删除”,但检查和删除之间有一个短暂的时间窗口。只要在窗口期内不停地访问刚上传的webshell,就能让它被解析执行一次。核心思路:Burp并发发包,一边狂传一边狂访问。

开始打靶

首先上传一张正常的图片来获取到文件存储的路径

image-20261013175323168

由于根据题目我们知道这关是条件竞争,所以我们需要先构造好php代码,保存为hack.php

1
2
3
<?php
file_put_contents('ok.php','<?php echo file_get_contents("/home/carlos/secret"); ?>');
?>

这里的意思是读取文件内容的php代码写入到了ok.php文件中,由于目标存在条件竞争,所以在我们不断快速发包的过程中,hack.php这个文件会有短暂的存活时间,同时我们再去不断的访问hack.php,这样在我们访问到的同时服务器就会执行其中的代码,将文件写入ok.php当中。

我们先发包文件上传的包,载荷设置为空载荷无限重复

image-20261013180343735

然后去发包访问hack.php的包,同样也设置空载荷为无限重复

image-20261013180558661

我们可以看到访问hack.php的那个包,状态码为200,说明访问到了文件

image-20261013180643015

接下来我们访问ok.php,可以看到成功获取到了信息

image-20261013180710121

提交内容,通关

image-20261013180758944

修复措施

本关问题根源是校验和可访问之间存在时间窗口,文件先落盘、后检查,窗口期就能被利用。修复要点:

  1. 先隔离再发布:上传的文件先存到临时/隔离目录,完整校验通过后才移动到公开目录——校验和暴露之间不留窗口。
  2. 校验失败立即删除:检查逻辑在移动前完成,不通过就删掉,不给访问机会。
  3. 存储目录不可执行:就算窗口期内文件短暂存在,目录没有执行权限,.php也解析不了。
  4. 用原子操作:校验通过和文件发布做成一个原子流程,中间不插入任何可访问状态。