php特性和缺陷
php特性和缺陷
前言:今天对php由于本身特性所产生的一些过滤绕过机制进行讲解,也算是之前漏洞练习博客的理
论支撑
1.1 ==和===的区别
==为等于,===为全等
这个区别之前也在其他博客里写过,php中==只比对值是否相同,不管其类型,比如我们让其来判断
两个数字是否相等,无论是整型,还是字符,还是浮点型,只要值相同,判断结果就会正确。
在php中,除了判断值外还要判断类型的比较运算符为===全等和!=== 不全等两种,其余比较运算
符都是只根据其值来进行判断
<?php
header("Content-Type: text/html; charset=utf-8");
if ('1 admin' == 1) {
echo "正确";
}
对于上述情况,输出结果为正确,原因:在PHP中,当一个字符串与整数进行比较时,PHP会尝试将
字符串转换为整数进行比较。 首先使用==,可以将字符串和数字进行比较,对字符串先进
行解析,从左往右解析到的一个数字是1,停止,将整个字符串转换为数字1再参与比较,所以我们
得到的值是正确。
同样的道理,我们这样
<?php
header("Content-Type: text/html; charset=utf-8");
if ("+1" == 1) {
echo "正确";
}
得到的结果也是正确,原因: php检测到字符串以+开头,这是一个正号,表示接下来的数字是正数
字符串+1的剩余部分是有效正数1,所以php会将字符串+1转换为数字1再进行比较,最后得到结果
正确。
对于===严格比较运算符来说,在判断相等时不仅需要值相同,还需要类型相同,所以像上面的字符
串与整形进行比较或者浮点与整形进行比较就不可取了
注意 通过url中查询字符串传入的数据都会被保存为字符串类型
通过php此特性,我们就可以对某些使用==进行过滤的程序进行绕过,从而传入我们想要传入的数据
1.1 MD5函数缺陷绕过
MD5函数是对数据进行md5加密的,在php中,md5加密格式位
我们在通过md5值进行判断时,如果这样写
<?php
header("Content-Type: text/html; charset=utf-8");
if ($_GET["username"] != $_GET["password"]) {
if (MD5($_GET["username"]) == MD5($_GET["password"])) {
echo "ok";
}
}
我们先判断内容不相等后,再编码成md5进行判断,判断相等 才会输出ok
情况1:
当我们username 和password分别传入 240610708 QNKCDZO 输出结果是ok,为什么会有这种情
况呢?我们先对传入的username进行md5编码,编码结果为
0e462097431906509019562988736854
再对传入的password进行编码,编码结果为 0e830400451993494058024219903391 由于是==判
断,截取到了字符前的第一个数字--0 ,所以最后的判断就是(0==0),自然输出结果为true。
情况2
首先我们要先名吧用get方式这样传入数据是什么情况
http://example.com/script.php?name[]=1
当我们这样传入时,php将name解析为一个第一个值为1的一个数组,所以我们像这样输出
echo $_GET[];是无法正常输出的,由于传入的是数组,所以需要这样输出
echo $_GET["name"][0];
对于md5函数来说,他是无法实现对数组进行加密的,所以当我们传入的数据为数组时,加密后的值
为null,对于此特性,我们再看我们上面的代码,当我们传入 username[]=1 password[]=2 时,会
输出ok,原因就是md5无法对数组进行加密,所以两个数组的加密结果都为null.因此判断相等,我
们还需要注意的是