Java源代码字符串中的Unicode转义载荷隐藏技术

本文揭示了Java编译器处理Unicode转义字符的独特方式,攻击者可通过\u0022等Unicode编码在字符串中隐藏恶意代码,实现远程代码执行,这对Bambda等Java代码执行功能构成安全威胁。

Java源代码字符串中的Unicode转义载荷隐藏技术

在这篇文章中,我们将展示Java如何处理源代码字符串中的Unicode转义字符,这种方式可能会让你感到惊讶——以及如何滥用它们来隐藏恶意载荷。

我们最近发布了一个名为Bambdas的强大新功能。它允许你使用Java代码过滤Burp中的项目。但这让我们思考:如果能说服用户运行一个看起来像是无害漏洞载荷但实际上在本地机器上执行任意代码的Bambda,会发生什么?

当你在一个Bambda中使用以下代码时,你期望会发生什么:

1
var log4jpayload = "%24%7Bjndi:ldap://psres.net/\u0022;Runtime.getRuntime().exec(\u0022open -a calculator\u0022);//%7D";

如果你期望这只是一个简单的字符串赋值,那你就错了。实际发生的情况是,Java编译器将Unicode编码的双引号(\u0022)视为双引号并关闭字符串。然后Runtime.getRuntime()被执行,同时传递带有编码字符串的命令。Java几乎允许你用Unicode转义编码整个语法!

我们在任何公开文档中都没有找到这种技术的记录,但如果你喜欢这个技术,你可以在这篇论文中找到一系列相关的攻击。

请记住,Bambda允许任意代码执行,因此当使用来自不受信任来源的Bambda时,请确保在使用前验证它!

相关标签: RCE, Java

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计