4

所以我正在做一些 CTF,其中一个挑战是关于 php 类型的杂耍。代码看起来像这样

if($_GET['var1'] == hash('md4', $_GET['var1']))
{
//print flag
}

所以我 80% 确定我需要传入一个整数,所以这是真的,但我能操纵的只是 url。我尝试使用 python 请求来做到这一点,但仍然失败。

import requests
url = 'http://example.com'
params = dict(var1=0)
r = requests.get(url=url, params=params)

是否有任何特殊情况下 php 会将传入 GET 数组的变量视为 int?还是有其他方法可以做到这一点?

4

1 回答 1

1

这个 CTF 的答案可以在这里找到https://medium.com/@Asm0d3us/part-1-php-tricks-in-web-ctf-challenges-e1981475b3e4

一般的想法是找到一个以 开头的值,0e其哈希也以0e. 该页面给出了一个示例,0e001233333333333334557778889该示例产生的哈希值为0e434041524824285414215559233446

这种记数法称为科学记数法。要了解为什么这种类型的杂耍有效,您需要了解这两个数字是什么。如果我们将科学记数法转换为十进制,那就很明显了。

0e001233333333333334557778889= 0×10 1233333333333334557778889
0e434041524824285414215559233446 = 0×10 434041524824285414215559233446

从小学数学我们知道任何乘以 0 都是 0,这意味着两个数字都是 0。

$_GET或超全局变量中提供的所有输入$_POST都是字符串类型。由于 PHP 的类型杂耍系统,两个字符串都被视为以科学计数法编写的浮点数,当转换为浮点数时,它们都等于 0。

于 2020-05-20T20:44:12.050 回答