米斯特白帽培训讲义(v2)漏洞篇 文件包含
米斯特白帽培训讲义 漏洞篇 文件包含
讲师:gh0stkey
整理:飞龙
协议:CC BY-NC-SA 4.0
原理
文件包含就是将一个文件包含到自己的文件中执行。它可分为本地包含和远程包含,本地包含即包含本地磁盘上的文件,文件名称是相对路径或绝对路径,远程包含即包含互联网上的文件,文件名称是 URL。
本地包含
比如我们有一个test.txt
文件,仅仅调用phpinfo
来测试:
<?php phpinfo();?>
然后我们在相同目录下放置一个fileinclude.php
,如下:
<?php
$file=@$_GET['file'];
if($file){echo "<center>File:".$file."<br/>Result:</center>";include $file;
}
第一行代码获取 URL 参数file
的内容。2 ~ 4 行首先判断$file
是否为空,若不为空,输出其内容,并将其作为文件名称包含。
我们将其部署在localhost
下,之后访问http://localhost/fileinclude.php?file=test.txt
,会看到phpinfo
的输出。
我这里之所以用txt
文件,就是想说明这个漏洞是无视扩展名的。跟文件上传漏洞不一样,文件上传漏洞中如果我们上传的文件不是.php
就执行不了(当然也有一些绕过手段),但是文件包含漏洞中的扩展名是任意的,这里我们上传了.txt
,证实有效,那么这个.jpg
也是有效的。
要注意,如果被包含的文件里面没有 PHP 标签,那么就当成 HTML 内容如实显示出来。就比如我们放入之前的top100.txt
:
远程包含
为了演示远程包含,我们需要将 PHP 配置文件中的allow_url_include
设置为on
,之后重启 PHP。PHP 配置文件的位置可以在phpinfo
的输出中寻找,我们搜索ini
即可:
我这里是C:\php-5.5.10\php.ini
,你那里可能有些差别。我们打开它,搜索allow_url_include
,会看到下面这些行,如果是Off
把它改成On
。
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include = On
我们需要将file
参数改为http://localhost/text.txt
,可以看到相同结果。
技巧
00 截断
有些程序会给被包含内容加一些后缀,比如如果fileinclude.php
是这样。
<?php
$file=@$_GET['file'];
if($file){$file .= '.php';echo "<center>File:".$file."<br/>Result:</center>";include $file;
}
它后面加了个.php
,也就是说,如果我们传入file=test
则是正常的,传入file=test.txt
,或变成test.txt.php
,从而包含失败。那么我们应该怎么办呢?
如果 PHP 版本小于 5.3,并且magic_quotes_gpc
已取消,我们就可以使用%00
来截断。我们传入file=test.txt%00
,就可以实现包含。
路径遍历
./
(或省略):当前目录../
:上级目录/
:根目录(Windows 中为当前盘内的根目录)~/
:用户的主目录
例如,在 Linux 下,我们就可以使用file=/etc/passwd
来读取系统密码。
这里是一些常见的日志文件位置:
- apache+Linux日志默认路径
/etc/httpd/logs/access.log
/var/log/httpd/access.log
- apache+win2003日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
- IIS6.0+win2003默认日志文件
C:\WINDOWS\system32\Lognames
- IIS7.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\Lognames
- nginx 日志文件
<安装目录>/logs
- 如果安装目录为
/usr/local/nginx
,则为/usr/local/nginx/logs
- apache+linux 默认配置文件
/etc/httpd/conf/httpd.conf
/etc/init.d/httpd
- IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/metabase.xml
- IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config
PHP 伪协议
允许远程包含的情况下,我们可以使用php://
伪协议,比如php://filter/resource=test.txt
可以读取相同文件。
我们还可以加一个过滤器让它显示为 BASE64 编码格式,php://filter/read=convert.base64-encode/resource=test.txt
。如果我们要获取的文件里面有不可打印的字符,或者我们想要获取代码的内容,可以用这种方式来获取,之后解码即可。
php://input
可以读取原始的 HTTP 正文内容。如果我们将file
设置为php://input
,并且在 HTTP 正文中传入 PHP 代码,例如<?php phpinfo();?>
,即可执行代码。
Data URI
Data URI 的格式是data://text/plain;base64,<base64>
,同样需要远程包含。我们首先把一句话用 base64 编码,得到PD9waHAgcGhwaW5mbygpOz8+
,然后将file
设置为data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
(注意URL编码),即可执行代码。
如何挖掘
首先对 URL 进行分析,看看是否和文件相关,比如www.test.com/xxx.php?file=yyy
。带有文件相关的敏感名称都可以进行挖掘。
利用
当我们发现了本地包含漏洞时,首先寻找上传点,比如用户头像上传功能。然后我们可以构造一个纯文本文件,内容为<?php phpinfo();?>
,并将其命名为xxx.jpg
。
之后我们就可以把xxx.jpg
上传上去,并通过应用得到它的位置,假设是/upload/xxx.jpg
,然后我们就可以把file
参数的值改为它。以前面的代码为例,URL 是http://localhost/fileinclude.php?file=/upload/xxx.jpg
。
如果我们把xxx.jpg
的内容改为菜刀的一句话,那就可以用菜刀连接。
再说一下远程包含,远程包含的条件比较苛刻,目标网站需要把allow_url_open
给打开。所以有本地包含不一定有远程包含,有远程包含一定就有本地包含。但是,远程包含的利用相对简单,只要将代码上传到自己博客,或者任何能通过 URL 访问到的地方就可以了。后续步骤是一样的。
附录
新手指南:DVWA-1.9全级别教程之File Inclusion
PHP 伪协议
米斯特白帽培训讲义(v2)漏洞篇 文件包含相关推荐
- 米斯特白帽培训讲义(v2)漏洞篇 文件上传
米斯特白帽培训讲义 漏洞篇 文件上传 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 我们首先看一下文件上传的流程图. 其中,浏览器通过上传页面将文件储存到服务器中.一般这些 ...
- 米斯特白帽培训讲义(v2)漏洞篇 SSRF
米斯特白帽培训讲义 漏洞篇 SSRF 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 很多 Web 应用都提供了从其他服务器上获取数据的功能.使用用户指定的 URL,web ...
- 米斯特白帽培训讲义(v2)漏洞篇 提权
米斯特白帽培训讲义 漏洞篇 提权 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 提权,顾名思义就是提高自己在服务器中的权限,就比如在 Windows 中你本身登录的用户是 ...
- 米斯特白帽培训讲义(v2)漏洞篇 第三方风险
米斯特白帽培训讲义 漏洞篇 第三方风险 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 域名商 域名商就是提供域名购买的站点.我们可以通过站长工具的 WHOIS 查询来查询域 ...
- 米斯特白帽培训讲义(v2)漏洞篇 XSS
米斯特白帽培训讲义 漏洞篇 XSS 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascadi ...
- 米斯特白帽培训讲义 漏洞篇 文件上传
米斯特白帽培训讲义 漏洞篇 文件上传 讲师:gh0stkey 整理:飞龙 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc- ...
- 米斯特白帽培训讲义 漏洞篇 文件包含
米斯特白帽培训讲义 漏洞篇 文件包含 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理 文件包含就是将一个文件包含到自己的文件中执行.它可分为本地包含和远程包含,本地包含 ...
- 米斯特白帽培训讲义(v2)漏洞篇 Web 中间件
米斯特白帽培训讲义 漏洞篇 Web 中间件 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 简介 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术 ...
- 米斯特白帽培训讲义(v2)漏洞篇 弱口令、爆破、遍历
米斯特白帽培训讲义 漏洞篇 弱口令.爆破.遍历 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 成因 弱口令没有严格和准确的定义,通常认为容易被别人(它们有可能对你很了解)猜 ...
最新文章
- 搭建高可用web和数据库集群
- Xamarin iOS教程之申请付费开发者账号下载证书
- KVM Vhost-net 和 Virtio-net代码详解(十八)
- 揭秘TensorFlow:Google开源到底开的是什么?
- LNMP架构介绍与搭建
- memcached演练(2) 访问memcached服务
- 2020 年,React.js 开发者如何更好地修炼内功?
- Lombok的注解简单介绍
- Firefox国际版上登录本地服务
- linux 系统安装微信小程序开发工具
- 怎么更改计算机上的限制应用,图文详解通过修改win10系统组策略实现限制指定应用程序的运行-系统操作与应用
-亦是美网络...
- AUTOCAD打开很卡很慢的解决方法
- BiCubic双三次插值算法进行上采样python与matlab代码实现
- wpf 语音通话_WPF+WCF一步一步打造音频聊天室(四):视频会话
- 如何使用在线MP3工具简单剪切音乐
- 光缆定位仪光衰点定位光纤识别方法
- 电脑版微信提示音mp3_短的微信提示音什么好?40首好听的微信提示音试听下载...
- html标记语言表格,表格《 HTML:标记语言 》
- google protobuf 在线工具
- numeric_limits的运用
热门文章
- System verilog随机系统函数$randomize使用方法
- Vivado FIFO IP核接口信号介绍
- android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例
- 8001.win10安装ros2-dashing环境搭建
- “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
- 解析java程序设计第二版答案,解析Java程序设计答案
- Java面试之锁-读写锁
- Java面试之到底值传递和引用传递???
- [***]HZOI20190714 T2熟练剖分
- 什么是 Python 自省?