Regular expression Denial of Service - ReDoS
正規表現によるサービス拒否攻撃 - ReDoS
正規表現によるサービス拒否攻撃(ReDoS)
正規表現によるサービス拒否攻撃(ReDoS) は、正規表現(テキスト内のパターンを検索および一致させる方法)の動作方法の弱点を悪用することで発生します。 時々、正規表現が使用されると、特に処理するテキストのサイズが大きくなると、非常に遅くなることがあります。 この遅延は、テキストサイズがわずかに増加するだけで非常に速く成長することがあります。 攻撃者はこの問題を利用して、正規表現を使用するプログラムを長時間正常に動作しないようにすることができます。
問題のある正規表現ナイーブアルゴリズム
詳細はhttps://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoSを確認してください
悪意のある正規表現
悪意のある正規表現パターンは、DoSを引き起こすように作成された入力でスタックするものです。 悪意のある正規表現パターンには、通常、繰り返しを含むグループ化や繰り返し、または繰り返しグループ内でのオーバーラップが含まれます。 悪意のあるパターンの例には、次のものがあります:
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x}(ただし、x > 10)
これらすべてが入力 aaaaaaaaaaaaaaaaaaaaaaaa!
に対して脆弱です。
ReDoS ペイロード
ReDoS を介した文字列の外部流出
CTF(またはバグバウンティ)では、おそらく 機密情報(フラグ)が一致する正規表現を制御できる場合があります。 その場合、**正規表現が一致した場合にページをフリーズさせる(タイムアウトまたは処理時間を延長する)**と便利かもしれません。 これにより、文字列を 1文字ずつ外部に流出 できます:
この投稿 で、このReDoSルールを見つけることができます:
^(?=<flag>)((.*)*)*salt$
例:
^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
この解説 では、次のものが見つかります:
<flag>(((((((.*)*)*)*)*)*)*)!
この解説 では、次のものを使用しました:
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
入力と正規表現を制御する ReDoS
以下は、入力と正規表現の両方を制御する ReDoS の例です:
ツール
参考文献
Last updated