ホームページ  >  記事  >  Java  >  高度な DoS 攻撃 - ハッシュ衝突攻撃

高度な DoS 攻撃 - ハッシュ衝突攻撃

怪我咯
怪我咯オリジナル
2017-06-23 12:01:242235ブラウズ

元リンク

ここまで怖い攻撃方法は初めてです、範囲が広く防御が難しく、攻撃効果は即効性があります。多くの 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数据';
js に 1 行のコードを入力するだけで、通常のデータとハッシュ攻撃データの両方に 65536 行のキーと値のペアが含まれています。私のローカルテストの効果は次のとおりです。

Chrome に付属のタスクマネージャーを通して、CPU がすぐに 100% に上昇し、実行が完了するまでに 1 分近くかかることがわかりますが、通常のデータは実行できます。数ミリ秒;

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";
    PHP では、file_get_contents を使用してリモートでデータを取得し、その差は php-fpm の 1 つのプロセスで 100% を占めます。 CPU。
  1. 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("指定文件不存在");//处理异常
        }
    
        Map14bd1badcdee783757181db757c9943f map = new HashMap14bd1badcdee783757181db757c9943f();map = JSONObject.fromObject(jsonStr);return "Hash Collision ~";
    }
  2. Java のハッシュ アルゴリズムは PHP や JavaScript とは少し異なりますが、同様に 60,000 行の単純なデータを作成します。 Spring ブート フレームワークでは、ブラウザーがアクセスを開始し、CPU がいっぱいになる 26 秒後に結果が返されます。
  3. 4. 他の言語はまだ研究中です...

  4. HashTable は非常に一般的なデータ構造であり、それについて説明するための特別なクラスがあるため、Hash Collision が普及しています。各言語は同じです。ハッシュ アルゴリズムとテーブル ストレージには微妙な違いがあります。
  5. Java のハッシュ衝突攻撃も有効であることを検証するために、端午節の休暇中に Java HashTable に関する記事を読み続けましたが、苦労の末、ついに攻撃データの生成に成功しました。このプロセスは単純ではなく、アイデアを検証することにもなります。すべての高レベルなものは最終的に基本的なデータ構造の知識に分解されます。

  6. 攻撃方法

数年前、PHP のバージョンはまだ 5.2 でした。次のような POST リクエストの本文にすべてのハッシュ キーを含めることができました。


Post Data: k1=0&k2= 0&k3=0..k999998=0&k999999=0

サーバーはデータを取得した後、すべてのパラメーターをハッシュ テーブル ($_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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Webサービスとは次の記事:Webサービスとは