第二屆強網杯 web簽到題
阿新 • • 發佈:2019-02-07
前言
線上賽的時候,沒有充裕的時間打,後期做了做,雖以記之.
時間好快,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: