所以我正在做一些 CTF,挑战之一是关于 php 类型杂耍。代码看起来像这样
if($_GET['var1'] == hash('md4', $_GET['var1']))
{
//print flag
}
所以我 80% 确定我需要传入一个整数,这样它就会是真的,但我能操作的只是 url。我尝试使用 python request 来做到这一点,但仍然失败。
import requests
url = 'http://example.com'
params = dict(var1=0)
r = requests.get(url=url, params=params)
是否有任何特殊情况,php 会将传入 GET 数组的变量视为 int ?或者还有其他方法可以做到这一点吗?
这个CTF的答案可以在这里找到https://medium.com/@Asm0d3us/part-1-php-tricks-in-web-ctf-challenges-e1981475b3e4 https://medium.com/@Asm0d3us/part-1-php-tricks-in-web-ctf-challenges-e1981475b3e4
总体思路是找到一个以0e
它的哈希值也以0e
。该页面给出了一个示例0e001233333333333334557778889
它产生一个哈希值0e434041524824285414215559233446
这种记数法称为科学记数法。要理解为什么这种类型杂耍会起作用,您需要了解这两个数字是什么。如果我们从科学记数法转换为十进制,那就很明显了。
0e001233333333333334557778889
= 0×101233333333333334557778889
0e434041524824285414215559233446
= 0×10434041524824285414215559233446
从小学数学我们知道,任何数乘以0都是0,也就是说两个数都是0。
中提供的所有输入$_GET
or $_POST
超全局变量是字符串类型。
感谢 PHP 的类型杂耍系统,这两个字符串都被视为以科学计数法编写的浮点数,并且当转换为 float 时,它们都等于 0。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)