有一天在对客户代码进行安全测试时,找到了可以执行js代码的地方,然后通过代码审计发
现有命令执行。公司作为甲方的安全人员,如何攻击和修复需要考虑。边想着如何让开发如何
修复,边想着如何绕过修复黑名单,于是一场左右手的游戏悄然展开。
在那时,通过代码审计,发现在执行js之前有一个简单的正则校验,它主要检查字段是否存在
:functionmainOutput(){}。若传入的字符串符合正则会调用javax.script.ScriptEngine类,用
于解析js和执行js代码。因为scriptEngine的有关功能使java代码变为可能,因此当我们用下
面的代码替换test时,就可以执行命令了。
:functionmainOutput(){}。若传入的字符串符合正则会调用javax.script.ScriptEngine类,用
于解析js和执行js代码。因为scriptEngine的有关功能使java代码变为可能,因此当我们用下
面的代码替换test时,就可以执行命令了。
到目前为止,我已经发现了这个比较简单的命令执行漏洞,然后我写了报告,感觉一切都完
事了。但情况并非如此发展了。因为解决这个问题的基本方法是在底层制作沙箱,或在上面
制作js沙箱。但底层沙箱和js沙箱都无法做到,其中一个太复杂另一个太影响效率(效率降低
了10倍,这是产品无法接受的)。因此,我们需要寻找另一种方式,新的思路是黑名单或白
名单。灵活(灵活是安全的最大敌人),方便顾客,不能采用白名单,因此只能应用黑名单。
事了。但情况并非如此发展了。因为解决这个问题的基本方法是在底层制作沙箱,或在上面
制作js沙箱。但底层沙箱和js沙箱都无法做到,其中一个太复杂另一个太影响效率(效率降低
了10倍,这是产品无法接受的)。因此,我们需要寻找另一种方式,新的思路是黑名单或白
名单。灵活(灵活是安全的最大敌人),方便顾客,不能采用白名单,因此只能应用黑名单。
这个开发人员第一次发给我代码,可以看到,应用黑名单对某些关键字进行了过滤。这两
个关键词都来源于阿里云的java沙箱整合。看得很清楚了。Runtime类被禁用了,是否存在
某些未被禁用的函数,是否存在某些可以绕开的思想?再次攻击就开始了。在PpeocessB
uilder这个新功能中,我发现了某些应用注解的方法。为什麽要这样做?因为黑名单中有一
个新功能。要探测新的函数,那么他需要将多个空白替换为一个。这时我突然想到了一个
空格,因为注解可以被绕过,空格也可以被绕过。于是绕了过去。
个关键词都来源于阿里云的java沙箱整合。看得很清楚了。Runtime类被禁用了,是否存在
某些未被禁用的函数,是否存在某些可以绕开的思想?再次攻击就开始了。在PpeocessB
uilder这个新功能中,我发现了某些应用注解的方法。为什麽要这样做?因为黑名单中有一
个新功能。要探测新的函数,那么他需要将多个空白替换为一个。这时我突然想到了一个
空格,因为注解可以被绕过,空格也可以被绕过。于是绕了过去。
因为其他内容没有进行更改,因此只将更改内容张贴出来。对于最后一次过滤,首先过滤
注释,然后再去匹配过滤过的和剩下的空白。此步骤的操作仅用于匹配newfunction。为何
要禁用新函数操作?因为js的特性,您可以应用js来返回新对象,比如下面的字符串。可见
,这种情况很难通过字符串匹配进行过滤。“黑名单”总是有潜在的风险,而且总是会有新
的绕开的想法。而且白名单比黑名单要好很多,但也失去了很多灵活性。
注释,然后再去匹配过滤过的和剩下的空白。此步骤的操作仅用于匹配newfunction。为何
要禁用新函数操作?因为js的特性,您可以应用js来返回新对象,比如下面的字符串。可见
,这种情况很难通过字符串匹配进行过滤。“黑名单”总是有潜在的风险,而且总是会有新
的绕开的想法。而且白名单比黑名单要好很多,但也失去了很多灵活性。