前言
线上赛的时候,没有充裕的时间打,后期做了做,虽以记之.
时间好快,2018已经过去了1/4,加油.
欢迎进群交流: 363034250
题目及知识点
题目描述
该题目一共分为三关,前两关都是基本的php中md5()函数特性利用.下面分别对每一关进行解析.
第一关
源码
<h2>The Fisrt Easy Md5 Challenge</h2>
<!--
if($_POST['param1']!=$_POST['param2'] && md5($_POST['param1'])==md5($_POST['param2'])){
die("success!");
}
-->
分析
==弱类型判断,php在比较一个数字和一个字符串时,字符串会转换为数值与前面的数字进行比较;
使用常见的数字和字符串即可绕过:
param1=240610708,param2=QNKCDZO,这两个参数不相等;
md5(’240610708′) 的结果是:0e462097431906509019562988736854
md5(‘QNKCDZO’) 的结果是:0e830400451993494058024219903391
看到0e开头,代表是科学计数法,也就是说0的多少次方都是0,所以弱类型==绕过,并且这两个参数的值也不相等,可以绕过;
第二关
源码
<h2>The Second Easy Md5 Challenge</h2>
<!--
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
-->
分析
===强类型,不再如第一关一样可以进行类型转换,md5的值不进行类型转换,当作字符串处理.需要用数组进行绕过,md5()函数对两个数组判为相等
传入param1[]=1¶m2[]=2,如图:
这样可以绕过第二关进入第三关;
第三关
源码
<h2>Md5 Revenge Now!</h2>
<!--
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!);
}
-->
分析
在强类型比较的基础上,并将比较的类型转换成字符串,这样前面的方法就都不行了;这时需要通过md5碰撞进行绕过:
md5碰撞定义:存在两个(或更多)不同的串得出相同的MD5值.
使用fastcoll生成两个md5值相等的文件:
需要将得到的两个md5值相同的文件中的内容转化为url编码:
#encoding=utf-8
import urllib
file1 = open("p1.txt", "rb")
file2 = open("p2.txt", "rb")
res1 = file1.read()
res2 = file2.read()
s1 = urllib.quote(res1)
s2 = urllib.quote(res2)
file1.close()
file2.close()
print 'param1=%s'% s1 +'&'+'param2=%s'% s2
得到flag: