CTFでよく見られるphp-MD 5()関数の脆弱性

7695 ワード

CTFでよく見られるphp-MD 5()関数の脆弱性
1.数字と文字列の比較
var_dump( 0 == "a" );
var_dump( "0" == "a" );

1つ目はtrue、2つ目はfalseですphpがアルファベットの先頭を整数に変換すると0に変換され、前の数字の後ろのアルファベットは1つ目のアルファベットが現れる位置までしか取れません(intval(''123 abd 45 gf)結果は123)
2.MD 5関数の脆弱性
$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])

上記条件を満たすことが要求されると、nameとpasswordの値は異なるがMD 5は同じであり、ここでは迂回を利用することができる.PHPはハッシュ文字列を処理する際、「0 E」で始まるハッシュ値をそれぞれ0と解釈するので、2つの異なるパスワードがハッシュを通過した後、ハッシュ値が「0 E」で始まると、PHPは同じ0とみなされます.
以下の値はmd 5暗号化後0 Eで始まる.
  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a
  • s214587387a

  • 以下の値はsha 1暗号化後0 Eで始まる.
  • sha1(‘aaroZmOk’)
  • sha1(‘aaK1STfY’)
  • sha1(‘aaO8zKZF’)
  • sha1(‘aa3OFF9m’)

  • GETがa=QNKCDZO&b=240610708に伝わると迂回できます
    3.php特性
    if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
            die("success!");
        }
    

    phpで==は演算に完全に等しく、値を比較するだけでなく、値のタイプも比較し、両者が一致してこそ真である.a=QNKCDZO&b=240610708を再び使うとダメです.aとbのタイプが違うからです.PHPにおけるmd 5の関数特性
    md5([1,2,3]) == md5([4,5,6]) == NULL
    

    [1] !== [2]&&md 5([1])==md 5([2])だからGETはa[]=1&b[]=2に伝わって迂回することができる.
    4.MD 5衝突
    if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
            die("success!);
    }
    

    構築param 1とparam 2は異なるが、MD 5は同じ、すなわち2つのMD 5と同じ異なる文字列を入力する必要がある.
    Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
    Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
    

    MD 5の値は同じGoogleを使用して、巧みに構築されたバイナリファイルをかなり検索することができます.そのMD 5は同じです.注意してください.postのときはurlencodeを必要とします.
    参照リンク:https://blog.csdn.net/wy_97/article/details/79088218