PHP内置函数的松散性和弱类型

vFREE
2021-12-09 / 0 评论 / 30 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月09日,已超过291天没有更新,若内容或图片失效,请留言反馈。

1.PHP内置函数的松散性

1.1 strcmp

strcmp(str1,str2);

strcmp是php中的一个比较函数,如果str1大于str2,就会返回大于1的数值,如果str2大于str1,返回一个小于0的数值,相等则等于0

5.2中先将两个参数转换成string类型
5.3.3中,如果是字符和数组比较,直接返回0
5.5中,如果不是string类型,则直接return

也就是说,如果当一道ctf题目要求使用strcmp对两个参数进行比较时,要求一样,但是内容不能一样,这时可以想到strcmp的松散性,传入一个数组即可

题目地址: http://ctf.vfree.ltd:9009/

1.2 sha1

sha1(str1,[True|False])
// 当第二个参数为True时,则用二进制转换字符串
// 当第二个参数False时,则用十六进制转换字符

sha1将字符串转换成对应的二进制或者十六进制
但是如果转换数组的话,不会立刻停止运行php程序,而是抛出warning,返回一个NULL或者False

当遇到ctf题目含有sha1函数做对比时,要考虑到这个不能处理数组的问题
题目地址:暂无(敬请关注 http://ctf.vfree.ltd/)

1.3 md5弱比较

md5(string,[True|False])
// 当第二个参数为True时,则用二进制转换字符串
// 当第二个参数False时,则用十六进制转换字符
md5用于将字符串处理成md5格式,和sha1的一样,md5不能处理数组,遇到数组也会返回一个NULL或者False

同时,php在处理0e开头的字符串的时候,会把整个字符串当成"科学计数法"处理,0e开头的字符串会被当成0处理
ctf题目中一般会给出这样子的要求
if($_GET['num1'] != $_GET['num2']){
    if(md5($_GET['num1']) == md5($_GET['num2'])){
        echo 'flag in there';
    }
}
  • 代码大致意思是,传入的值num1和num2不能相等,但是使用md5函数值将两个值转换成md5后,进行对比,如果一样,就输出flag in there!!!
  • 可是众所周知,md5的值是唯一性的,不同的值对应不同的md5,即便是查了一个字母,出来的md5值也会不一样,所以这一题就需要利用md5的弱比较,利用科学计数法,这里列举十个通过md5函数转换后时0e开头的字符串~
字符串md5值
QNKCDZO0e830400451993494058024219903391
2406107080e462097431906509019562988736854
s878926199a0e545993274517709034328855841020
s155964671a0e342768416822451524974117254469
s214587387a0e848240448830537924465865611904
s214587387a0e848240448830537924465865611904
s878926199a0e545993274517709034328855841020
s878926199a0e545993274517709034328855841020
s1665632922a0e731198061491163073197128363787
s1836677006a0e481036490867661113260034900752
更多请查看https://www.cnblogs.com/apolloren/p/14139516.html

随便传入上面列出来的两个字符串,比如QNKCDZO和240610708,这样子他们转换出来的md5值开头就会带有0e,0e会被识别成科学计数法,也就是等于0,两个0相等,就会输出flag

题目地址:暂无(敬请关注 http://ctf.vfree.ltd/)

1.5 md5强比较

md5强比较就是两个md5值对比事,还会对比上数据的类型是否相等,将会用到 "===" 三个问号也就是说,上面的科学计数法的方法在强比较不再有效
<?php
$num1 = 'QNKCDZO';
$num2 = '240610708';
if($num1 != $num2){
    if(md5($num1) === md5($num2)){
        echo 'flag in there';
    }else{
        echo "md5值不相等";
}
}else{
    echo '值不能相等';
}
?>
结果输出:md5值不相等

仔细看第4行的两个等于号变成了三个等于号,也就是说会比较num1和num2的数据类型是否想等,很明显,一个字符串,一个数字,固然不相等,此时,根据上面讲到的md5函数的松散性,当传入一个数组时,会等于False或者NULL,传入两个数组就可以绕过,数组和数组相比,类型相等,md5处理数组会返回False或者NULL,这样子值就相等了

转成url就是/?num1[]=1&num2[]=2

题目地址:暂无(敬请关注 http://ctf.vfree.ltd/)
0

评论 (0)

取消