小言_互联网的博客

这些常见的PHP漏洞,如果你不知道,就别说自己是个攻城狮

375人阅读  评论(0)

 前言: 因为PHP是若类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要关注。

目录

一、md5加密漏洞

二、is_numeric漏洞

三、in_array漏洞

四、switch漏洞

五、intval强转漏洞


一、md5加密漏洞

  • 比较哈希字符串的时候,php程序把每一个以“0x”开头的哈希值都解释为科学计数法0的多少次方,恒为0
  • 所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么php将会认为他们相同。
  • 另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞

  
  1. <?php
  2. $str1 = 's878926199a';
  3. $str2 = 's214587387a';
  4. echo json_encode([
  5. 'md5_str1' => md5($str1),
  6. 'md5_str2' => md5($str2),
  7. 'bool' => md5($str1) == md5($str2)
  8. ]);
  • 结果如下,两个值加密后竟然相等
  • 缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了

  
  1. {
  2. md5_str1: "0e545993274517709034328855841020",
  3. md5_str2: "0e848240448830537924465865611904",
  4. bool: true
  5. }

二、is_numeric漏洞

  • 会忽视0x这种十六进制的数
  • 容易引发sql注入操作,暴漏敏感信息

  
  1. echo json_encode([
  2. is_numeric( 233333),
  3. is_numeric( '233333'),
  4. is_numeric( 0x233333),
  5. is_numeric( '0x233333'),
  6. is_numeric( '233333abc'),
  7. ]);
  • 结果如下
  • 16进制数0x61646D696EASII码对应的值是admin
  • 如果我们执行了后面这条命令的话:SELECT * FROM tp_user where username=0x61646D696E,结果不言而喻

  
  1. [
  2. true,
  3. true,
  4. true,
  5. false,
  6. false
  7. ]

三、in_array漏洞

  • in_array中是先将类型转为整形,再进行判断
  • PHP作为弱类型语言,类型转换的时候,会有很大漏洞
  • 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0

  
  1. <?php
  2. var_dump(in_array( "2%20and%20%", [ 0, 2, 3]));
  • 结果如下
bool(true)

四、switch漏洞

  • switch中是先将类型转为整形,再进行判断
  • PHP作为弱类型语言,类型转换的时候,会有很大漏洞
  • 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0

  
  1. <?php
  2. $i = "abc";
  3. switch ($i) {
  4. case 0:
  5. case 1:
  6. case 2:
  7. echo "i是比3小的数";
  8. break;
  9. case 3:
  10. echo "i等于3";
  11. }
  • 结果如下
i是比3小的数

五、intval强转漏洞

  • PHP作为弱类型语言,类型转换的时候,会有很大漏洞
  • 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0

  
  1. <?php
  2. var_dump(intval( '2')); //2
  3. var_dump(intval( '3abcd')); //3
  4. var_dump(intval( 'abcd')); //0

 


转载:https://blog.csdn.net/weixin_41635750/article/details/109822456
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场