江苏工匠杯easyphp
代碼審計
先看一下代碼
?代碼里有三個變量a,b,c要通過GET方式傳入,并且對a,b,c變量設置了判斷,接下來分別看看怎么達成他們的判斷條件以及其代碼分析
a變量
inval($a)>6000000 要求傳入的a為大于6000000,但后面的strlen()函數限制了a的長度在3以內
此時可以考慮用科學計數法來繞過即a=1e9 ,此時可以使a滿足條件
b變量
b變量這里用到了md5截斷判斷,'8b184b'?===?substr(md5($b),-6,6)
即將b變量進行md5加密,并用substr截取加密后的后6位,截取的結果要為'8b184b'
這個時候需要用代碼來爆破一下
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()我這里爆破的結果是53724,也許還有其他結果沒爆破出來
此處代碼借鑒了MD5截斷比較驗證 - Ye'sBlog - 博客園 (cnblogs.com)
c變量
?
代碼將傳入的c變量進行了json格式的轉換,將json轉換為php,并再次轉換為數組
那么c傳入的值便要是json格式,同時里面包含了m,n兩個key,m鍵對應的值要不為數字且大于2022,此時包含一個知識點,php中當字符與數字進行比較時,字符部分會轉為0,即傳入
"m":"9999a",比較時會變成9999
n鍵對應的值為數組,數組里有兩個值,并且數組的第一個值也為數組
那么n傳入的格式應為 "n":[[XXX],XXX],再看下面的代碼
array_search("DGGJ",?$c["n"]),這里是搜索n中是否有"DGGJ",有則返回Ture并進行下一步
與弱相等類似即該函數進行匹配時如果是字符串與數字,字符串會轉為0,那么讓"n":[[XXX],0]即可
foreach循環部分意思是n中有"DGGJ"就會輸出no...,意思是n中不能包含"DGGJ"
"n":[[666],0] 同樣可以滿足
最終c={"m":"9999a","n":[[666],0]}
最后傳入 a=1e9&b=53724&c={"m":"9999a","n":[[6],0]}即可
總結
以上是生活随笔為你收集整理的江苏工匠杯easyphp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AnyConnect苹果IOS系统Iph
- 下一篇: 一键卸载宝塔Linux面板及运行环境命令