本关也告诉我们了,需要代码审计,得看明白代码才可以做,下面是网站源码。

下面是这段代码的执行逻辑
- 如果初始化上传状态为失败,则提示信息为空。
- 若用户提交上传:
○ 定义允许的扩展名(jpg、png、gif)。
○ 获取上传文件名、临时路径,提取文件扩展名。
○ 先将临时文件移动到上传目录。(重点)
○ 若移动成功:
■ 检查扩展名是否在允许列表中:
● 是:生成随机新文件名,重命名上传文件,标记上传成功。
● 否:提示不允许的类型,删除已上传的文件。
○ 若移动失败:提示上传出错。
这里是存在一个明显的时间差的,即服务器会先把我们上传的文件先移动到上传目录,然后经过验证判断文件合不合法,不合法进行删除,这里是存在条件竞争漏洞的。
条件竞争漏洞源于 “文件上传后未及时重命名 / 移动 / 删除” 的时间差。攻击者可利用这个时间差,在服务器将临时文件移动到目标路径(或进行安全校验)之前,快速访问临时文件,从而上传恶意脚本。
若代码中存在 “先存储临时文件→再进行复杂校验→最后移动 / 删除” 的分步逻辑,才会出现明显的时间差,进而有可能存在条件竞争漏洞。
所以,这一题的绕过思路就是在服务器删除我们的文件之前访问到我们的文件,为了实现持久控制,我们这里可以写入这样一段代码,如果我们访问这个文件成功了,那么它会在同级目录里面留下一个shell.php文件,我们后续可以访问shell.php文件。

这里需要用到爆破工具,大量发送这个文件的POST数据包,以及大量访问该文件的请求,只要其中有一个访问文件请求成功了,那么就会留下一个shell.php文件。这里使用BurpSuite的Intruder模块来进行。
第一个图为上传文件的数据包,先发送到Intruder。第二个图为访问上传文件的数据包。


都发送后,进入Intruder模块,这两个包都不需要添加payload位置,我们需要的只是大量的请求,点击payload后,选择Null payloads,数量填多一点。两个数据包都填完后就点击开始攻击。

可以点击一下状态码,会根据大小进行排序,这样更容易找到响应码为200的请求,我们需要看的是访问上传文件的数据包状态,只有有一个访问成功,那么也就意味着留下了shell.php,我们后续就可以继续访问了。

可以看到,存在我们想要的shell.php文件,我们也访问成功了。

解题点:如果服务端存在处理文件的时间差,可以尝试条件竞争。
642

被折叠的 条评论
为什么被折叠?



