当Nashorn失去括号:非典型Java命令执行绕过

💡 原文中文,约3000字,阅读约需8分钟。
📝

内容提要

这篇文章介绍了如何在Java的Nashorn脚本中执行任意命令的方法。通过利用Nashorn脚本特性,结合JavaScript和Java两门语言的特点,构造了一个Payload来执行任意代码和命令。文章提到了使用Fastjson相关的利用链和重写setter方法的方法来实现。同时,还介绍了一个有趣的语法和一个符合条件的setter接口。文章指出,这些方法都是在不使用小括号和中括号的情况下实现的。

🎯

关键要点

  • 文章讨论如何在Java的Nashorn脚本中执行任意命令,且不使用小括号和中括号。

  • Nashorn脚本是JavaScript的实现,但与浏览器中的JavaScript存在差异,无法直接使用浏览器中的绕过方法。

  • 通过创建一个包含getter和setter的User类,展示了如何在Nashorn中通过setter和getter执行函数。

  • 提到利用Fastjson反序列化漏洞的相关利用链来解决问题,但指出这些链各有不足。

  • 介绍了Nashorn支持在JavaScript中实现Java接口和抽象类的特殊语法,可以省略括号。

  • 通过重写setter方法为eval函数,结合Customizer接口,构造了最终的Nashorn脚本来执行任意代码。

  • 最终成功执行了计算器程序,展示了Nashorn脚本特性的利用方法。

延伸问答

如何在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,传入执行计算器的命令,最终成功弹出计算器。

🏷️

标签

➡️

继续阅读