前言: 因为PHP是若类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要关注。
目录
一、md5加密漏洞
- 比较哈希字符串的时候,php程序把每一个以“0x”开头的哈希值都解释为科学计数法0的多少次方,恒为0
- 所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么php将会认为他们相同。
- 另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞
  
   - 
    
     
    
    
     
      <?php
     
    
- 
    
     
    
    
     
      $str1 = 
      's878926199a';
     
    
- 
    
     
    
    
     
      $str2 = 
      's214587387a';
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      echo json_encode([
     
    
- 
    
     
    
    
         
      'md5_str1' => md5($str1),
     
    
- 
    
     
    
    
         
      'md5_str2' => md5($str2),
     
    
- 
    
     
    
    
         
      'bool' => md5($str1) == md5($str2)
     
    
- 
    
     
    
    
     
      ]);
     
    
- 结果如下,两个值加密后竟然相等
- 缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了
  
   - 
    
     
    
    
     
      {
     
    
- 
    
     
    
    
     
          md5_str1: 
      "0e545993274517709034328855841020",
     
    
- 
    
     
    
    
     
          md5_str2: 
      "0e848240448830537924465865611904",
     
    
- 
    
     
    
    
     
          bool: 
      true
     
    
- 
    
     
    
    
     
      }
     
    
二、is_numeric漏洞
- 会忽视0x这种十六进制的数
- 容易引发sql注入操作,暴漏敏感信息
  
   - 
    
     
    
    
     
      echo json_encode([
     
    
- 
    
     
    
    
     
          is_numeric(
      233333),
     
    
- 
    
     
    
    
     
          is_numeric(
      '233333'),
     
    
- 
    
     
    
    
     
          is_numeric(
      0x233333),
     
    
- 
    
     
    
    
     
          is_numeric(
      '0x233333'),
     
    
- 
    
     
    
    
     
          is_numeric(
      '233333abc'),
     
    
- 
    
     
    
    
     
      ]);
     
    
- 结果如下
- 16进制数0x61646D696EASII码对应的值是admin
- 如果我们执行了后面这条命令的话:SELECT * FROM tp_user where username=0x61646D696E,结果不言而喻
  
   - 
    
     
    
    
     
      [
     
    
- 
    
     
    
    
         
      true,
     
    
- 
    
     
    
    
         
      true,
     
    
- 
    
     
    
    
         
      true,
     
    
- 
    
     
    
    
         
      false,
     
    
- 
    
     
    
    
         
      false
     
    
- 
    
     
    
    
     
      ]
     
    
三、in_array漏洞
- in_array中是先将类型转为整形,再进行判断
- PHP作为弱类型语言,类型转换的时候,会有很大漏洞
- 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0
  
   - 
    
     
    
    
     
      <?php
     
    
- 
    
     
    
    
     
      var_dump(in_array(
      "2%20and%20%", [
      0,
      2,
      3]));
     
    
- 结果如下
bool(true)四、switch漏洞
- switch中是先将类型转为整形,再进行判断
- PHP作为弱类型语言,类型转换的时候,会有很大漏洞
- 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0
  
   - 
    
     
    
    
     
      <?php
     
    
- 
    
     
    
    
     
      $i =
      "abc";
     
    
- 
    
     
    
    
     
      switch ($i) {
     
    
- 
    
     
    
    
         
      case 
      0:
     
    
- 
    
     
    
    
         
      case 
      1:
     
    
- 
    
     
    
    
         
      case 
      2:
     
    
- 
    
     
    
    
             
      echo 
      "i是比3小的数";
     
    
- 
    
     
    
    
             
      break;
     
    
- 
    
     
    
    
         
      case 
      3:
     
    
- 
    
     
    
    
             
      echo 
      "i等于3";
     
    
- 
    
     
    
    
     
      }
     
    
- 结果如下
i是比3小的数五、intval强转漏洞
- PHP作为弱类型语言,类型转换的时候,会有很大漏洞
- 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0
  
   - 
    
     
    
    
     
      <?php
     
    
- 
    
     
    
    
     
      var_dump(intval(
      '2')); 
      //2
     
    
- 
    
     
    
    
     
      var_dump(intval(
      '3abcd')); 
      //3
     
    
- 
    
     
    
    
     
      var_dump(intval(
      'abcd')); 
      //0
     
    
转载:https://blog.csdn.net/weixin_41635750/article/details/109822456
查看评论
					