元リンク
ここまで怖い攻撃方法は初めてです、範囲が広く防御が難しく、攻撃効果は即効性があります。多くの Web サイトと Web インターフェイスは、ハッシュ衝突攻撃から保護されていません。
RESTful インターフェースの人気により、プログラマーはデフォルトでデータ転送方法として json を使用するようになります。 json形式はデータの冗長性が少なく、互換性が高いため、提案されてから広く使われており、Webの標準となっていると言えます。サーバー側でどの言語を使用しても、データを json 形式で取得した後、 jsonDecode() を実行して json 文字列を json オブジェクトに変換する必要があります。オブジェクトはデフォルトでハッシュ テーブルに保存されます。ハッシュ テーブルは衝突攻撃に対して脆弱です。攻撃データをjsonに入れておけば、jsonDecode()を実行するとサーバープログラムが感染してしまい、CPU使用率がすぐに100%になってしまいます。 16 コア CPU の場合、16 リクエストで DoS の目的を達成できます。
すべてのテスト プログラムは、テストの便宜上、65536 個の JSON キーと値のペアのみを構築しました。実際に攻撃を開始すると、数十万、さらには数百万のデータが構築される可能性があります。 simple攻撃データをJSONフォーマット攻撃JSONデータに変換したいくつか
//只需要一行代码就能看到效果var jsonSrc = '这里输入json数据';
2. PHP テスト
$json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hashNomal.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Nomal:".($endTime - $startTime)."\r\n"; $json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hash.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Attack:".($endTime - $startTime)."\r\n";
3. Java テスト
public String index(){String jsonStr = "";try { FileReader fr = new FileReader("t.log");//需要读取的文件路径BufferedReader br = new BufferedReader(fr); jsonStr = br.readLine(); br.close(); fr.close(); //关闭文件流 }catch(IOException e) { System.out.println("指定文件不存在");//处理异常 } Map<String, Object> map = new HashMap<String, Object>();map = JSONObject.fromObject(jsonStr);return "Hash Collision ~"; }
4. 他の言語はまだ研究中です...
Java のハッシュ衝突攻撃も有効であることを検証するために、端午節の休暇中に Java HashTable に関する記事を読み続けましたが、苦労の末、ついに攻撃データの生成に成功しました。このプロセスは単純ではなく、アイデアを検証することにもなります。すべての高レベルなものは最終的に基本的なデータ構造の知識に分解されます。
数年前、PHP のバージョンはまだ 5.2 でした。次のような POST リクエストの本文にすべてのハッシュ キーを含めることができました。
サーバーはデータを取得した後、すべてのパラメーターをハッシュ テーブル ($_POST) に保存します。このようにして、攻撃は簡単に実行できます。しかし、Nginx レイヤーと PHP レイヤーで HTTP リクエスト パラメーターの数とサイズを簡単に制限できるため、現在この方法は機能しません。 PHP はデフォルトで 1000 個のパラメータのみを許可しますが、これはサーバーにはまったく影響しません。
2017年になり、json形式とRESTfulスタイルのインターフェースが非常に人気になりました。便利なコーディングを提供すると同時に、Hash Collision Dos の新しい方法も提供します。現在、多くの RESTful スタイルのインターフェイスは次のとおりです:
Data: {"action":"create-account","data":""}
上記のインターフェイスの場合、攻撃データを直接配置します。 data パラメータを指定すると、サーバーはデータを受信した後に必ず jsonDecode() を実行するため、攻撃の目的は簡単に達成されます。 防御方法Hash Collision Dos 攻撃を防御するには、業界にはすでに多くの成熟したソリューションがありますが、それらはすべて言語を変更するか、HashTable を書き直すことを推奨しています。ここでは、現在の JSON 形式の解析の問題についてのみ説明します。まず、jsonDecode() の前に、不正なユーザーを可能な限り拒否するための権限検証を追加する必要があります。次に、jsonDecode() の前にデータ サイズとパラメータのホワイトリスト検証を実行します。古いプロジェクトの変換とメンテナンスのコストが高い場合は、jsonDecode() メソッドを自分で書き直すことをお勧めします
以上が高度な DoS 攻撃 - ハッシュ衝突攻撃の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。