一、条件竞争介绍
条件竞争,在程序员日常的Web应用开发中,通常不如其他漏洞受到的关注度高。因为普遍的共识是,条件竞争是不可靠的,大多数时候只能靠代码审计来识别发现,而依赖现有的工具或技术很难在黑盒灰盒中识别并进行攻击。即便该漏洞很难被发现,也仍然有很多企业曾被曝出相关漏洞,例如星巴克咖啡、小密圈的App 产品等。今天要讲解的条件竞争漏洞仅限于Web应用之中。
条件竞争漏洞,官方概念是“发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。” 这个漏洞存在于操作系统、数据库、web等多个层面,像有名的脏牛(dirty cow)。大白话就是同一个共享资源被多个进程同时都想要使用,而没有设计“上锁”,造成异常。
条件竞争是指一个系统的运行结果依赖于不受控制的时间的先后顺序,当这些不受控制的事件并没有按照开发者想要的方式执行时,就会出现bug。
当我们系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。条件竞争涉及到的就是操作系统中所提到的进程或者线程同步的问题。
当一个程序的结果依赖于线程的顺序,处理不当就会导致条件竞争。
并发、共享对象、改变对象是条件竞争产生的必要条件
并发
存在至少两个并发执行流:线程、进程、任务等级别的执行流
共享对象
多个并发流会访问同一对象。常见的共享对象有共享内存,文件系统,信号。一般来说,这些共享对象是用来使得多个程序执行流相互交流。我们称共享对象的代码为临界区,在正常写代码时,这部分应该加锁。
改变对象
至少有一个控制流会改变竞争对象的状态,因为如果程序只是对对象进行读操作,那么并不会产生条件竞争。
三、实验
1、在小皮面板搭建一个站点,访问
2、用哥斯拉生成一句话木马,并命名为shell.php5,进行首次上传
发现上传的木马被删除了。
3、用fiddler抓包,并发1000次请求
成功看木马。