JAVA中JS代码执行漏洞的攻防过程



      有一天在对客户代码进行安全测试时,找到了可以执行js代码的地方,然后通过代码审计发

现有命令执行。公司作为甲方的安全人员,如何攻击和修复需要考虑。边想着如何让开发如何

修复,边想着如何绕过修复黑名单,于是一场左右手的游戏悄然展开。
 
 
 
在那时,通过代码审计,发现在执行js之前有一个简单的正则校验,它主要检查字段是否存在

:functionmainOutput(){}。若传入的字符串符合正则会调用javax.script.ScriptEngine类,用

于解析js和执行js代码。因为scriptEngine的有关功能使java代码变为可能,因此当我们用下

面的代码替换test时,就可以执行命令了。
 
 
到目前为止,我已经发现了这个比较简单的命令执行漏洞,然后我写了报告,感觉一切都完

事了。但情况并非如此发展了。因为解决这个问题的基本方法是在底层制作沙箱,或在上面

制作js沙箱。但底层沙箱和js沙箱都无法做到,其中一个太复杂另一个太影响效率(效率降低

了10倍,这是产品无法接受的)。因此,我们需要寻找另一种方式,新的思路是黑名单或白

名单。灵活(灵活是安全的最大敌人),方便顾客,不能采用白名单,因此只能应用黑名单。
 
 
这个开发人员第一次发给我代码,可以看到,应用黑名单对某些关键字进行了过滤。这两

个关键词都来源于阿里云的java沙箱整合。看得很清楚了。Runtime类被禁用了,是否存在

某些未被禁用的函数,是否存在某些可以绕开的思想?再次攻击就开始了。在PpeocessB

uilder这个新功能中,我发现了某些应用注解的方法。为什麽要这样做?因为黑名单中有一

个新功能。要探测新的函数,那么他需要将多个空白替换为一个。这时我突然想到了一个

空格,因为注解可以被绕过,空格也可以被绕过。于是绕了过去。


 
因为其他内容没有进行更改,因此只将更改内容张贴出来。对于最后一次过滤,首先过滤

注释,然后再去匹配过滤过的和剩下的空白。此步骤的操作仅用于匹配newfunction。为何

要禁用新函数操作?因为js的特性,您可以应用js来返回新对象,比如下面的字符串。可见

,这种情况很难通过字符串匹配进行过滤。“黑名单”总是有潜在的风险,而且总是会有新

的绕开的想法。而且白名单比黑名单要好很多,但也失去了很多灵活性。
分享: