当Nashorn失去括号:非典型Java命令执行绕过
内容提要
这篇文章介绍了如何在Java的Nashorn脚本中执行任意命令的方法。通过利用Nashorn脚本特性,结合JavaScript和Java两门语言的特点,构造了一个Payload来执行任意代码和命令。文章提到了使用Fastjson相关的利用链和重写setter方法的方法来实现。同时,还介绍了一个有趣的语法和一个符合条件的setter接口。文章指出,这些方法都是在不使用小括号和中括号的情况下实现的。
延伸解读
Nashorn与浏览器JavaScript的差异
文章指出,Nashorn虽然基于JavaScript,但不支持ES6语法,且缺乏DOM和全局错误处理对象,因此浏览器中常见的无括号XSS绕过方法无法直接套用。这提醒安全研究人员,在Java环境中利用脚本引擎时,需考虑其特有的Java集成特性,而非简单移植前端技巧。
利用Java Bean属性访问执行代码
在Nashorn中,对Java对象属性的赋值和读取会触发setter和getter方法。文章通过User类示例验证了这一点,说明攻击者可以借助属性访问来间接调用方法,从而绕过对括号的限制。这种机制与Fastjson反序列化漏洞中的利用链有相似之处,但文章也指出Fastjson链存在依赖外网、版本限制等不足。
Nashorn特殊语法实现接口
Nashorn允许在JavaScript中实现Java接口或抽象类,并支持省略无参构造函数的括号。例如,可以创建Runnable实例并指定run方法为print函数。这为无括号调用提供了新思路:通过重写接口中的setter方法为eval,再结合属性赋值,即可执行任意代码。文章最终利用Customizer接口的setObject方法成功弹出计算器。
Q&A
如何在Nashorn脚本中执行任意命令而不使用括号和中括号?
可以通过构造包含getter和setter的User类,利用setter和getter来执行函数,从而实现任意命令的执行。
Nashorn脚本与浏览器中的JavaScript有什么不同?
Nashorn不支持ES6语法,没有DOM相关方法,也没有全局对象可供使用,因此浏览器中的绕过方法无法直接应用于Nashorn。
Fastjson反序列化漏洞在Nashorn中的应用是什么?
可以利用Fastjson的相关利用链来执行任意代码,但这些链各有不足之处,如需要外网连接或Java版本限制。
如何通过重写setter方法来执行任意代码?
可以找到一个包含setter的方法接口,将其重写为eval函数,从而在执行赋值时执行任意代码。
Nashorn支持哪些特殊语法?
Nashorn支持在JavaScript中实现Java接口和抽象类,并允许省略无参构造函数的括号。
如何构造最终的Nashorn脚本来执行计算器程序?
通过创建一个Customizer对象并重写setObject方法为eval,传入执行计算器的命令,最终成功弹出计算器。