php safe_mode 是否开启?
safe_mode 设置成 on 会影响哪些函数的使用?
fopen() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
mkdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
rmdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
rename() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
unlink() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
copy() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (on source and target )
chgrp() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
chown() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
chmod() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 另外,不能设置 SUID、SGID 和 sticky bits
touch() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)
allow_url_open
要使用fopen、getimagesize或include等函数打开一个url,需要对php.ini进行设置,通常设置allow_url_fopen为on允许fopen url,设置allow_url_include为on则允许include/require url.
如果php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,
则文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞
这样的实例代码为:
index.php
$filename=$_GET['file'];
include $filename;
倘若我们现在访问 http://localhost/index.php?file=bb.php
如果 bb.php
This is abb.php!!
<?php
phpinfo();
?>
那么这时候的index.php 会返回什么呢?
就是phpinfo();
就会把这个phpinfo内容显示出来。
allow_url_fopen = on
Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_include = on
Whether to allow include/require to open URLs (like http:// or ftp://) as file、、、、
下面我们看一下如何使用的:
index.php
<?php $path=$_GET['path']; include $path;
bb.txt
<?php phpinfo();
bb.php
bb.php <?php phpinfo();
http://localhost/test/include/index.php?path=bb.txt
http://localhost/test/include/index.php?path=bb.php
当我们访问任意的url地址时候,都会返回phpinfo() 显示环境的详细界面
倘若我们把
http://localhost/test/include/index.php?path=../../../../etc/passwd
这样就会把 /etc/passwd 下的文件显示出来
2. 文件包含漏洞利用技巧
远程文件包含漏洞之所以能够执行命令,就是因为攻击者可以自定义被包含的文件内容。因此,本地文件包含漏洞要想执行命令,也需要找一个攻击者能够控制内容的本地文件。
目前主要有几下几种常见的技巧:
2.1 包含用户上传的文件
这个很好理解,也是最简单的一种办法。如果用户上传的文件内容中包含PHP代码,那么这些代码被文件包含函数加载后将会被执行。但能否攻击成功,取决于上传功能的设计,比如需要知道上传文件存放的物理路径,还需要上传的文件有执行权限。
2.2 包含data://或php://input等伪协议
这需要目标服务器支持,同时要求allow_url_fopen为设置为ON。在PHP5.2.0之后的版本中支持data: 伪协议,可以很方便的执行代码。
2.3 包含Session文件
这部分需要攻击者能够控制部分Session文件的内容。PHP默认生成的Session文件一般存放在/tmp目录下。
2.4 包含日志文件
比如Web服务器的访问日志文件,这是一种通用的技巧。因为几乎所有网站都会将用户的访问记录到访问日志中。因此,攻击者可以向Web日志中插入PHP代码,通过文件包含漏洞来执行包含在Web日志中的PHP代码。下面的安例中就是利用该技巧成功获取到目标网站的WebShell的。但需要注意的是,如果网站访问量大的话,日志文件可能会非常大,这时如果包含一个这么大的文件时,PHP进程可能会卡死。一般网站通常会每天生成一个新的日志文件,因此在凌晨时进行攻击相对来说容易成功。
2.5 包含/proc/self/environ文件
这个也是一种通用的技巧。因为它根本不需要猜测被包含文件的路径,同时用户也能控制它的内容。常见的做法是向User-Agent中注入PHP代码来完成攻击。