文件包含漏洞给是“代码注入”的一种,“代码注入”这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务器执行
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节 省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接
文件包含可能会出现在JSP
,PHP
,ASP
等语言中,常见的导致文件包含的函数:
PHP中常见的文件包含函数:
JSP/Servlet常见的文件包含函数:
ASP常见的文件包含函数:
include
和require
区别主要是,require_once()
在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require
函数出现错误的时候,会直接报错并退出程序的执行
而include_once()
,require_once()
这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题
当使用include_once()
,include
,require_once()
,require_once()
这些函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核不会在意该被包含的文件的什么类型,不管包含的.txt
文件,图片文件,远程URL,也都会作为PHP代码执行
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,
include($_GET['xvbinyv']);
?>
当这个txt文件包含了可执行的PHP代码时:
再执行漏洞URL,发现代码被执行了
要想成功利用文件包含漏洞,需要满足下面两个条件
$_GET['xvbinyv']
参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['xvbinyv']
的值,执行非预期的操作
Windows系统
Linux/Unix系统
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞
开发者在开发中没有为包含文件设置特定前后缀(.php
、.html
等扩展名),从而导致攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码
我们通过一段PHP代码带大家更深入了解一下无限制本地文件包含
$xvbinyv = $_GET['xvbinyv'];
include($xvbinyv);
?>
在本地搭建好环境,我们可以构建payload测试一下(这个博主在kali下搭建的)
可以看到我们构建的payload成功显示出来了/etc/passwd
目录信息,于是我们可以判断这个存在文件包含漏洞,我们尝试利用无限制本地文件包含来进行测试
代码中为包含文件设置了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含
、路径长度截断文件包含
、点号截断文件包含
这三种
%00截断在上一章中文件上传已经详细讲解了,这里博主就简单说一下
系统在对文件名进行读取时,如果遇到%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤
在PHP5.3之后的版本中完全修复了00截断
在原来的基础上我们引入html,进行测试
$xvbinyv = $_GET['xvbinyv'];
include($xvbinyv.".html");
?>
通过web进行访问该php文件,在URL结尾的位置输入%00
利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的
如何构造出这么长的目录?通过“../
”的方式即可,比如:
../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../xvbinyv
或者
/xvbinyv
或者
../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/../lover/xvbinyv/
利用上面的代码,进行测试
$xvbinyv = $_GET['xvbinyv'];
include($xvbinyv.".html");
?>
PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码
无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码
将allow_url_fopen与allow_url_include打开,配置好环境开始进行测试
$xvbinyv = $_GET['xvbinyv'];
include($xvbinyv);
?>
通过远程文件包含漏洞,包含http://192.168.78.19/baohan/one.txt
中的PHP代码通过远程文件包含被成功当成PHP代码解析
有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码
include($_GET['xvbinyv'].".html");
?>
代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀
http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt?
http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt%23
( #
要进行ASCII编码)
http://192.168.78.19/baohan/redamancy.php?xvbinyv=http://192.168.78.19/baohan/one.txt%20
(空格要进行ASCII编码)
远程文件包含漏洞之所以能够执行命令,就是因为攻击者能够自定义被包含的文件内容,因此本地文件包含漏洞想要执行命令,也需要找到一个攻击者能够控制内容的本地文件
给大家带来几种常见的技巧
当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session内容可控
通过phpinfo的信息获取session的存储位置:session.save_path为E:\phpstudys\PHPTutorial\tmp\tmp
session_start();
$xvbinyv = $_GET['xvbinyv'];
$_SESSION['lover']=$xvbinyv;
?>
此代码的$xvbinyv变量的值可以通过GET型参数传入。PHP代码将会获得GET型xvbinyv变量的值存入Session中。攻击者可以利用GET型xvbinyv参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代码
http://192.168.78.19/baohan/redamancy.php?xvbinyv=
在xvbinyv后面写入,xvbinyv会将该php语句写入session中,打开文件目录可以查看该内容
xvbinyv后面跟session的存储位置+文件名,就可以成功触发Session文件包含漏洞
攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell
这推荐大家看一下暮秋初九老师的Session文件包含漏洞讲解的十分详细
proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。
很多网站通常会提供文件上传功能,比如:上传头像、文档等,这时可以上传一句话图片木马的方式进行包含,包含上传文件博主在上一章已经详细讲解过了不懂的可以进行学习文件上传
php中上传文件,会创建临时文件。其目录在php.ini的 upload_tmp_dir中定义,一般默认为空,在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。
该临时文件的文件名是随机的,攻击者必须准确猜测出的该文件名的才能成功。PHP在此处并没有使用安全的随机函数,因此可以进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名
WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码
Apache运行后一般默认会生成两个日志文件,Windos下是access.log(访问日志)和error.log(错误日志),Linux下是access_log和error_log,访问日志文件记录了客户端的每次请求和服务器响应的相关信息
大家可以通过百度搜索常见的日志文件可能会存在以下地方有哪些
这里给大家提一下metasploit中包含了一个脚本自动化完成包含日志文件的攻击详细过程大家可以参考吴翰清老师的白帽子将web安全
碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;
echo file_get_contents("php://input");
?>
没有学习过PHP伪协议的同学可以先去学习一下,不止能包含php://input也可以有
当然博主后面会出详细的教程
文件上传
PHP Session | 菜鸟教程 (runoob.com)
web安全原理-文件包含漏洞 - 笑花大王 - 博客园 (cnblogs.com)
CTF文件包含漏洞总结
Session文件包含漏洞
本文章借鉴了各路大神的手笔,博主也是学生难免会有些错误和理解不到位的地方,欢迎讨论与指正!!!