Java字符串中的Unicode逃逸漏洞:隐藏恶意载荷的技术解析

本文详细介绍了Java源代码中Unicode转义字符的特殊处理机制,攻击者可以利用\u0022等Unicode编码在字符串中隐藏恶意代码,实现远程代码执行,文章还提供了具体攻击示例和防护建议。

在Java源代码字符串中隐藏载荷

在这篇文章中,我们将展示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时,请确保在使用前验证它!

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