PHPのMD 5()関数の脆弱性

5431 ワード

文書ディレクトリ
  • 1. MD 5関数脆弱性
  • 2.PHP特性
  • 3.MD 5衝突
  • 1.MD 5関数の脆弱性
    $_GET['a'] != $_GET['b'] 
    &&
    MD5($_GET['a']) == MD5($_GET['b'])
    

    上記の式を成立させるには、aとbの値は等しくないが、md 5後の値は等しい.==比較なので、値が等しいかどうかだけを判断し、タイプが同じかどうかは判断しません.異なるタイプが同じタイプに変換されてから比較され、PHPがハッシュ文字列を処理すると、0Eの先頭のハッシュ値が0と解釈されます.したがって、両方の値がmd 5を通過した後の値が0Eで始まると、等しい.
    md 5(str)QNKCDZO 240610708 s 878926199 a s 155964671 a s 214587387 a s 214587387 a sha 1(str)sha 1後0 Eでsha 1(‘aaroZmOk’)sha 1(‘aaK 1 STfY’)sha 1(‘aaO 8 zKZF’)sha 1(‘aa 3 OFF 9 m’)
    最後にa=QNKCDZO&&b=240610708を構成すれば迂回することができる.
    2.PHP特性
    $_POST['a1']!==$_POST['a2'] 
    && 
    md5($_POST['a1'])===md5($_POST['a2'])
    

    成立条件はa 1とa 2の値は等しくないがmd 5後の値は等しい.ここでは===なので、比較値が等しいだけでなく、値タイプが同じかどうかも比較できます.0 Eはここでは使用できません.phpではmd 5もsha 1も配列を処理できずNULLを返すのでa1[]=1&&a2[]=2を構築すれば迂回できる.
    3.MD 5衝突
    (string)$_POST['a1']!==(string)$_POST['a2'] 
    && 
    md5($_POST['a1'])===md5($_POST['a2'])
    }
    

    これと2つ目の違いは,入力された最後に文字列に変換して比較するので,配列はだめである.2つのMD 5の値が同じ異なる文字列しか構築できません.次はurl符号化された2つの値のセットです.
    param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
    param2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
    
    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