淺析條件競爭

【原理】數據庫

  競爭條件漏洞就是多個進程訪問同一資源時產生的時間或者序列的衝突Linux系統中大量使用併發編程,對資源進行共享,若是產生錯誤的訪問模式,即可能產生內存泄露,系統崩潰,數據破壞等問題。編程

  舉一個小例子,下面這段代碼定義了兩個函數,不看get_flag正常狀況下function是輸出「NO permission!」但因爲變量access是全局變量,在get_flag中被global了,因而在線程運行的過程當中利用時間差,get_flag函數就能夠改變access的初值,即改變了函數的執行流程,最後會輸出「You are root,this flag!」,而後就能夠作一些root權限下的操做。代碼time.sleep(3)的地方在實際狀況下可能會是一些耗時較長的函數,或是某個中斷的/耗時的執行(如從新鏈接數據庫的行爲)session

   

【利用場景】多線程

  條件競爭就是不斷重複發包,數據庫或者程序對於操做的內容沒有進行鎖死形成繞過以前的條件判斷。若是一個特權程序存在競爭漏洞,此時就能夠運行一個平行的進程去和這個特權用戶競爭,目的是指望改變這個特權程序的行爲或是獲取root權限。併發

  拿GCTF的賽題舉例,在題目中點擊獲取源碼,其中存在條件競爭漏洞的是下面這段,這是重置密碼的執行過程,對於初次訪問的用戶,首先會在session中判斷是否存在登錄成功的name,不存在就在數據庫中插入新用戶,用戶名是後臺經過uniqid()函數生成的惟一值,而後再插入用戶權限。下一步是清理用戶信息,根據上一步中獲得的$user在用戶上傳新的密碼後,後臺首先會刪除user表裏的用戶信息,接着刪除priv表裏的用戶權限,而後在user表中加入新的密碼和原用戶名$user,再加入該用戶的權限函數

  

  

  很關鍵的一點,後臺在判斷用戶權限時是根據notadmin字段,若是該字段爲Flase則是root權限。那麼重置和登陸操做之間就可能存在一段時間差,由於重置和登陸的邏輯沒有作好訪問的控制,正常狀況下,應該是成功登陸的用戶纔可執行重置的操做,但這裏的兩個操做成爲了平級的關係,不管你是否登陸都可重置當前用戶的密碼(原登陸的初始密碼是用戶名),故存在條件競爭。這裏登陸操做經過競爭要達到的目的是,在重置過程當中,刪除了舊的權限信息後,到設定用戶新權限以前的這段時間內成功登陸該用戶,此時用戶沒有設定權限即爲Flase,可繞事後臺對權限查詢的判斷,致使用戶成爲root用戶。this

  Payload:spa

  其中data是共享資源,就至關於正常業務邏輯中默認所用訪問的用戶均已登陸成功,具有重置密碼的權限線程

  

  Flag:3d

  

簡單點的方式,還能夠直接用burp多線程發包

相關文章
相關標籤/搜索