常见的PHP漏洞

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

1、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
}
2、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
]
3、in_array漏洞
in_array中是先将类型转为整形,再进行判断

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0

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

bool(true)
4、switch漏洞
switch中是先将类型转为整形,再进行判断

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0

<?php
$i ="abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i是比3小的数";
break;
case 3:
echo "i等于3";
}
结果如下

i是比3小的数
5、intval强转漏洞

<?php
var_dump(intval('2')); //2
var_dump(intval('3abcd')); //3
var_dump(intval('abcd')); //0
...
————————————————
版权声明:本文为CSDN博主「笑对丶人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35458793/article/details/115293544

posted @   寂寞圣贤  阅读(224)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示