java代码审计工具_Java代码审计汇总系列(六)——RCE

java代码审计工具_Java代码审计汇总系列(六)——RCE

2023年7月29日发(作者:)

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 =time().exec(new String[]{"/bin/sh","-c", cmd});StreamGobblererrorGobbler = new StreamGobbler(orStream(), "ERROR");2、表达式注⼊主流的Java表达式主要有OGNL、SpEL、MVEL、EL、Fel、jstl_el等。2.1 SpELSpring 表达式语⾔(简称SpEL):是⼀个⽀持运⾏时查询和操作对象图的强⼤的表达式语⾔。在spring中使⽤parseExpression()⽅法解析SPEL表达式,使⽤ue()⽅法执⾏SPEL表达式,如下案例:常见的payload是sionexp=xpression("T(e).getRuntime().exec('calc')");因此审计SPEL表达式注⼊需要搜索的关键字有:sion|parseExpression|getValue|getValueType|value="#{*}然后逐层跟踪调⽤关系链,如果parseExpression、getValue、getValueType传⼊的参数外部可控,就存在spel注⼊的安全风险,对应的防御办法也是通过⽩名单限制⼊参。2.2 OGNLOGNL是最常见的表达式之⼀,Struts2也是因为OGNL表达式⽽“臭名昭著”。它是Object-Graph Navigation Language的缩写,主要的功能是对对象进⾏处理,包括存取对象的任意属性,调⽤对象的⽅法,遍历整个对象的结构图,实现字段类型转化等。漏洞产⽣的原因多为代码调⽤OGNL的getValue⽅法并解析执⾏:常⽤的payload为:%{@e@getRuntime().exec('calc')}因此审计OGNL表达式注⼊需检索importognl.*,检查产品是否引⽤ognl相关类,检查使⽤了ognl相关代码类的getValue⽅法和setValue⽅法是否存在外部参数可控。2.3 FelFel(Fast Expression Language),是⼀种开源表达式引擎,⽀持解释执⾏和编译执⾏,⽀持直接调⽤任何第三⽅类中的⽅法,这种功能使得fast-el表达式可以具有java代码⼀样的能⼒,虽然本⾝对⼀些危险函数进⾏了⿊名单校验,但因存在遗漏从⽽造成任意代码执⾏。Fel的RCE主要通过其⽀持的 $ 和 . 运算触发,即通过“$(‘class’).method”形式的语法,调⽤类和⽅法,如项⽬调⽤了上⾯的OGNL,则可以对其调⽤:$().getvalue(” @e@getRuntime().exec('')”,null)审计中可搜索检查是否使⽤Fel表达式,⽽后搜索eval/compile函数⼊参是否外部可控。防范办法可采⽤⿊名单,禁⽤$ 和 . 操作符或⽩名单⽅法控制表达式中可以的类,修改FelBuilder类中的newSecurityMgr函数,改成默认使⽤⽩名单的⽅式(return new RegexSecurityMgr(enables, null);),并根据实际情况配置允许调⽤的java类。2.4 MVELMVEL表达式旨在成为更有效的表达式语⾔,⽐如直接⽀持集合、数组和字符串匹配,正则表达式的运算操作等,⼀般通过(expression,paramMap)或execute执⾏,使⽤的payload⼀般为:new sBilder(“calc”).start();审计时搜索2相关类,搜索关键字:tyAc3、模板注⼊模板引擎是为了使⽤户界⾯与业务数据(内容)分离⽽产⽣的,它可以⽣成特定格式的⽂档,⽤于⽹站的模板引擎就会⽣成⼀个标准的HTML⽂档。可以让程序实现界⾯与数据分离,业务代码与逻辑代码的分离。这⽅⾯的介绍参考之前的⽂章:模板注⼊漏洞全汇总。主流的java后端模板引擎包括JSP、Freemarker、Velocity、Thymeleaf等。3.1 VelocityVelocity是较为常⽤的模板引擎,它的RCE主要通过两种⽅式实现1)反射机制:velocity的标签中⽀持$abc 这样的语法,如果abc是⼀个对象,则写模板时就可以利⽤它来进⾏反射,调⽤⼀些该对象的⽅法。如:#set ($exec = "test")$e("e").getRuntime().exec("calc")在任意⼀个.vm⽂件中注⼊payload,和在代码中⾃⼰调⽤velocity的解析表达式去执⾏,结果是相同的。2)VelocityTools如果产品有引⽤velocity-tools的jar包,那么只要在中配置了ClassTool⼯具类的,就会存在命令注⼊漏洞。同样,在某个.vm⽂件中输⼊payload效果也是⼀样的:$t("e").time().exec("calc").waitFor()审计中要确定是否引⽤ty相关类,关注evalutate、execute和render的传参是否可控。3.2 FreemarkerFreeMarker是⼀款模板引擎: 即⼀种基于模板和要改变的数据, 并⽤来⽣成输出⽂本(HTML⽹页,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。已公开的有两个可以⽤来构造命令注⼊payload:1)e${test("calc")}第⼀句新建⼀个类的实例test,第⼆句通过$赋值执⾏。2)Constructor⾸先新建⼀个类的实例ob,然后⽤ob构造⼀个ProccessBuilder的对象,之后通过创建新变量的⽅式,把ob构造对象的start⽅法执⾏结果赋值给新的变量。审计中⾸先要关注是否存在ftl后缀名⽂件,正向跟踪在何处被处理执⾏,内容是否外部可控;或搜索是否引⽤freemarker相关类,关注类和⽅法:4、代码注⼊在其他语⾔⾥也存在代码注⼊的漏洞,但在java环境中存在⼀些脚本语⾔,典型的有Groovy、JavascriptEngine(ScriptEngineManager)、Jython等。4.1 GroovyGroovy是⼀种基于Java平台的⾯向对象语⾔,和java⾮常的相似,可以兼容所有的java语法。主要有两种漏洞场景:1)Groovy⽂件Groovy ⽂件可以编译成标准的 Java 类⽂件并在 Java 代码中重⽤。如果Groovy⽂件可外部导⼊或可修改内容,则可通过在Groovy⽂件中注⼊代码,反射调⽤java的类达到执⾏任意命令的⽬的。import ;Class> rt =e("e");Method gr=hod("getRuntime");Method ex =hod("exec", );((null),"");2)引⽤groovy类使⽤java调⽤groovy的⽅法,如果groovy表达式可通过外部传⼊且防护校验不⾜,攻击者可注⼊恶意代码实现代码注⼊,执⾏groovy表达式的类⽅法⼀般有:|lassorg审计中需关注动态脚本编辑、模板导⼊功能,代码层搜索是否调⽤包,如下通过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)。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690579902a372638.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信