banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

验证码モジュールに関する一般的な脆弱性

CAPTCHA の突破#

CAPTCHA は主にログインフォームでのログイン検証に使用され、フォームがブルートフォース攻撃されるのを防ぎます。CAPTCHA モジュールが不適切に設定されている場合(例えば、クライアント側の検証、サーバー側の CAPTCHA が期限切れにならないなど)、CAPTCHA は形骸化します。

一般的に次のような CAPTCHA の分類があります:

  • 画像 CAPTCHA
  • SMS CAPTCHA
  • メール CAPTCHA
  • スライド CAPTCHA
  • 音声 CAPTCHA

SMS CAPTCHA#

CAPTCHA のブルートフォース攻撃#

現在の SMS CAPTCHA のほとんどは 6 桁の数字で構成されており、6 桁の CAPTCHA は簡単には破られません。しかし、4 桁の CAPTCHA に遭遇し、有効期限や CAPTCHA の送信回数が制限されていない場合、ブルートフォース攻撃を試みることができます。

4 桁の CAPTCHA は 10000 回の試行で破ることができ、これは少ない回数です。0000~9999 の範囲です。

ケース 1: 任意のユーザー登録

攻撃者は任意の電話番号を入力して登録し、サーバーは攻撃者が入力した電話番号に SMS CAPTCHA を送信します。このケースの CAPTCHA は 4 桁で、CAPTCHA の範囲は 0000~9999 に設定されており、ブルートフォース攻撃を行い、CAPTCHA を成功裏に取得した後、自動的にアカウントが登録されます。

image

返されたデータパケットを通じて、攻撃が成功したかどうかを判断できます。

image

上の図のように、返り値の長さから、サイズが 49 の応答が正しい CAPTCHA であると判断できます。

修正提案:

CAPTCHA に対するブルートフォーステストに対して、次のような強化策を講じることをお勧めします:

(1)CAPTCHA の有効期限を設定し、180 秒を推奨;
(2)単位時間内の CAPTCHA の失敗試行回数を制限する。例えば、5 分間に連続して 5 回失敗した場合、そのアカウントを 15 分間ロックする。

CAPTCHA のバイパステスト#

脆弱性の原理:

いくつかのケースでは、フロントエンドからサーバーに送信されるデータ(例えば:res_code などのフィールド)を変更することで、CAPTCHA をバイパスし、リクエストを実行できます。

テストプロセス:

攻撃者はアカウント登録ページにアクセスし、任意の電話番号を入力して CAPTCHA を取得し、アカウント登録ページに任意の CAPTCHA を入力してリクエストを送信し、パケットをキャプチャします。キャプチャツールを使用して返されたパケット情報を確認および変更し、返されたデータパケットを転送して、登録が成功したかどうかを確認します。

image

応答パケットを変更

image

修正提案:

この脆弱性に対して、サーバー側で CAPTCHA の認証メカニズムを追加し、クライアントが送信した CAPTCHA を二重に検証することをお勧めします。

CAPTCHA の再利用#

脆弱性の原理:

ウェブサイトのログインやコメントなどのページで、CAPTCHA 認証が成功した後にセッションが即座にクリアされない場合、CAPTCHA が初回認証成功後に再利用可能になります。テスト中に CAPTCHA を含むデータパケットをキャプチャして再送信し、成功したかどうかを確認できます。

テストプロセス:

攻撃者は通常のプロセスでアカウントを登録し、ページの CAPTCHA を入力し、送信されたデータパケットをキャプチャします。データパケット内のユーザー名フィールドを変更して再送信し、複数のアカウントが成功裏に登録されたかどうかを確認します。

修正提案:

認証回数の問題に対して、CAPTCHA が 1 回の認証成功後にサーバー側で認証成功のセッションをクリアすることをお勧めします。これにより、CAPTCHA の 1 回の認証が繰り返し使用される問題を効果的に防ぐことができます。

CAPTCHA の GET 伝送漏洩#

