关于条件竞争漏洞(Race Conditions)

0x00 一些概念

刚好最近操作系统课也讲到了线程。所以顺便了解一些概念。

条件竞争:系统中,最小的运算调度单位是线程,而每个线程又依附于一个进程,条件竞争则是多进程 或多线程对一个共享资源操作,因为操作顺序 不受控的时候所产生的问题。

进程:进程是为了更好的利用CPU的资源;进程是系统进行资源分配和调度的一个独立单位;每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信;由于进程比较重要,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

线程:线程的是为了降低上下文切换的消耗,提高系 统的并发性,并突破一个进程只能干一件事的缺陷,使到进程内并发成为可能。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在 运行中必不可少的资源(如程序计数器,一组寄 存器和栈),但是它可与同属一个进程的其他的 线程共享进程所拥有的全部资源。 线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

协程:协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。协程拥有自己的寄存器上下文和栈。 程调度切换时,将寄存器上下文和栈保存到其 他地方,在切回来的时候,恢复先前保存的寄 存器上下文和栈,直接操作栈则基本没有内核 切换的开销。

并发编程:并发编程在实际情况是为了提高执行效率,提高系统的利用率。

 

0x01 漏洞成因、攻击方式及危害

关于条件竞争漏洞的成因、攻击方式及危害,可参考下面乌云上的这篇文章:

http://wiki.secbug.net/web_race-condtion.html

 

0x02 实例

例1:金额提现

假设现有一个用户在系统中共有2000元可以提现,他想全部提现。于是该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。

例2:先存储文件,再判断是否合法,然后再删除。

首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”。
攻击:首先上传一个php文件
当然这个文件会被立马删掉,所以我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个shell。

例3:银行转账的漏洞利用

下面这篇文章写了怎样用Burp来找出“竞争条件”问题的方法:

https://www.freebuf.com/articles/network/107077.html

 

0x03 CTF题

题目地址

moctf-没时间解释了(条件竞争漏洞)

 

0x04 防御

对于数据库的操作,正牌的方法是设置锁。
对于文件上传,一定要经过充分完整的检查之后再上传而不是先上传再辨别。

 

0x05 补充

现在能力欠缺,希望后期能补充和完善这个知识点的总结。

你可能感兴趣的:(Security,CTF)