PHP内置函数的松散性和弱类型之我是False

admin 2022年11月11日18:52:12SecIN安全技术社区PHP内置函数的松散性和弱类型之我是False已关闭评论14 views2283字阅读7分36秒阅读模式

文章源自于个人博客:http://vfree.ltd/

1.PHP内置函数的松散性

1.1 strcmp

php
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/

PHP内置函数的松散性和弱类型之我是False

1.2 sha1

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

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

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

PHP内置函数的松散性和弱类型之我是False

1.3 md5弱比较

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

md5用于将字符串处理成md5格式,和sha1的一样,md5不能处理数组,遇到数组也会返回一个NULL或者False

PHP内置函数的松散性和弱类型之我是False

同时,php在处理0e开头的字符串的时候,会把整个字符串当成"科学计数法"处理,0e开头的字符串会被当成0处理
ctf题目中一般会给出这样子的要求

php
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值 |
| -------------- | -------------------------------------------------------------------------------------------------------- |
| QNKCDZO | 0e830400451993494058024219903391 |
| 240610708 | 0e462097431906509019562988736854 |
| s878926199a | 0e545993274517709034328855841020 |
| s155964671a | 0e342768416822451524974117254469 |
| s214587387a | 0e848240448830537924465865611904 |
| s214587387a | 0e848240448830537924465865611904 |
| s878926199a | 0e545993274517709034328855841020 |
| s878926199a | 0e545993274517709034328855841020 |
| s1665632922a | 0e731198061491163073197128363787 |
| s1836677006a | 0e481036490867661113260034900752 |
| 更多请查看 | https://www.cnblogs.com/apolloren/p/14139516.html |

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

PHP内置函数的松散性和弱类型之我是False

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

1.5 md5强比较

md5强比较就是两个md5值对比事,还会对比上数据的类型是否相等,将会用到 "===" 三个问号也就是说,上面的科学计数法的方法在强比较不再有效

php
<?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

PHP内置函数的松散性和弱类型之我是False

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

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月11日18:52:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  PHP内置函数的松散性和弱类型之我是False https://cn-sec.com/archives/752217.html