从找相同MD5到php弱类型--浅析一种绕过php逻辑判断的一般方法

先贴个例子

山东省第七届网安技能赛Web-babyWeb2(35pts)

再回头看这题需要找到自身不同,但哈希值相同的字符串。这种事本身很难出现,于是要想办法绕过。

本题对萌新讲在逻辑上多了一点弯。即页面使用参数id接收用户输入然后用parse_str()来解析用户输入。但是parse_str()函数由于没有指定存储这些数据的数组,于是$key参数被覆盖并用来存储收到的数据。所以本题在传值时应写为http://47.105.148.65:29002/?id=key[99]=你的值

首先,md5(aabg7XSs)=0E087386482136013740957780965295。显然对于md5($key[99])==md5('aabg7XSs')这个等式来讲,右边就会变成零了,这是因为==只用于数字比较大小,php会把等号两边的都行全部转化为数字,即md5(aabg7XSs)=0E087386482136013740957780965295→0的87...295次方,还是等于0。也就是说等式右边等于零。所以我们只需要故技重施,找个字符串算完MD5之后以oe开头就行。这种字符串在网上可以搜得到,例如QNKCDZO,于是payload可以为http://47.105.148.65:29002/?id=key[99]=QNKCDZO。

----------------------------------------------分割线-----------------------------------------------------------------------------------------


补充说明:

1、由于PHP是弱类型语音,即当输入的参数不符合要求时,程序自己会对数据进行处理,使之变得可以执行。

例如,当我们把一个字符串送给了一个应当收数值的地方,其结果和类型如下:

如果该字符串没有包含'.','e','E'并且其数值在整形的范围之内,则该字符串被当作int来取值,其他所有情况下都被作为float来取值。也就是说,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

例子:

图片来自腾讯云社区 企鹅号小编

2、各种以0e开头的md5总结

https://www.cnblogs.com/Oran9e/p/6537204.html

3、关于==和===

==用于数值型比较

  详细解释:

php关于==号是这样处理的,如果一边是整型,另一边也需要是整型。 本题中md5(aabg7XSs)=0E087386482136013740957780965295,它以0开头,故被识别为数字,所以实质上变成了科学计数法的数字,而且底数是0,故右边等于零,最终为整型变量。(或许对于左边会有一点的影响?)

===用于字符串比较(严格比较)

你可能感兴趣的:(从找相同MD5到php弱类型--浅析一种绕过php逻辑判断的一般方法)