#13.路径遍历漏洞二
上一篇提过,下载或上传处理不当很容易造成任意文件下载漏洞和任意路径文件上传漏洞。
其实,坑不仅仅只有这个。如果以下这些坑你没意识去主动避免,那么很有可能哪一天就掉进去了。
##13.1 绕开后缀判断
// 请求路径:http://example.com?name=github.jsp%00.jpg
String name = request.getParameter("name");
if (name.matches(".*\\.jpg")) {
File file = new File(name);
file.createNewFile();
System.out.println("规范路径 : " + file.getCanonicalPath());
}
在很多操作系统中,控制字符%00被用于注入到文件名中,例如下面这个URL:
http://example.com?name=github.jsp%00.jpg
在Java应用看来,改文件名是以.jpg结尾的,而操作系统在碰到%00就被截断了,所以操作系统只能看到的是以.jsp结尾的。这个攻击用于绕开应用程序对文件后缀的检查。
控制字符%00-%1f
最初是用于控制硬件设备,控制字符在URL中是无意的。
##13.1拓展阅读
其实13.1提高奥的攻击叫__Poison Null Byte__,不仅仅是Java,其实在其他语言中一样存在。参考:http://hakipedia.com/index.php/Poison_Null_Byte
Java在较新的版本中,已经修复了这个漏洞,代码如下:
public class File {
...
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if(security != null) security.checkWrite(path);
if(iwInvalid()){
throw new IOEception("Invalid file path");
}
return fs.createFileExclusively(path);
}
final boolean isInvalid() {
if (status == null) {
status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
: PathStatus.INVALID;
}
return status == PathStatus.INVALID;
}
}
如果pathame中存在控制字符NUL,则抛出IOEception异常。
##13.2 远程文件包含
有些蛋疼的程序员会在jsp标签中包含远程文件,当然,这不是关键,关键是允许用户传参指定包含的文件,这时候远程文件包含漏洞就出现了。如果远程包含的文件里面包含jsp代码,那么Web容器就会执行这段代码,从而导致了漏洞的发生。例如:
<jsp:include page="<%=remotePage%>" flush="true"/>
请求如下:
结果是hook.jsp文件里面的恶意代码会被<jsp:include>标签包含并执行。