1. 程式人生 > >bugku 程式碼審計 write up

bugku 程式碼審計 write up

extract變數覆蓋

查一下php手冊
這裡寫圖片描述
本函式用來將變數從陣列中匯入到當前的符號表中。
返回成功匯入到符號表中的變數數目。
而且這個函式沒還有任何引數,很危險,直接可以修改衝突的變數
這裡寫圖片描述
關鍵的程式碼
這裡寫圖片描述
構建的payload: ?shiyan=&flag=
因為不知道flag裡面什麼內容,讓它變成空,然後使contentshiyan變數和$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。。。。

給一個適合新手的學習文章: