bugku 程式碼審計 write up
extract變數覆蓋
查一下php手冊
本函式用來將變數從陣列中匯入到當前的符號表中。
返回成功匯入到符號表中的變數數目。
而且這個函式沒還有任何引數,很危險,直接可以修改衝突的變數
關鍵的程式碼
構建的payload: ?shiyan=&flag=
因為不知道flag裡面什麼內容,讓它變成空,然後使shiyan變數和$content變數的內容都會被設定成空. 滿足條件便會出現flag
strcmp比較字串
這題關鍵的函式都沒給出來。。。題目說用strcmp的特性。。。
那我就隨便個數組進去一個?a[]…flag就出來了。。尷尬
urldecode二次編碼繞過
這個題好像在實驗吧做過。。。。。
利用了兩次urldecode第一次是瀏覽器的解碼第二次是函式的解碼
所以我利用了裡面的其中一個字母D編碼第一次編碼是%44,第二次編碼是%2544
payload: ?id=hacker%2544J
md5()函式
利用php的md5()函式有一個缺陷,這裡是===,只能用陣列處理,它無法處理陣列返回null構造payload: ?username[]=1&password[]=2
陣列返回NULL繞過
首先是ereg這個正則匹配函式是處理字串的。。。構造陣列是返回null,然後的話null===false 不相等可以執行下面的else if語句。。。
strpos處理陣列頁數返回null,於是null!==false成立就得到了flag
payload: ?password[]=1
sha()函式比較繞過
關鍵部分還是===,只能用陣列處理,利用了sha1函式處理陣列返回null的特性。
payload: ?name[]=1&password[]=2
md5加密相等繞過
這一題裡面是==,直接找一個MD5之後還是0e開頭的即可,比如s878926199a
payload:
十六進位制與數字比較
ord() 函式返回字串的‘首個’字元的 ASCII 值。
利用這一個與題目的16進位制,用16進位制開頭的0x去繞過即可。。。
用Python寫個指令碼轉換一下
num = 3735929054
print ('%#x'%num)
得到0xdeadc0de
payload:
?password=0xdeadc0de
ereg正則%00截斷
因為ereg存在%00漏洞,所以在第一個條件裡面先構建一個截斷繞過,然後就開始執行下面的else if語句,長度要小於8,數目要大於9999999,這裡就用科學計數法,用1e8去繞過
下面還有一個strpos函式還要判斷裡面是否含有’-‘符號,所以最後的payload應該是:?password=1e8%00–,出錯了。。。
沒辦法只能找一下原題,發現人家的題目是要包含*-*
,但是他題目就一條橫槓。。。坑了不少人。。。
改一下payload: ?password=1e8%00*-*
,立刻出flag
查了查手冊,還有個類似的函式叫eregi,只是不判斷大小寫罷了
strpos陣列繞過
這一題跟那題陣列返回NULL繞過,感覺好像是一樣的。。。。。
就是傳入的引數不一樣了。。。。。
payload: ?ctf[]=1
後來看了看下面的文章,發現還有一個方法2:字串截斷,利用ereg()的%00截斷漏洞,繞過正則過濾 ?nctf=1%00#biubiubiu
發現是一堆亂碼,
這裡需要特別注意, 需將#編碼 ?nctf=1%00%23biubiubiu
才能出flag。。。。