この記事では、CTF における一般的な PHP の脆弱性 (画像とテキストの概要) を紹介します。これには一定の参考価値があります。困っている友人は参照できます。お役に立てば幸いです。 。
このような質問はよくありますが、記憶力が悪いと忘れてしまいがちなので、記憶を深めるために丁寧にまとめておきます! ! !
1. md5() の脆弱性により、PHP はハッシュ文字列を処理するときに「!=」または「==」を使用します。ハッシュ値を比較すると、 「0E」で始まるすべてのハッシュ値を 0 として解釈するため、2 つの異なるパスワードがハッシュされ、そのハッシュ値が両方とも「0E」で始まる場合、PHP ではそれらは同じとみなされ、両方とも 0 になります。
md5 処理後の 0e で始まる例をいくつか示します。
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s 214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
実験してみましょう:
結果。 。 。予想通り
# したがって、md5 で暗号化された文字列が制御可能 (つまり、入力が制御可能) な場合、脆弱性が発生する可能性があります。 ! !
もちろん、さらに興味深いのは、md5 は配列を処理できないことです。以下も実験です:
2 つの異なる配列を渡します:
警告は出ますが、次のことがわかります。 、それでもバイパスできます (警告が不要な場合は、先頭に @ 記号を追加してください):
ただし、配列を処理するときに何が返されるかはわかりません。試してみてください:
var_dump():
は空です。 ! !配列を処理する場合、NULL 値が返されることに注意してください。
md5(str)==0; には多くのバイパス方法があります。要約すると、
バイパスするには 0 または 0e で始まります。
#Arraystrcmp() 関数は 2 つの文字列を比較するために使用されます。strcmp( string$ str1, string $ str2); Parameter str1 は最初の文字列、str2 は 2 番目の文字列です。 str1 が str2 より小さい場合は、 0 を返します。
等しい場合は、0 を返します (等しい場合は 0 を返す機能に注意してください)
ただし、この関数のパラメータに不正なパラメータ (オブジェクト、配列など) がある場合、エラーが報告され、0 が返されます。 ! ! (この脆弱性は 5.3 より前の php に当てはまります。このマシンで試してみましたが、修正できないことがわかりました。何が起こったのかわかりません。) 以下は、BUGKU コードで監査された質問の例です。 :
図に示すように、strcmp の脆弱性に従って、配列を渡してみます。
配列を渡すと strcmp エラーが発生し、戻り値が返されます。 、つまりバイパスされます! ! !
strcmp() と同じ別の関数 strcasecmp() があります。strcmp() は大文字と小文字を区別しますが、strcasecmp() は区別せず、同じ方法でバイパスできます。
以上がCTF における一般的な PHP 脆弱性の紹介 (図による概要)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。