【root-me CTF練習】Web服務器安全-第二十關- PHP filters

靶機:http://challenge01.root-me.org/web-serveur/ch12

解題思路:

指定inc參數值爲不存在的文件時,通過提示的警告信息得知該參數是通過include函數進行文件包含的。

那麼首先來了解下include函數的作用:

include函數

包含並運行指定文件,通過 include 或 require 語句,可以將 PHP 文件的內容插入另一個 PHP 文件,作用類似於載入模塊。

#vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>

#test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>

不僅如此,接下來纔是重點,include函數還能接受PHP流。

php://

php:// — 訪問各個輸入/輸出流(I/O streams)。PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。

詳情請參考官方文檔:http://php.net/manual/zh/wrappers.php.php

這裏介紹今天的考點:php://filter

php://filter

php://filter是PHP語言中特有的協議流,作用是作爲一個“中間流”來處理其他流,具有四個參數:

名稱 描述 備註
resource=<要過濾的數據流> 指定了你要篩選過濾的數據流。 必選
read=<讀鏈的篩選列表> 可以設定一個或多個過濾器名稱,以管道符(|)分隔 可選
write=<寫鏈的篩選列表> 可以設定一個或多個過濾器名稱,以管道符(|)分隔。 可選
<兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用於讀或寫鏈。  

例子:

<?php
#這裏沒有指定過濾器
readfile("php://filter/resource=http://www.example.com");

/* 這會以大寫字母輸出 www.example.com 的全部內容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* 這會和以上所做的一樣,但還會用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

那麼,我們可以使用php://filter來讀取任意文件內容

php://filter/convert.base64-encode/resource=目標文件

通過讀取login.php文件源碼得知包含了config.php文件,那麼再讀取此文件的源碼即可得到密碼。

關於PHP各種流的操作還有很多用法,以後碰到了再一一研究。

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