-
Notifications
You must be signed in to change notification settings - Fork 31
目录遍历(穿越)
en0th edited this page Jul 26, 2024
·
2 revisions
目录遍历漏洞,也称为目录穿越漏洞,是一种常见的Web应用程序安全漏洞,攻击者可以利用此漏洞获取目标服务器上的敏感信息或者执行任意代码。目录遍历漏洞的原理是,攻击者通过修改Web应用程序中的URL,来访问Web服务器上的非授权目录。 攻击者通常通过在URL中添加"../"等目录遍历符号,来访问目标服务器上的上层目录,从而绕过Web应用程序的访问控制,访问Web服务器上的敏感文件和目录,例如/etc/passwd、/etc/shadow等系统文件,以及Web应用程序的配置文件、数据库文件、源代码等敏感信息。
考察:路径穿越思路
/ElectricRat/fileAction/getFile?fileName=picture.png
查看下载按钮的请求路径,发现有个参数可以被我们控制,即fileName
,我们尝试输入一个不存在的文件,爆出了绝对路径。
参考payload:../WEB-INF/classes/jdbc.properties
通过路径穿越获取到了数据库配置文件。
为了充分的演示,我编写了一个经典的业务逻辑代码——任意文件下载。造成这个漏洞的根本原因是对用户输入的fileName
没有充分的过滤,直接进行路径拼接。我们除了修改成任意文件名之外,还可以使用../
访问上层目录文件。
FileInputStream in = new FileInputStream(uploadPath(request) + "\\" + fileName);
代码来源:com/pika/electricrat/dir/FileActionServlet.java
public void getFile(HttpServletRequest request, HttpServletResponse response){
String fileName = request.getParameter("fileName");
String suffix = fileName.substring(fileName.lastIndexOf('.'));
response.setHeader("content-disposition", "attachment;filename=" + ((new ImageVerificationCode()).GetRandom(10) + suffix));
try {
FileInputStream in = new FileInputStream(uploadPath(request) + "\\" + fileName);
ServletOutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int length=-1;
while((length=in.read(buffer))!=-1) {
out.write(buffer, 0, length);
}
in.close();
out.close();
} catch (Exception e){
e.printStackTrace();
}
}
为了防范目录遍历漏洞,我们可以做以下几点:
- 过滤
./
和../
这些特殊符号。 - 采用随机字符串ID方式下载文件。
- 对目录进行最小权限配置。
- 路径后拼接后缀,比如说知道下载的一定是图片,那么就在路径后缀添加
.jpg
防止逃逸。(高效)