【问题标题】:Passing integer to php $_GET via url通过 url 将整数传递给 php $_GET
【发布时间】:2019-10-22 12:53:57
【问题描述】:

所以我正在做一些 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?或者还有其他方法吗?

【问题讨论】:

  • 也许只有我一个人,但什么是 CTF?
  • 另外,除非发生冲突,否则$_GET['var1'] 不能等于hash('md4', $_GET['var1'])
  • @Ibu CTF 正在夺旗。此外,也有可能的情况。假设 0 的 md4 哈希是 ea5698173fc6fdbe30a9af462b9fc847。在 php 中,如果你比较 0 和一个字符串,如果字符串不以 int 开头,它将总是返回 true
  • 你有没有试过什么都不通过?这应该让你两边都为 null。

标签: php type-conversion ctf


【解决方案1】:

这个CTF的答案可以在这里找到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$_POST 超全局变量中提供的所有输入都是字符串类型。 由于 PHP 的类型杂耍系统,两个字符串都被视为用科学计数法编写的浮点数,当转换为浮点数时,它们都等于 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多