攻防世界: easyphp

上述就是服务端逻辑的源码展示。
因此这里主要的任务就是控制变量a、b、c的值,使得key1与key2都为真。
这里涉及到以下知识点:
科学计数的表示:例如6e7表示6×1076 \times 10^76×107 。
substr函数的功能:substr(字符串, 开始索引, 长度)。其中开始索引为负数的时候表示从末尾开始数(-1是最后一个)。
PHP语言的关联数组,他的一个简单的例子如下:
php$person = [ "name" => "张三", "age" => 25, "city" => "北京" ]; // 可以通过这种方式,与pyhon的字典通过键值对的形式访问相似 echo $person["name"]; // "张三" echo $person["age"]; // 25PHP语言的隐式类型转换
当PHP的让一个字符串与数字进行比较(==,>, < 等符号)的时候,会将字符串转换为数字。
PHP语言的松散比较与严格比较
松散比较(即==符号)
当出现松散比较的时候,如果类型不相同,首先会进行类型的转换,然后再进行比较,比如: "1" == 0 就会转换为相当于python语言的 1==0(将字符串转换为数字)。
严格比较(即===符号)
这种比较需要类型和值都是一样的时候,结果才为True。
开始分析
-
如下图, 这里要求a的值大于6000000,且长度不超过3,因此我们可以使用科学计数的表示方式:6e7即可通过。

-
如下图,这里要求b变量的经过md5得hash算法后,最后6位得值是8b184b。

- 第一想法是使用123456,1 等值通过在线得md5加密网站看看结果,发现并不是。
- 第二个想法,我使用了常见得用户名(来自文件)来作为输入,来判断后面6位得结果是否是8b184b,跑完了常见的,发现不是。
- 最后尝试从0到10000000进行枚举,查看是都有符合要求的数字
其中测试的python代码如下:
pyhtonimport hashlib # path = "./file/simple-users.txt" # with open(path, "r") as f: # for line in f.readlines(): # tmp = hashlib.md5(line.encode()).hexdigest()[-6:] # # or tmp == '0b15af' # if tmp == "8b184b": # print(line) # break for i in range(10000000): tmp = hashlib.md5(str(i).encode()).hexdigest()[-6:] if tmp == "8b184b": print(i) break # 输出的值为53724输出的值为53724
-
最后就是c变量的值了。从代码来看,c是一个json字符串转换而来。它会将
{}这种类型转换为一个关联数组。

-
在第一个if中,学要确保
$c["m"]不是数字,却要大于2022,这里就涉及到前面说的隐式转换了。因此其值可以为"2023N" -
第二个if,需要确保
$c["n"]是一个长度为2的数组,且数组的第0个元素依然是数组。那可以考虑这个值:[[],"DGJJ"] -
这里要求数组中含有DGGJ,同时又不含有DGGJ,这怎么办呢?如下图所示:

这就需要用到前面的知识点了,松散比较和严格比较。array_search使用的是松散比较,因此可以考虑将数组的替换为:
[[],0]这样在array_search的时候,会将DGGJ转换为数字,"DGGJ" == 0, 转换后的结果就是 0==0,因此能通过即包含又不包含DGGJ这个字符串。
综上,最后c的值为{"m":"2023N","n":[[],0]}。
拿到flag
- 提交参数

-
得到结果
