江苏工匠杯easyphp 解题记录
今天碰到这题,感觉有很多知识点,就决定记录一下 这里我用的是攻防世界的靶场 easyphp——攻防世界 题目分析 上来就分析php代码,那就逐行看一下,可以知道最终目的是要使key1和key2都是1 发现文末有一行Emmm...,再根据上面代码推断即可知道是第一个if判断没有进入导致的 而要进入也很简单,先来看一下代码 if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3) 可以看到a不能为空,同时要在字符数量小于等于3的情况下大于6000000,因此容易想到利用科学计数法。 构造第一个payload a=6e9 接着看第二个if md5推算 if(isset($b) && '8b184b' === substr(md5($b),-6,6)) 可以看到第二个if需要利用md5解码,先去看一下8b184b对应字符串。这里我们可以通过简单的Python脚本来解决这个哈希碰撞 import random import hashlib value = "8b184b" while 1: plainText = random.randint(10**11, 10**12 - 1) plainText = str(plainText) MD5 = hashlib.md5() MD5.update(plainText.encode(encoding='utf-8')) cipherText = MD5.hexdigest() if cipherText[-6:]==value : print("碰撞成功:") print("密文为:"+cipherText) print("明文为:"+plainText) break else: print("碰撞中.....") 密文:842fc2485a1faa0681f78d3e098b184b 明文:792616362347 可以得到结果。但考虑到计算量比较大,所以对代码进行一些简化,只截取8b184b这部分进行判断,不做满位拓展 import hashlib for i in range(1000000): m2 = hashlib.md5() m2.update(str(i).encode()) if m2.hexdigest()[-6:] == "8b184b": print(i) break 得到结果为53724,计算量明显缩小 ...