浅析java中File.getPath()方法引发命令执行漏洞的成因

  • A+
所属分类:代码审计

浅析java中File.getPath()方法引发命令执行漏洞的成因

今天看到某童鞋的提问,大概意思是某执行命令处代码有没有办法利用,详见https://www.t00ls.net/thread-24621-1-1.html.
看不到的童鞋木有关系,代码我已经摘录了,请看:
代码片段1:

浅析java中File.getPath()方法引发命令执行漏洞的成因
代码片段2:

浅析java中File.getPath()方法引发命令执行漏洞的成因

代码片段3:

浅析java中File.getPath()方法引发命令执行漏洞的成因
我们来先看这段:intLineCount = Integer.parseInt(lineCount),虽然lineCount是可控的且是String类型,但是这一句直接将lineCount转换成int类型,没法用;

再看File logFile = new File(microHome + File.separator + "logs" + File.separator + dirName + File.separator + fileName); 这里fileName没做任何处理就直接做字符串拼接操作了,假设拼接后的字符串我们把它称为字符串strA,
看,File logFile = new File(strA),通过将给定路径名字符串strA转换为抽象路径名来创建一个新的File实例,
直接就创建了新的File实例,有人说这会引发血案吗,我们且看看Oracle官方提供的源码:

源码片段1(摘自File类):

浅析java中File.getPath()方法引发命令执行漏洞的成因
源码片段2(摘自File类):

浅析java中File.getPath()方法引发命令执行漏洞的成因
源码片段3(摘自FileSystem类):

浅析java中File.getPath()方法引发命令执行漏洞的成因
且看这句this.path = fs.normalize(pathname);,normalize是抽象类FileSystem中的抽象方法.

    我们知道Windows 32位环境下java.io包中FileSystem是一个抽象类,FileSystem类被一个Win32FileSystem类继承,从而实现里面的public abstract String normalize(String path);方法。
    我们来跟进一下,
    请看构造函数代码1(摘自Win32FileSystem类):

浅析java中File.getPath()方法引发命令执行漏洞的成因
请看关键代码2(摘自Win32FileSystem类):

浅析java中File.getPath()方法引发命令执行漏洞的成因
(其他相关的有兴趣的可以自己去翻下源代码)。

    我们知道this.path = fs.normalize(pathname);此处相关特殊字符没有被过滤及转义,其结果直接被赋予给path变量,接下来我想小伙伴们都知道会发生什么事了吧.
    对的,好基友你说对了,Java里面new File(String)方法中参数可以被污染,我们可以引入特殊字符了.
    很好,我们知道,不管是Windows还是*nux系统下面,多个命令是可以放在一行上面的,其执行情况依赖于用在命令之间的分隔符,如:Windows里面的&,*nux下的; && ||等,那么我们就可以构造出这样的语句了吧,fileName = "xxxxx || id"; fileName = "file.txt & dir";
    接下来相信大家都知道在哪些场景中可以利用了.
    另附针对Windows 32位 JRE6环境下File.getPath()方法引发命令执行漏洞的相关Poc源码:

浅析java中File.getPath()方法引发命令执行漏洞的成因

浅析java中File.getPath()方法引发命令执行漏洞的成因

浅析java中File.getPath()方法引发命令执行漏洞的成因

本文始发于微信公众号(T00ls):浅析java中File.getPath()方法引发命令执行漏洞的成因

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: