php处理字符串时存在一个缺陷问题,如果字符串为“1e1”,本该是一个正常的字符串,但是php会将它认为是科学计数法里面的e;
也就是按照数学的科学计数法来说:1e1=10^1=10,因此php会把这个字符串里面的1e1进行科学计数法计算,得出来就为“10”,即遇到“0e212”这些字符串直接看作为“0”.
CTF中遇到的一些代码审计题,如果出题者想利用这一缺陷,往往会配合MD5值来运用。
它会让你使两个GET或者POST变量的值不相等,但是让他们的MD5值相等,正常来说不可能,很难找出字符串不等且MD5相等的两个字符串。
因为MD5值为数字加字母,因此我们就可以使用php的这个缺陷,让MD5的第一位为数字0,然后第二位数字为e就行了,后面不管是什么计算出来都是0,因此就达到 MD5值相等的目的了。
这里附上一些字符串进行MD5加密后前两位为“0e”的一个地址:
/Primzahl/p/6018158.html
配合一个CTF进行讲解:
bugkuctf的web题:备份是个好习惯
进去之后发现没什么线索,备份是个提示,直接御剑扫,扫出备份文件
最后扫出了一个bak备份文件,打开是index.php的代码
很明显,大致的意思是要让两个get变量key1,key2的MD5值相等且本身不相等,并且这里用str_replace将key关键字替换为空;
这里就可以使用双写绕过,kekeyy即可;
然后我们利用php科学计数法缺陷,从我上面给的地址里面找两个字符串分别赋值给kekeyy1,kekeyy2即可
然后满足了if条件,flag就出来了!