1. 程式人生 > >第二屆強網杯 web簽到題

第二屆強網杯 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: