このブログ投稿では、OTP (ワンタイム パスワード) バイパス攻撃を効果的に防ぐ方法について説明します。Node.js と React.js に焦点を当てていますが、他のテクノロジーにも適用できます。 OTP の実装を保護するための技術とベスト プラクティスについて詳しく説明します。
OTP バイパス攻撃について
OTP バイパスは、アプリケーションの脆弱性を悪用して、有効な OTP なしで不正アクセスを取得します。 攻撃者は、OTP 検証を回避するために、無効または期限切れの OTP を使用したり、API 応答を操作したり (Burp Suite などのツールを使用することが多い) する可能性があります。 一般的な攻撃には、正規のユーザーからの有効な応答を傍受し、それを不正アクセスに再利用することが含まれます。
応答操作の防止
API レスポンスを暗号化するだけでは十分ではありません。暗号化 (AES または RSA を使用) は転送中のデータを保護しますが、すべてのユーザーに対して同じ応答を行うと脆弱性が生じます。 暗号化を使用している場合でも、成功/失敗の基準が HTTP ステータス コードまたは一貫した成功メッセージ (「OTP が正常に検証されました」) のみに基づいている場合、攻撃者はキャプチャされた成功応答を再生することで OTP 検証をバイパスできます。
堅牢なソリューション: 固有の応答 ID
この解決策には、リクエストごとにユーザーごとに一意の識別子を生成することが含まれます。これにより、応答リプレイ攻撃が防止されます。 概要を説明した方法では、データベースの使用を回避します。
クライアント側の実装 (React.js の例):
rsid
) を作成します。 適切なランダム ID 生成方法を使用できます。rsid
を含めます。rsid
をサーバーに送信します。rsid
と要求ヘッダーで送信された <code class="language-javascript">const OnSubmit = async () => { let data = await AesEncrypt(form); let verifyobj = { "encdata": data }; let getid = await makeid(7); let config = { headers: { "rsid": getid } }; let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config); let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc); if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) { if (decryptedData.rsid === getid) { alert(decryptedData.message); } else { alert("Invalid User"); } } else { alert(decryptedData.message); } };</code>
サーバー側の実装 (Node.js の例):
rsid
ヘッダーの存在を確認します。rsid
を含めます。<code class="language-javascript">const OnSubmit = async () => { let data = await AesEncrypt(form); let verifyobj = { "encdata": data }; let getid = await makeid(7); let config = { headers: { "rsid": getid } }; let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config); let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc); if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) { if (decryptedData.rsid === getid) { alert(decryptedData.message); } else { alert("Invalid User"); } } else { alert(decryptedData.message); } };</code>
実証された効果: ブログ投稿には、Burp Suite を使用して応答を傍受し、変更することによるログインの成功と試行の失敗を示すスクリーンショットが含まれています。独自の rsid
により、リプレイ攻撃の成功を防ぎます。
画像は元の位置に残ります。 画像の URL は保持されることに注意してください。 これらを正しく表示するには、システムがそれらの URL にアクセスできる必要があります。
以上が応答操作による OTP バイパスの防止を停止する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。