CAPTCHA が GET パケット内にあり、直接 CAPTCHA を取得できることがわかります。これにより、存在しない電話番号でも登録でき、CAPTCHA を直接入力できます。

image

SMS バンピング#

脆弱性の原理:

SMS 送信モジュールで、SMS の送信回数に制限がないため、無制限に SMS CAPTCHA を送信できます。

テストプロセス:

攻撃者は SMS 送信部分に電話番号を入力し、CAPTCHA を送信するボタンをクリックしてパケットをキャプチャし、複数回 SMS CAPTCHA を受信できるかどうかを確認します。もし 1 秒間に複数回の CAPTCHA を受信できる場合、SMS バンピングの脆弱性が存在します。

いくつかのバイパス方法:

  1. スペースを利用してバイパス
  2. クッキー値を変更してバイパス
  3. IP を利用してバイパス
  4. 返り値を変更してバイパス
  5. 異なるアカウントから SMS を送信してバイパス

image

image

画像 CAPTCHA#

CAPTCHA のバイパス(クライアント側)#

js フロントエンド検証

image

JavaScript を無効にする

ブラウザの F12 - 設定 - JavaScript を無効にする

image

image

ログインボックスに到達

image

burp でパケットをキャプチャ

image

intruder でブルートフォース攻撃成功

image

CAPTCHA のバイパス(サーバー側)#

image

image

同じ CAPTCHA が何度も送信され、有効期限が切れず、ブルートフォース攻撃が可能で、成功裏にログイン

image

画像 CAPTCHA 自動認識テスト#

captcha-killer-modified のダウンロード#

captcha-killer的修改版,支持关键词识别base64编码的图片,添加免费ocr库,用于验证码爆破,适配新版Burpsuite

Releasesから jar ファイルをダウンロード

image

burpsuite にこの jar ファイルをロード

次に、captcha-killer-modified のソースリポジトリをダウンロードし、codereg.py ファイルを使用します。このファイルは CAPTCHA 認識モジュールを起動するために必要で、dddddocr ライブラリをインストールする必要があります。

image

git clone https://github.com/f0ng/captcha-killer-modified.git

ddddocr ライブラリのインストール#

リポジトリのアドレス:https://github.com/sml2h3/ddddocr

注:私の環境は mac m1 pro です

# brewでonnxruntimeをインストール
brew install onnxruntime
pip3 install ddddocr # python3.9でcodereg.pyを実行するとエラー

python3.10 で aiohttp をインストール

pip310 install aiohttp -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

python310 codereg.pyを実行

エラー:TypeError: The port is required to be int.

エラーの解決:

スクリプト内のdefault="8888"default=8888に変更して再度実行します。

再度python310 codereg.pyを実行し、正常に動作します。

image

実戦ケース 1#

ターゲットは pikachu のターゲットです

  1. burp で CAPTCHA の URL をリクエスト

image

CAPTCHA の URL をリクエストし、クリックして取得すると、右側の CAPTCHA を取得できます。

image

上の図の左側のリクエスト内容を先にログインボックスのパケットをキャプチャし、POST の URL を CAPTCHA の URL に変更します。下の図で captcha-killer-modified プラグインに送信します。

image

他のケース、キーワードを抽出

image

  1. ddddocr インターフェースの URL を設定

リクエストテンプレートを設定します。

POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Authorization:Basic f0ngauth
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8332

<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

インターフェースアドレスをhttp://127.0.0.1:8888 に設定し、codereg.py が起動したサービスです。

以下のように設定します:

image

この時、captcha-killer-modified パネルの内容は以下のようになり、CAPTCHA を正確に認識しました。

image

  1. intruder でブルートフォース攻撃を開始
  • attack type を pitchfork に設定
  • パスワードフィールドと vcode CAPTCHA フィールドをブルートフォース攻撃します。

image

パスワードのペイロードを設定

image

CAPTCHA のペイロードを設定

image

最終的な認識率、ここで使用しているターゲットの CAPTCHA は比較的複雑です。

image

codereg.py の出力

image

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。