java代码审计⼯具_Java代码审计汇总系列(六)——RCE
⼀、概述
任意代码执⾏(Remote Code Execution)是危害最为严重的漏洞之⼀,挖掘难度也是相对⾼的,除了常见的⽂件上传漏洞,还有OS命令注⼊、表达式注⼊、模板注⼊、代码注⼊和第三⽅组件漏洞,下⾯依次讲解审计⽅法和技巧。
⼆、分类挖掘技巧
1、OS命令注⼊
OS命令注⼊涉及执⾏系统命令,通过关键字定位执⾏命令的⽅法是否参数可控,常⽤的搜索关键字有:
System|exec|passthru|popen|shell_exec|eval|preg_replace|str_replace|call_user_func|getRuntime().exec|system|execlp|execvp /bin/bash|cmd
⼀个典型的OS命令注⼊案例:
public class RuntimeExec {public static Boolean runtimeExec(String cmd){try {Process proc =
errorGobbler = new ErrorStream(), "ERROR");
2、表达式注⼊
主流的Java表达式主要有OGNL、SpEL、MVEL、EL、Fel、jstl_el等。
2.1 SpEL
Spring 表达式语⾔(简称SpEL):是⼀个⽀持运⾏时查询和操作对象图的强⼤的表达式语⾔。在spring中使⽤parseExpression()⽅法解析SPEL表达式,使⽤Value()⽅法执⾏SPEL表达式,如下案例:
常见的payload是
pression.Expressionexp=parser.parseExpression("T(java.lang.Runtime).getRuntime().exec('calc')");
因此审计SPEL表达式注⼊需要搜索的关键字有:
pression|parseExpression|getValue|getValueType|value="#{*}
然后逐层跟踪调⽤关系链,如果parseExpression、getValue、getValueType传⼊的参数外部可控,就存在spel注⼊的安全风险,对应的防御办法也是通过⽩名单限制⼊参。
2.2 OGNL
OGNL是最常见的表达式之⼀,Struts2也是因为OGNL表达式⽽“臭名昭著”。它是Object-Graph Navigation Language的缩写,主要
的功能是对对象进⾏处理,包括存取对象的任意属性,调⽤对象的⽅法,遍历整个对象的结构图,实现字段类型转化等。
漏洞产⽣的原因多为代码调⽤OGNL的getValue⽅法并解析执⾏:
常⽤的payload为:
%{@java.lang.Runtime@getRuntime().exec('calc')}
因此审计OGNL表达式注⼊需检索importognl.*,检查产品是否引⽤ognl相关类,检查使⽤了ognl相关代码类的getValue⽅法和setValue
⽅法是否存在外部参数可控。
2.3 Fel
Fel(Fast Expression Language),是⼀种开源表达式引擎,⽀持解释执⾏和编译执⾏,⽀持直接调⽤任何第三⽅类中的⽅法,这种功能使得fast-el表达式可以具有java代码⼀样的能⼒,虽然本⾝对⼀些危险函数进⾏了⿊名单校验,但因存在遗漏从⽽造成任意代码执⾏。
Fel的RCE主要通过其⽀持的 $ 和 . 运算触发,即通过“$(‘class’).method”形式的语法,调⽤类和⽅法,如项⽬调⽤了上⾯的
OGNL,则可以对其调⽤:
$(ognl.Ognl).getvalue(\” @java.lang.Runtime@getRuntime().exec('')\”,null)
审计中可搜索pineyu.fel检查是否使⽤Fel表达式,⽽后搜索eval/compile函数⼊参是否外部可控。
防范办法可采⽤⿊名单,禁⽤$ 和 . 操作符或⽩名单⽅法控制表达式中可以的类,修改FelBuilder类中的newSecurityMgr函数,改成默认
el表达式执行结果为使⽤⽩名单的⽅式(return new RegexSecurityMgr(enables, null);),并根据实际情况配置允许调⽤的java类。
2.4 MVEL
MVEL表达式旨在成为更有效的表达式语⾔,⽐如直接⽀持集合、数组和字符串匹配,正则表达式的运算操作等,⼀般通过
MVEL.eval(expression,paramMap)或execute执⾏,使⽤的payload⼀般为:
new java.lang.ProcessBilder(“calc”).start();
审计时搜索org.mvel2相关类,搜索关键字:
org.mvel2.MVEL.evalorg.mvel2.MVELInterpretedRuntime.parseorg.mvel2.ReducedValueorg.mvel2.PropertyAc
3、模板注⼊
模板引擎是为了使⽤户界⾯与业务数据(内容)分离⽽产⽣的,它可以⽣成特定格式的⽂档,⽤于⽹站的
模板引擎就会⽣成⼀个标准的HTML ⽂档。可以让程序实现界⾯与数据分离,业务代码与逻辑代码的分离。这⽅⾯的介绍参考之前的⽂章:模板注⼊漏洞全汇总。
主流的java后端模板引擎包括JSP、Freemarker、Velocity、Thymeleaf等。
3.1 Velocity
Velocity是较为常⽤的模板引擎,它的RCE主要通过两种⽅式实现
1)反射机制:
velocity的标签中⽀持$abc 这样的语法,如果abc是⼀个对象,则写模板时就可以利⽤它来进⾏反射,调⽤⼀些该对象的⽅法。如:
#set ($exec = "test")$exec.class.forName("java.lang.Runtime").getRuntime().exec("calc")
在任意⼀个.vm⽂件中注⼊payload,和在代码中⾃⼰调⽤velocity的解析表达式去执⾏,结果是相同的。
2)VelocityTools
如果产品有引⽤velocity-tools的jar包,那么只要在l中配置了ClassTool⼯具类的,就会存在命令注⼊漏洞。
同样,在某个.vm⽂件中输⼊payload效果也是⼀样的:
$class.inspect("java.lang.Runtime").Runtime().exec("calc").waitFor()
审计中要确定是否引⽤org.apache.velocity相关类,关注evalutate、execute和render的传参是否可控。
3.2 Freemarker
FreeMarker是⼀款模板引擎: 即⼀种基于模板和要改变的数据, 并⽤来⽣成输出⽂本(HTML⽹页,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。
已公开的有两个可以⽤来构造命令注⼊payload:
plate.utility.Execute
${test("calc")}
第⼀句新建⼀个类的实例test,第⼆句通过$赋值执⾏。
plate.utility.ObjectConstructor
⾸先新建⼀个类的实例ob,然后⽤ob构造⼀个ProccessBuilder的对象,之后通过创建新变量的⽅式,把ob构造对象的start⽅法执⾏结果赋值给新的变量。
审计中⾸先要关注是否存在ftl后缀名⽂件,正向跟踪在何处被处理执⾏,内容是否外部可控;或搜索是否引⽤freemarker相关类,关注类
和⽅法:
4、代码注⼊
在其他语⾔⾥也存在代码注⼊的漏洞,但在java环境中存在⼀些脚本语⾔,典型的有Groovy、
JavascriptEngine(ScriptEngineManager)、Jython等。
4.1 Groovy
Groovy是⼀种基于Java平台的⾯向对象语⾔,和java⾮常的相似,可以兼容所有的java语法。主要有两种漏洞场景:
1)Groovy⽂件
Groovy ⽂件可以编译成标准的 Java 类⽂件并在 Java 代码中重⽤。如果Groovy⽂件可外部导⼊或可修改内容,则可通过在Groovy⽂件
中注⼊代码,反射调⽤java的类达到执⾏任意命令的⽬的。
=rt.getMethod("getRuntime");Method ex =rt.getMethod("exec", String.class);ex.invoke(gr.invoke(null),"");
2)引⽤groovy类
使⽤java调⽤groovy的⽅法,如果groovy表达式可通过外部传⼊且防护校验不⾜,攻击者可注⼊恶意代码实现代码注⼊,执⾏groovy表达
式的类⽅法⼀般有:
groovy.vy.lang.GroovyShell.parse|evaluategroovy.lang.Script.rungroovy.lang.GroovyClassLoader.parseClassorg
审计中需关注动态脚本编辑、模板导⼊功能,代码层搜索是否调⽤vy包,如下通过InvokeHelper. newScript⽅法加载Groovy脚本并执⾏:
5、第三⽅组件
查看引⽤的第三⽅开源组件,如引⽤了Fastjson<1.2.60,Shiro<=1.2.4,Xstream<1.4.11,Jackson-databind2.0.0-
2.9.9.1,Spring Data Commons,Struts2.0.4-2.
3.34/2.5.0-2.5.16,weblogic等存在漏洞的组件均可直接使⽤Nday进⾏任意代码
执⾏(RCE)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论