知识补给库
学习内容:条件竞争绕过
简单理解条件竞争:一个人做一件事不会轻易出错,但一个人同时做n件事情很容易出错;对于计算机也是同样的道理,在面对大量的请求时,计算机也会出现错误处理的情况。
最重要的点:条件竞争绕过比较拼运气,如果实验失败,就多试几次
代码审计
打开第18关的源代码,如下图所示

• $ext_arr是一个白名单
• $file_name = $_FILES['upload_file']['name'];获取上传文件的文件名
• $temp_file = $_FILES['upload_file']['tmp_name'];上传文件的临时存储路径
• $file_ext = substr($file_name,strrpos($file_name,".")+1);上传文件的后缀名
• $upload_file = UPLOAD_PATH . '/' . $file_name;上传文件的最终存储位置
• if(move_uploaded_file($temp_file, $upload_file))将临时存储的文件移动到最终存储的位置。如果移动成功,则需继续向下执行。
• if(in_array($file_ext,$ext_arr))判断上传文件的后缀是否在白名单中。如果在,则继续向下执行进行文件保存。
这段代码与前面关卡代码的不同之处在于:本节的代码是先将上传的文件进行存储,然后再判断上传文件是否合法
这就是产生条件竞争的前提条件:先将文件存储到服务器上,然后再判断文件的合法性。合法则保存文件,不合法则删除文件
条件竞争的本质:抢夺服务器的线程资源,使攻击者上传的木马文件可以被快速执行一次,进而获取服务器的权限。
• 简单讲:上传文件的保存与上传文件后缀的判断是两条不同的语句,执行这两条语句有先后顺序,在这两条语句之间存在很短的时间间隙,在这个间隙,攻击者发送大量请求,使服务器产生处理错误。
木马文件
这里的木马文件与之前的一句话木马有所不同。
');
?>
fputs() 函数用于向文件或输出流写入字符串
• 参数一:文件指针,由 fopen() 函数返回。它指向一个已经打开的文件或流
• 参数二:要写入文件或流的字符串
fopen()函数是PHP中用于打开文件或URL的函数
• 参数一:要打开的文件或URL的路径
• 参数二:打开文件的模式。常见的模式包括:
• r:只读模式,文件指针指向文件开头。如果文件不存在,操作失败
• r+:读写模式,文件指针指向文件开头。如果文件不存在,操作失败
• w:只写模式,文件指针指向文件开头。如果文件存在,文件内容会被清空;如果文件不存在,会尝试创建文件
• w+:读写模式,文件指针指向文件开头。如果文件存在,文件内容会被清空;如果文件不存在,会尝试创建文件
• a:只写模式,文件指针指向文件末尾。如果文件不存在,会尝试创建文件
• a+:读写模式,文件指针指向文件末尾。如果文件不存在,会尝试创建文件
• x:只写模式,文件指针指向文件开头。如果文件已存在,操作失败;如果文件不存在,会尝试创建文件
• x+:读写模式,文件指针指向文件开头。如果文件已存在,操作失败;如果文件不存在,会尝试创建文件
简单讲:创建一个名为muma.php的文件,往文件内写入一句话木马<?eval($_POST["x"]);?>
为什么不直接使用一句话木马?
因为使用蚁剑连接一句话木马,要求一句话木马必须长期存在。而在本关卡中,上传完一句话木马之后,判断文件类型不符合,就会被删除掉。
使用上面的木马文件,再被删除之前,它可以创建一个名为muma.php的文件,源码中没有检测新创建文件的代码,因此可以长期保留在服务器中。
靶场实战
打开靶场第18关,上传前面创建好的木马文件

在BP中打开监听功能,抓取上传文件的数据包。右键单击空白处,选择Send to Intruder,将数据包发送到攻击模块。

在攻击模块没有攻击选项设置

因此在数据包中加一些无意义的内容,用于配置攻击选项
• 在数据包尾部添加a=123(这个内容随意,主要是用于配置攻击选项)
• 选择123,点击上方的Add$,将123设置为需要爆破的内容
• 设置完成后,可以看到123前后多了一个$,即变为$123$

设置爆破参数
• Payload type的值设置为Null payload
• 在下方选择Continue indefinitely。表示不断爆破,手动停止为止。


由于我们上传的文件名为a.php,当这个文件被存储在服务器时,需要执行这个文件。
由于存在时间很短,因此也需要使用攻击模块去访问a.php,即达到执行a.php的目的。
抓取访问a.php的数据包,打开BP的监听功能,在浏览器中访问/upload/a.php

在BP中将访问a.php的数据包也发送到Intruder模块

和上面一样,设置攻击参数


在上传a.php的数据包页面点击Start attack,向服务器不断提交a.php文件

在访问a.php的数据包点击Start attack,向服务器不断请求a.php文件

使两个数据包一起进行破解

经过一段时间的攻击,可以在upload目录下看到生成的muma.php文件

使用蚁剑连接muma.php文件

小结
漏洞产生原因:文件存储之后与文件后缀判断之间存在很小的时间差。
本关卡需要抓取两个数据包并且同时进行爆破操作。
• 一个数据包是创建一句话木马文件的文件
• 一个数据包是访问创建一句话木马文件的文件(目的是执行这个文件)
由于创建一句话木马的PHP文件存在时间很短,因此需要不断的向服务器发送创建请求;同时也需要向服务器不断的发送读取请求
• 目的是使文件可以执行,从而生成一句话木马文件
评论(1)
阅读你的博客, 我体会到, 生活更精彩。由衷感谢 情感。 <a href=https://iqvel.com/zh-Hans/a/%E5%BE%B7%E5%9B%BD/%E9%BB%91%E9%97%A8>歷史見證</a> 有趣的 旅游者平台! 你们真棒!