通过url

时间:2019-06-07 02:09:17

标签: php

所以我正在做一些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?还是有其他方法可以做到?

1 个答案:

答案 0 :(得分:0)

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

中找到

通常的想法是找到一个以0e开头的值,并且其哈希也以0e开头的值。该页面给出了0e001233333333333334557778889的示例,该示例产生了0e434041524824285414215559233446的哈希值

此表示法称为科学表示法。要了解这种类型的杂耍为什么起作用,您需要了解这两个数字是什么。如果我们将科学计数法转换为十进制数,则显而易见。

0e001233333333333334557778889 = 0×10 1233333333333334557557778889
0e434041524824285414215559233446 = 0×10 434041524824285414215559233446

根据小学数学,我们知道乘以0的任何值为0,这意味着两个数字均为0。

$_GET$_POST超全局变量中提供的所有输入均为字符串类型。 由于使用了PHP的类型处理系统,两个字符串都被当作以科学计数法表示的浮点数,并且在强制转换为浮点时,它们都等于0。