江苏工匠杯easyphp
代碼審計(jì)
先看一下代碼
?代碼里有三個(gè)變量a,b,c要通過GET方式傳入,并且對(duì)a,b,c變量設(shè)置了判斷,接下來分別看看怎么達(dá)成他們的判斷條件以及其代碼分析
a變量
inval($a)>6000000 要求傳入的a為大于6000000,但后面的strlen()函數(shù)限制了a的長度在3以內(nèi)
此時(shí)可以考慮用科學(xué)計(jì)數(shù)法來繞過即a=1e9 ,此時(shí)可以使a滿足條件
b變量
b變量這里用到了md5截?cái)嗯袛?#xff0c;'8b184b'?===?substr(md5($b),-6,6)
即將b變量進(jìn)行md5加密,并用substr截取加密后的后6位,截取的結(jié)果要為'8b184b'
這個(gè)時(shí)候需要用代碼來爆破一下
from multiprocessing.dummy import Pool as tp import hashlibknownMd5 = '8b184b'def md5(text):return hashlib.md5(str(text).encode('utf-8')).hexdigest()def findCode(code):key = code.split(':')start = int(key[0])end = int(key[1])for code in range(start, end):if md5(code)[-6:] == knownMd5:print codebreak list=[] for i in range(3):list.append(str(10000000*i) + ':' + str(10000000*(i+1))) pool = tp() pool.map(findCode, list) pool.close() pool.join()我這里爆破的結(jié)果是53724,也許還有其他結(jié)果沒爆破出來
此處代碼借鑒了MD5截?cái)啾容^驗(yàn)證 - Ye'sBlog - 博客園 (cnblogs.com)
c變量
?
代碼將傳入的c變量進(jìn)行了json格式的轉(zhuǎn)換,將json轉(zhuǎn)換為php,并再次轉(zhuǎn)換為數(shù)組
那么c傳入的值便要是json格式,同時(shí)里面包含了m,n兩個(gè)key,m鍵對(duì)應(yīng)的值要不為數(shù)字且大于2022,此時(shí)包含一個(gè)知識(shí)點(diǎn),php中當(dāng)字符與數(shù)字進(jìn)行比較時(shí),字符部分會(huì)轉(zhuǎn)為0,即傳入
"m":"9999a",比較時(shí)會(huì)變成9999
n鍵對(duì)應(yīng)的值為數(shù)組,數(shù)組里有兩個(gè)值,并且數(shù)組的第一個(gè)值也為數(shù)組
那么n傳入的格式應(yīng)為 "n":[[XXX],XXX],再看下面的代碼
array_search("DGGJ",?$c["n"]),這里是搜索n中是否有"DGGJ",有則返回Ture并進(jìn)行下一步
與弱相等類似即該函數(shù)進(jìn)行匹配時(shí)如果是字符串與數(shù)字,字符串會(huì)轉(zhuǎn)為0,那么讓"n":[[XXX],0]即可
foreach循環(huán)部分意思是n中有"DGGJ"就會(huì)輸出no...,意思是n中不能包含"DGGJ"
"n":[[666],0] 同樣可以滿足
最終c={"m":"9999a","n":[[666],0]}
最后傳入 a=1e9&b=53724&c={"m":"9999a","n":[[6],0]}即可
總結(jié)
以上是生活随笔為你收集整理的江苏工匠杯easyphp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AnyConnect苹果IOS系统Iph
- 下一篇: 一键卸载宝塔Linux面板及运行环境命令