浅析条件竞争

【原理】

  竞争条件漏洞就是多个进程访问同一资源时产生的时间或者序列的冲突。Linux系统中大量使用并发编程,对资源进行共享,如果产生错误的访问模式,便可能产生内存泄露,系统崩溃,数据破坏等问题。

  举一个小例子,下面这段代码定义了两个函数,不看get_flag正常情况下function是输出“NO permission!”但由于变量access是全局变量,在get_flag中被global了,于是在线程运行的过程中利用时间差,get_flag函数就可以改变access的初值,即改变了函数的执行流程,最后会输出“You are root,this flag!”,然后就可以做一些root权限下的操作。代码time.sleep(3)的地方在实际情况下可能会是一些耗时较长的函数,或是某个中断的/耗时的执行(如重新连接数据库的行为)

  

【利用场景】

  条件竞争就是不断重复发包,数据库或者程序对于操作的内容没有进行锁死造成绕过之前的条件判断。如果一个特权程序存在竞争漏洞,此时就可以运行一个平行的进程去和这个特权用户竞争,目的是期望改变这个特权程序的行为或是获取root权限。

  拿GCTF的赛题举例,在题目中点击获取源码,其中存在条件竞争漏洞的是下面这段,这是重置密码的执行过程,对于初次访问的用户,首先会在session中判断是否存在登陆成功的name,不存在就在数据库中插入新用户,用户名是后台通过uniqid()函数生成的唯一值,然后再插入用户权限。下一步是清理用户信息,根据上一步中得到的$user在用户上传新的密码后,后台首先会删除user表里的用户信息,接着删除priv表里的用户权限,然后在user表中加入新的密码和原用户名$user,再加入该用户的权限

  

  

  很关键的一点,后台在判断用户权限时是根据notadmin字段,如果该字段为Flase则是root权限。那么重置和登录操作之间就可能存在一段时间差,因为重置和登录的逻辑没有做好访问的控制,正常情况下,应该是成功登录的用户才可执行重置的操作,但这里的两个操作成为了平级的关系,无论你是否登录均可重置当前用户的密码(原登录的初始密码是用户名),故存在条件竞争。这里登录操作通过竞争要达到的目的是,在重置过程中,删除了旧的权限信息后,到设定用户新权限之前的这段时间内成功登录该用户,此时用户没有设定权限即为Flase,可绕过后台对权限查询的判断,导致用户成为root用户。

  Payload:

  其中data是共享资源,就相当于正常业务逻辑中默认所用访问的用户均已登录成功,具备重置密码的权限

  

  Flag:

  

简单点的方式,还可以直接用burp多线程发包

时间: 2024-11-09 21:57:53

浅析条件竞争的相关文章

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

moctf 没时间解释了 条件竞争漏洞 题目链接 条件竞争: 在本题目中,上传文件的时候服务器无条件的接收任何类型的文件,但是你上传之后服务器会给你的文件内容修改为too slow. 比如你上传了一句话木马shell.php,内容<?php @eval($_POST['pass']);?>,可以直接上传,但是马上内容会被修改为too slow 方法: 修改内容会有时间,我们不断的上传这个文件并且不断的访问,会有一次我们正好访问到真正的shell.php 因为服务器修改内容是很快的,所以我们得用

条件竞争漏洞测试

概念: 竞争条件是系统中的一种反常现象,由于现代Linux系统中大量使用并发编程,对资源进行共享,如果产生错误的访问模式,便可能产生内存泄露,系统崩溃,数据破坏,甚至安全问题.竞争条件漏洞就是多个进程访问同一资源时产生的时间或者序列的冲突,并利用这个冲突来对系统进行攻击.一个看起来无害的程序如果被恶意攻击者利用,将发生竞争条件漏洞. 曾经出现过的漏洞: 网上大部分是使用转账的列子来说明的,曾经乌云提现环节就出现过这个漏洞,当时大神也是提现到账3000块,官方24小时紧急修复,承认提现有效.美滋滋

条件变量signal与unlock的顺序

编写同步队列时,有用到条件变量,对操作队列的线程进行同步.当队列为空时,允许get线程挂起,直到add线程向队列添加元素并通过唤醒条件变量,get线程继续向下运行.条件变量在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.条件变量要和互斥量相联结,以避免出现条件竞争:一个线程预备等待一个条件变量,当它在真正进入等待之前,另一个线程恰好触发了该条件.使用条件变量进行同步时,通常以如下方式进行编码: 1 pthread_mutex_t mutex; 2 pthread_cond_t cond;

竞争排除原则

竞争排除原则(也称竞争排斥原理或高斯定理)[1]在生态学里指的是,两个物种不能同时,或者是不能长时间地在同一个生态区位生存.因为两者之间会展开竞争,导致其中的一方获胜,可以留在原来的生态龛位继续生存. 另一方为了继续生存,会改变自己的居住地,或者改变饮食习惯,或者改变自身习性(如改日行性为夜行性,达到时间上和获胜的一方分离),进化适应以延续生命.相对来说,失败者一方完全灭绝是很少见的.这些改变也是促成了适应辐射:从原始的一般种类演变至多种多样.各自适应于独特生活方式的专门种类的过程. 定义编辑

HashMap的工作原理

这是一节让你深入理解hash_map的介绍,如果你只是想囫囵吞枣,不想理解其原理,你倒是可以略过这一节,但我还是建议你看看,多了解一些没有坏处. hash_map基于hash table(哈希表).哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一. 其基本原理是:使用一个下标范围比较大的数组来存储元素.可以设计一个函数(哈希函数,也

HashMap 扩容 加载因子

HashMap: public HashMap(int initialCapacity, float loadFactor) { //初始容量不能<0 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); //初始容量不能 > 最大容量值,HashMap的最大容量值为2^30 if (initialCapa

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

Operating System-进程间互斥的问题-生产者&amp;&amp;消费者引入

之前介绍的几种解决进程间互斥的方案,不管是Peterson方案还是TSL指令的方式,都有一个特点:当一个进程被Block到临界区外面时,被Block的进程会一直处于忙等待的状态,这个不但浪费了CPU资源,还会有一个很坏的副作用.假设两个进程,H,L,H的优先级高,L进程的优先级非常低,CPU的调度规则是只要H处于Ready状态,则开始运行H,问题来了: H处于BLock状态,可能在等待外部资源 L进入了临界区 H处于Ready状态(外部资源满足),L还没有离开临界区 按照调度规则,CPU会Swi

怎样去写线程安全的代码(Java)

使用多线程就可能会存在线程安全的问题.很多 java 程序员对写多线程都很挣扎,或者仅仅理解那些是线程安全的代码,那些不是.这篇文章我并不是详述线程安全,详述同步机制的文章,相反我只是用一个简单的非线程安全的代码例子引领大家,然后重点是去理解什么是线程安全,以及怎样使代码变得线程安全. 好了,下面我们先来看一个非线程安全的代码,可以尝试找找为什么非线程安全? /* * 非线程安全类 */ public class Counter { private int count; public int g