條件競爭是沃特?
敲黑板辛辨,定義:競爭條件發(fā)生在多個線程同時訪問同一個共享代碼凸丸、變量、文件等沒有進行鎖操作或者同步操作的場景中月培。
開發(fā)者在進行代碼開發(fā)時常常傾向于認為代碼會以線性的方式執(zhí)行狈茉,而且他們忽視了并行服務(wù)器會并發(fā)執(zhí)行多個線程夫椭,這就會導(dǎo)致意想不到的結(jié)果。
線程同步機制確保兩個及以上的并發(fā)進程或線程不同時執(zhí)行某些特定的程序段氯庆,也被稱之為臨界區(qū)(critical section)蹭秋,如果沒有應(yīng)用好同步技術(shù)則會發(fā)生“競爭條件”問題。
形象實例
抽象成四個字堤撵,措手不及H侍帧!实昨!
利用多線程并發(fā)去執(zhí)行同一個操作進程洞豁,服務(wù)器無法或者沒有處理程序,導(dǎo)致處理高并發(fā)的線程未能同步好所有請求荒给,導(dǎo)致請求與請求之間產(chǎn)生等待時出現(xiàn)邏輯缺陷丈挟。出現(xiàn)意想不到的結(jié)果,措手不及應(yīng)接不暇人山人...咳咳志电,反應(yīng)不過來就出錯曙咽。
該漏洞一般出現(xiàn)在與數(shù)據(jù)庫系統(tǒng)頻繁交互的位置,例如金額同步挑辆、支付等較敏感操作處例朱。另外條件競爭漏洞也會出現(xiàn)在其他位置孝情,例如文件的操作處理等。
給兩個例子好好消化消化洒嗤。
例1:金額提現(xiàn)
假設(shè)現(xiàn)有一個用戶在系統(tǒng)中共有2000元可以提現(xiàn)咧叭,他想全部提現(xiàn)。于是該用戶同時發(fā)起兩次提現(xiàn)請求烁竭,第一次提交請求提現(xiàn)2000元,系統(tǒng)已經(jīng)創(chuàng)建了提現(xiàn)訂單但還未來得及修改該用戶剩余金額吉挣,此時第二次提現(xiàn)請求同樣是提現(xiàn)2000元派撕,于是程序在還未修改完上一次請求后的余額前就進行了余額判斷,顯然如果這里余額判斷速度快于上一次余額修改速度睬魂,將會產(chǎn)生成功提現(xiàn)的兩次訂單终吼,而數(shù)據(jù)庫中余額也將變?yōu)?2000。而這產(chǎn)生的后果將會是平臺多向該用戶付出2000元氯哮。
例2:先存儲文件际跪,再判斷是否合法,然后再刪除喉钢。
首先將文件上傳到服務(wù)器姆打,然后檢測文件后綴名,如果不符合條件肠虽,就刪掉幔戏,典型的“引狼入室”
攻擊:首先上傳一個php文件
當(dāng)然這個文件會被立馬刪掉,所以我們使用多線程并發(fā)的訪問上傳的文件税课,總會有一次在上傳文件到刪除文件這個時間段內(nèi)訪問到上傳的php文件闲延,一旦我們成功訪問到了上傳的文件,那么它就會向服務(wù)器寫一個shell韩玩。
烏云實例:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-049794.html
烏云人民幣套現(xiàn):http://wooyun.jozxing.cc/static/bugs/wooyun-2015-099622.html
CTF實例
https://blog.csdn.net/iamsongyu/article/details/83346029??//Itshop
辣條之王 知識點1.條件競爭 2.數(shù)據(jù)溢出
數(shù)據(jù)溢出重點一句話:我們輸入的是份數(shù)垒玲,后臺肯定要查詢數(shù)據(jù)庫中我們的大辣條數(shù)目書否符合條件,即是否大于份數(shù)*5找颓,才會給我們相應(yīng)的辣條之王合愈。我們的目的是數(shù)據(jù)庫判斷可以過,但是后臺也得給我們足夠的辣條之王叮雳,思路是使用整數(shù)溢出欺騙數(shù)據(jù)庫想暗,(重中)使得我們請求的數(shù)字在服務(wù)器看來就是1分辣條之王,而實際上是很多帘不。(之重K的)
ctf題目:http://119.23.73.3:5006/web2/index2.php (練習(xí))
首先進入CTF地址,觀察發(fā)現(xiàn)寞焙,網(wǎng)址為inde2.php储狭,
正常來說應(yīng)是index.php互婿,訪問index.php發(fā)現(xiàn)自動跳轉(zhuǎn) inde2.php
抓包截包,
進入 uploadsomething.php辽狈,發(fā)現(xiàn)應(yīng)該是個上傳頁面慈参,第一個框為上傳文件名,第二個為文件內(nèi)容刮萌,
上傳1.php 驮配,返回路徑 查看
憑我專業(yè)八級的英語水平,這意思應(yīng)該是太慢了着茸,于是聰明的你想到的條件競爭漏洞壮锻,迅速上傳迅速訪問。
OK涮阔,使用burp intruder 模塊 爆破上傳猜绣,然后訪問。
于是敬特,開始掰邢,
分別抓取兩個包發(fā)送intruder
第一個包網(wǎng)址:http://119.23.73.3:5006/web2/uploadsomething.php?filename=1.php&content=
第二個包網(wǎng)址:http://119.23.73.3:5006/web2/uploads/c2a54d18d324f0c9b33b29243f77d3a45b5f9463/1.php
調(diào)整沒有字典的爆破,不斷發(fā)包伟阔,
然后設(shè)置發(fā)送三千個數(shù)據(jù)包辣之,然后設(shè)置線程調(diào)至50
第一個包為以50線程迅速上傳三千次,
第二個包為以50線程迅速訪問三千次皱炉,只要速度夠快就可以訪問到召烂。
然后開始爆破成功得到flag,我們可以看到也不是百分百可以得到flag娃承,存在競爭奏夫,
防御
對于數(shù)據(jù)庫的操作,正牌的方法是設(shè)置鎖
對于文件上傳历筝,一定要經(jīng)過充分完整的檢查之后再上傳而不是先上傳在辨別酗昼。
---
參考:https://blog.csdn.net/ivalue/article/details/81412494
參考:https://www.0dayhack.com/post-666.html