php文件包含漏洞
php文件包含漏洞
描述
开发人员为了使得代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞
相关函数
1 | include() |
include 和 require的区别在于,如果包含的文件有错误,include会继续往下执行,如果是require就不会
本地包含漏洞(LFI)
一个phpinfo.txt走天下
1 |
|
1 |
|
只要文件内容复合php语法规范,那么任何扩展名都可以被php解析
包含非php语法规范原文件时,将会暴露其源代码
典型的漏洞代码
1 |
|
filename没有进行过滤,可以被用户控制
这里可以结合目录遍历漏洞查看敏感信息
远程文件包含(RFI)
注:要确定php是否已经开启远程包含功能(默认是关闭)
1 | alow_url_include = On |
栗子:
1 |
|
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代码会被解析
若后缀名写死了,可以用?绕过
伪协议
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
php://input
代表可以访问请求的原始数据,可以获取到post的数据并将其作为php代码执行
条件:
1 | allow_url_fopen: off/on |
利用
遇到file_get_contents()可以利用该协议
1 | file_get_contents("php://input"); |
写木马
条件:php中开启allow_url_fopen 和 allow_url_include(PHP < 5.3.0)
POST: 木马
命令执行
POST:
1 | 'ls -a'); system( |
php://output
只写的数据流
file:
file://[绝对路径及文件名]
访问本地文件
php://filter
一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是过滤器
参数:
1 | resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。 |
常用的payload:
1 | php://filter/read=convert.base64-encode/resource=xxx.php |
这里就是使用convert.base64-encode这个过滤器,对xxx.php的内容进行base64编码后再读取
还有其他一些奇妙的编码
1 | 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 | data://text/plain,xxxxx |
压缩包伪协议
pchar://
zip://
1 | ?url=zip://xxxxxx#phpinfo.php |
绕过限制
截断
1 |
|
%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 | 1./var/lib/php/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