所以我正在做一些 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
一般的想法是找到一个以 0e
开头的值。它的哈希值也以 0e
开头.页面给出了0e001233333333333334557778889
的例子产生 0e434041524824285414215559233446
的哈希值
这种记数法称为科学记数法。要了解为什么这种类型的杂耍有效,您需要了解这两个数字是什么。如果我们将科学记数法转换为十进制,那就很明显了。0e001233333333333334557778889
= 0×1012333333333333345577788890e434041524824285414215559233446
= 0×10434041524824285414215559233446
从小学数学我们知道,任何乘以 0 的结果都是 0,这意味着两个数字都是 0。$_GET
中提供的所有输入或 $_POST
superglobals 是字符串类型。
多亏了 PHP 的类型杂耍系统,两个字符串都被视为用科学记数法编写的浮点数,当转换为浮点数时,它们都等于 0。
关于php - 通过 url 将整数传递给 php $_GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56487143/