第二届强网杯 web签到题

前言

线上赛的时候,没有充裕的时间打,后期做了做,虽以记之.

时间好快,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&param2[]=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:

猜你喜欢

转载自blog.csdn.net/hardhard123/article/details/79796355