前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP内置函数的松散性和弱类型

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

作者头像
vFREE
发布2021-12-20 21:26:33
7690
发布2021-12-20 21:26:33
举报
文章被收录于专栏:博客原创文章博客原创文章

1.PHP内置函数的松散性

1.1 strcmp

代码语言:javascript
复制
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

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

sha1将字符串转换成对应的二进制或者十六进制 但是如果转换数组的话,不会立刻停止运行php程序,而是抛出warning,返回一个NULL或者False 当遇到ctf题目含有sha1函数做对比时,要考虑到这个不能处理数组的问题 题目地址:暂无(敬请关注 http://ctf.vfree.ltd/)

1.3 md5弱比较

代码语言:javascript
复制
md5(string,[True|False])
// 当第二个参数为True时,则用二进制转换字符串
// 当第二个参数False时,则用十六进制转换字符

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

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

代码语言:javascript
复制
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

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

1.5 md5强比较

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

代码语言:javascript
复制
<?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/)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.PHP内置函数的松散性
    • 1.1 strcmp
    • 1.2 sha1
    • 1.3 md5弱比较
    • 1.5 md5强比较
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档