【文件包含】文件包含漏洞知识总结
【文件包含】文件包含漏洞知识总结
Hello,各位小伙伴周五好~
这里是你们的劳模小编~
之前一期,我们已经一起总结了文件上传和文件解析漏洞。
今天我们就一起来看看文件包含漏洞吧~
一、什么是文件包含漏洞?
1、文件包含概述
和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include(),require(),include_once(),require_once()
区别如下:
- require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
- include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
- include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
- require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
2、漏洞成因分析
我们先直接来看一个简单的例子,网页代码如下:
再创建一个phpinfo.php页面,代码如下:
利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析:
将phpinfo.php文件后缀改为txt后进行访问,依然可以解析:
修改为jpg格式,也可以解析:
可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。
在上一期文件上传漏洞的总结中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析,现在知道是为什么了吧~
我们将phpinfo.jpg的内容改成一段文字:
再次进行访问,可以读出文本内容:
利用这个特性,我们可以读取一些包含敏感信息的文件。
二、本地文件包含漏洞
能够打开并包含本地文件的漏洞,我们称为本地文件包含漏洞(LFI)。
测试网页包含如下代码:
网站利用文件包含功能读取一些php文件,例如phpinfo:
利用该代码,我们可以读取一些系统本地的敏感信息。
例如C:\Windows\system.ini文件。
(1)使用绝对路径
使用绝对路径直接进行读取:
(2)使用相对路径进行读取:
当前页面所在路径为C:\Apache24\htdocs\,我们需要使用…/退到C盘再进行访问,构造路径如下:
…/…/windows/system.ini
成功读取到文件信息:
./表示当前位置路径,…/表示上一级路径位置,在linux中同样适用。
(3)一些常见的敏感信息路径:
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 配置文件
三、LFI漏洞利用技巧
1、字符串截断
首先我们来看一段改进后的代码:
我们去读取根目录下的site目录中的phpinfo.php文件:
此时如果我们想通过文件包含漏洞读取本地敏感信息,就会遇到一些问题。因为服务器会给路径加上./site/路径,以及.php后缀。
此时我们可以使用使用%00截断:
%00为结束符,在filename后带上%00,就可以截断末尾的.php。
当前路径为./site/,如果要读取system.ini,则需要输入:…/…/…/windows/system.ini%00,成功读取如下:
需要注意的是,%00截断需要php版本小于5.3.4,且关闭magic_quotes_gpc
功能。
2、配合文件上传使用
有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。
以DVWA平台为例,编辑一个图片马,内容如下:
找到上传点进行上传:
文件保存的完整路径为:
C:\phpStudy\WWW\hackable\uploads\webshell.jpg
DVWA平台low等级文件包含漏洞页面如下:
该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下:
现在我们利用该页面去执行我们上传的图片马,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 转到C:\phpStudy\WWW\hackable\uploads\webshell.jpg
构造URL如下,页面无报错:
可以看到fi文件夹中生成了一个webshell:
使用webshell管理工具连接即可。
注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。
3、包含Apache日志文件
有时候网站存在文件包含漏洞,但却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。
在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log,日志文件如下:
当我们正常访问一个网页时,如http://127.0.0.1/login.php,access日志会进行记录,如下图所示:
如果我们访问一个不存在的资源,也一样会进行记录,例如访问
127.0.0.1/<?php phpinfo();?>
但查看日志会发现被编码了,如下:
我们再次进行访问,并使用burp抓包,发现被编码:
我们将报文修改回去,再进行发送即可:
此时再查看access日志,正确写入php代码:
再通过本地文件包含漏洞访问,即可执行:
我可以在此处写入一句话木马,再使用Webshell管理工具进行连接。
四、远程文件包含
如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)。
首先我们来看一段代码:
访问本地phpinfo.php文件:
该页面并没有对$path做任何过滤,因此存在文件包含漏洞。
我们在远端Web服务器/site/目录下创建一个test.php文件,内容为phpinfo(),利用漏洞去读取这个文件。
但是代码会给我们输入的路径后面加上’/phpinfo.php’后缀,如果php版本小于5.3.4,我们可以尝试使用%00截断,这里php版本为7.2.7,不适用。
还有一种截断方法就是?号截断,在路径后面输入?号,服务器会认为?号后面的内容为GET方法传递的参数,成功读取test.php如下:
如果test.php是恶意webshell文件,那么利用该漏洞就可以获取到服务器权限。
五、PHP伪协议
PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:
1、php://filter
有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php:
这时候我们可以以base64编码的方式读取指定文件的源码:
输入:php://filter/convert.base64-encode/resource=文件路径
得到config.php加密后的源码:
再进行base64解码,获取到数据库账号等敏感信息:
2、data://
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:
如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
3、zip:// 执行压缩文件
如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。
以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:
通过zip://协议执行zip压缩包中的phpinfo.php文件:
4、php://input
利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码:
发送报文,可以看到本地生成了一句话木马:
5、伪协议利用条件
伪协议的利用方法还有很多,这里就不一一举例了。
伪协议的用法小结:
六、文件包含漏洞防护
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
6、做好管理员权限划分,做好文件的权限管理
…
好啦,以上就是今天的全部内容了,大家都明白了吗?
最后,欢迎关注我的个人微信公众号。
Peace !
【文件包含】文件包含漏洞知识总结相关推荐
- fopen打开ftp文件_PHP文件包含漏洞利用思路与Bypass总结手册(一)
作者:Qftm 合天智汇 前言 这个手册主要是记录针对PHP文件包含漏洞的利用思路与Bypass手法的总结. 相关函数 四个函数 php中引发文件包含漏洞的通常主要是以下四个函数: 1.include ...
- 渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞
漏洞数据库:https://www.exploit-db.com/google-hacking-database 1.渗透测试 实用 浏览器插件 chrome.edge 插件:搜索 cookie,安装 ...
- web漏洞(CSRF-SSRF-文件包含-文件解释-文件下载-目录遍历-sql注入-文件上传-反序列化-XSS-XXE-RCE-逻辑越权)
1.CSRF(跨站请求伪造)(需要对方是在登录的情况下)--主要用于骗转账等等 原理:A在已经登录了银行的网站,并且此时去访问了B所构造的网页添加了特殊代码,A点击了B,由于A已经登录了,就造成了A直 ...
- 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)
一.文件包含漏洞概述 1.定义:文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序.当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行 ...
- php post 漏洞_文件包含上传漏洞目录遍历命令执行漏洞
制丨阿星 来源丨freebuff 作者丨Deutsh 文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create ...
- 浅谈文件包含之包含pearcmd.php漏洞
文件包含之包含pearcmd.php漏洞 1.概念 pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库.在7.3及以前,pecl/pear是默认安装的: 在7.4及以后, ...
- php无法连接远程服务器,php-无法在远程服务器上包含文件
我的问题是我无法在远程服务器上包含文件. echo "Including\n"; require_once("http://xx.xxx.xxx.xx:8080/path ...
- php入门-文件操作(文件包含、文件上传、文件管理)
0x00 起源 从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,需要有简单的html基础和php基础,跟随流沙前辈视频学习记录. 国庆放假摆烂 ...
- 引入flag.php文件,php文件自包含的奇淫技巧
原标题:php文件自包含的奇淫技巧 前言 刷题的时候刚好看到一个比较厉害的phpinfo的利用姿势,原理不是很懂,题目来自百度杯12月第四场Blog进阶版 以下是writeup 解题过程 注册以后 发 ...
最新文章
- mysql的字符集设置为什么_为什么Mysql默认的字符集都是latin1
- .NET 通用权限设计
- 利用Linux命令行进行文本按行去重并按重复次数排序yes
- 身份证过期了银行卡还能用吗?
- GStreamer1.0中no element “ffmpegcolorspace”报错解决(八)
- Python 内置函数介绍
- 依赖注入框架 ----Dagger2 使用详解及源码分析
- 德鲁克对管理学的贡献
- 智能编程计算机表演赛,中国儿童青少年计算机表演赛在京闭幕
- Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework...
- Halcon入门(1)——选取ROI区域
- 微信小程序兼容手机底部横条适配
- 一个简易版的spice VDI 云桌面 客户端 系统
- 大学文科生vs大学理科生
- 咪咕盒子MG100,电视机顶盒禁用软件安装软件
- Node 之父:Node 失误太多无力回天,Deno 前景明朗
- 持续集成(三)- hudson插件入门
- Java基础编程题(02)求100-200之间的素数
- hdu 1276 士兵队列训练问题
- 【转载】阿秀的求职笔记:基础语法篇
热门文章
- 【编译原理】写出下列文法对应定义的是什么语言?
- DM8数据库的DBLINK功能(OCI方式及ODBC方式)
- 用C语言实现状态机设计模式
- corrosion 靶机(ffuf模糊测试,命令执行)
- 【python数据处理基础】--数据读取、清洗数据
- 【ros2订阅报错】 ros2 forming pointer to reference type ‘const std::shared_ptr<const sensor_msgs::msg::Las
- asp.net199企业人力资源管理系统
- 数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)
- 【Spring】Spring Framework Reference Documentation中文版18
- 4.intermediate-specialAttr