前置知識
include:包含一個文件,也可以包含一些其他東西,后續用到再解析
substr:對字符串進行切片,第一個參數是字符串,第二第三個參數出從第a個索引開始切n個,索引從0開始計數。
例如:$a = substr("012345", 2, 3);
? $a === '234'
intval:其他類型轉換為int類型,不可用于array和object。第一個參數是需要轉換的值,第二個可選參數可以制定進制,默認是十進制。
例如:intval(“a”) ==> 0,intval(“123a”) ? 123,后續的非數字將被截斷,Intval與 ==
搭配可能會出現漏洞,后續用到再說。
信息收集
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){echo $flag;}}
關鍵在于這里,只要按照它的要求跑出這個token即可。所以我們自己構造代碼,隨機生成md5,檢查md5是否滿足要求,若滿足要求,輸出md5對應的字符串。
解題:
為什么是自己跑md5,而不是爆破網站,因為在現實情況下,頻繁訪問網站可能會被ban掉IP。還有一個原因是,爆破網站比本地爆破慢太多了
我只會python,所以用python寫的,如果用php可以直接抄寫它的判斷語句,不用翻譯
import itertools
import hashlib
import string
def md5(s):if type(s) != bytes:s = bytes(s, encoding="utf-8")hash_md5 = hashlib.md5()hash_md5.update(s)return hash_md5.hexdigest()def web23():dir = string.digits + string.ascii_uppercase + string.ascii_lowercase# 這里我不知道多少位能滿足需求,所以寫成變量,如果1-3位跑不出來,我可以跑更多位的for i in range(1, 4):for comb in itertools.combinations_with_replacement(dir, i):str_comb = "".join(comb)v_md5 = md5(str_comb)if v_md5[1] == v_md5[14] == v_md5[17]:try: # 除零異常,字符串無法轉int異常,我懶得處理了,統統忽略就行了if ((int(v_md5[1])+int(v_md5[14])+int(v_md5[17]))/int(v_md5[1])==int(v_md5[31])):print(str_comb)print(v_md5[1], v_md5[14], v_md5[17])except:passif __name__ == '__main__':web23()
跑出來這些結果
3j
6Vh
AKh
JKh
Jik
SVi
UYg
ejt
輸入url/?token=3j
拿到flag
web22題目已棄用
web21 ?? 目錄 ?? web24