文件上传
用一张图片简单描述一下文件上传时发送的http协议内容
文件上传漏洞的原因
对于上传文件的后缀名(扩展名)没有做较为严格的限制
对于上传文件的MIMETYPE(content-type)(用于描述文件的类型的一种表述方法)没有做检查
权限上没有对于上传的文件目录设置不可执行权限
web server对于上传文件或者指定目录的行为没有做限制在WEB中进行文件上传的原理是通过将表单设为multipart/form-data
,同时加入文件域,而后通过HTTP'协议将文件内容发送到服务器,服务器端读取这个分段(multipart)的数据信息,并将其中的文件内容提取出来并保存的。
条件竞争
条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷
程序在运用多线程时,没有做好线程同步,导致产生非预期结果。
比如:先存储文件,再判断是否合法,然后又删除。。。
首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”
攻击:首先上传一个php文件
当然这个文件会被立马删掉,所以我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个shell。
<?php fputs(fopen("shell.php",'w'), '<?php @eval($_POST["x"]);?>');?>
上传的php文件被删除,但是会保留新生成的shell.php文件
burpsuite工具采用多线程重放数据包手工打开浏览器快速点击URL访问shell.php,直到界面出现如下所示:
漏洞修复与防范
条件竞争漏洞产生的很大一部分原因是程序不严谨,对于并发操作没有做好同步制约,毕竟开发者在进行代码开发的时候,常常倾向于代码会以线性的方式执行,而并行服务器会同时执行多个线程,这就会导致意想不到的结果。
解决条件竞争的方法就是要让存取公共变量的线程进行同步,也就是线程安全,目的是让过程实现原子性。例如读和写某一变量的过程是原子性的,不可分割的,在读写的过程中,其他指令无法插入,等待设置完值后才可以读其中的数据,这就使得每次读取的值就是最新值。一般线程安全可通过锁(互斥所、读写锁等)、条件变量、信号量、事件等方式实现。“引狼入室”的方法不可取,最好先进行充分的检测,再上传到服务器。
本文参考多篇文章,联系侵删。