1. 程式人生 > 實用技巧 >P3833 [SHOI2012]魔法樹(樹鏈剖分)

P3833 [SHOI2012]魔法樹(樹鏈剖分)

最近也不是很忙,空閒時間還是很多,所以做點有意思的CTF,提升提升自己

0x00 知識點

1.php中的strcmp漏洞

說明:

int strcmp ( string $str1 , string $str2 )

引數 str1第一個字串。str2第二個字串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。
可知,傳入的期望型別是字串型別的資料,但是如果我們傳入非字串型別的資料的時候,這個函式將會有怎麼樣的行為呢?實際上,當這個函式接受到了不符合的型別,這個函式將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告資訊後,將return 0 ,也就是雖然報了錯,但卻判定其相等。

2.php中的is_numeric()漏洞

is_numeric() 函式用於檢測變數是否為數字或數字字串。

is_numeric函式對於空字元%00,無論是%00放在前後都可以判斷為非數值,而%20空格字元只能放在數值後。所以,檢視函式發現該函式對對於第一個空格字元會跳過空格字元判斷,接著後面的判斷!

0x01 解題

開啟題目

在另一個頁面的原始碼裡看見內容

顯然,password必須不是數字或數字字串;然後還得弱型別比較符合404。

is_numeric函式對於空字元%00,無論是%00放在前後都可以判斷為非數值,%20必須放在數值後才可;

弱型別的話404%00或404%20或404%0a都可

我們先來抓包重放一下試試

說明此時密碼正確,還得傳個money的值

提示說數字太長,可能是後端做了某種比較限制,嘗試%00截斷,不行;

嘗試科學計數法,money=1e10,可以;

嘗試給個數組,money[]=111,可以。

參考:https://www.cnblogs.com/wangtanzhi/p/12238883.html