可利用的Java功能

时间:2010-12-02 20:38:23

标签: java security java-me java-ee

此问题与Exploitable PHP Functions类似。

受污染的数据来自用户,或者更具体地来说是攻击者。当受污染的变量达到接收器功能时,您就会有漏洞。例如,执行sql查询的函数是接收器,而GET / POST变量是污点源。

Java类库中的所有接收函数(适用于任何Java风格)都是什么?我正在寻找引入漏洞或software weakness的功能。我对远程执行代码漏洞特别感兴趣。是否存在整个类/库,其中包含黑客想要影响的功能恶劣?人们如何不小心制造危险的Java代码?

3 个答案:

答案 0 :(得分:31)

这是一个基于我对客户端Java安全性的个人研究的列表,并使用Eclipse IDE查看SecurityManager检查的方法。

ClassLoaders定义类(=任意java代码执行)

java.lang.ClassLoader.defineClass
java.net.URLClassLoader

=代码执行

Java Beans Introspection可能会将ClassLoaders转移到来自不受信任来源的加载类example vuln - cve-2010-1622

java.beans.Instrospector.getBeanInfo

=代码执行

文件访问

java.io.File (constructor)
java.io.File.delete
java.io.File.renameTo
java.io.File.listFiles
java.io.File.list

=删除/重命名文件,目录列表

文件流/阅读器类

java.io.FileInputStream
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter
java.io.RandomAccessFile

=文件读/写访问

Java系统属性

System.setProperty
System.getProperties
System.getProperty

=某些系统属性可能包含一些几乎敏感的信息,而某些系统属性可能会改变关键内容的执行,但我没有示例,但

加载本机库

System.load
System.loadLibrary

=任意代码执行

执行操作系统可执行文件

Runtime.exec
ProcessBuilder (constructor)

生成本机系统输入事件

java.awt.Robot.keyPress/keyRelease
java.awt.Robot.mouseMove/mousePress/mouseRelease

(因为服务器可能甚至没有图形环境,可能是牵强附会的)

Java反射 - 访问任意(甚至私有)字段和方法

java.lang.Class.getDeclaredMethod
java.lang.Class.getDeclaredField
java.lang.reflection.Method.invoke
java.lang.reflection.Field.set
java.lang.reflection.Field.get

=从披露敏感信息到最终代码执行,具体取决于具体情况

Java脚本引擎

javax.script.ScriptEngine.eval

=任意代码执行

答案 1 :(得分:8)

代码执行漏洞:

  1. 私人反思,但受污染的数据以危险的方式到达那里并不常见
  2. 本地互操作代码,不能充分验证其参数
  3. 解串行器即可。可能是最危险的,因为您可能希望从不受信任的数据中反序列化。一些序列化程序相对安全,只使用公共构造函数/ setter,但其他序列化程序访问私有字段。如果没有类型白名单,它可以实例化任意类型并在它们上调用setter。
  4. 任何形式的IO,特别是文件
  5. 动态加载库。特别是使用相对路径。特别是相对于工作目录而不是可执行目录
  6. (这是关于.net,但我希望Java非常相似)

    数据注入

    然后是注入函数系列,通常可以通过不对字符串进行操作但使用专用库函数来防止。这些通常不会导致任意代码注入。

    1. html injectiong / XSS(很大程度上是由自动转义输出并干净地分离转义和未转义字符串的视图引擎(可能使用不同类型)阻止的)
    2. SQL注入(由预准备语句阻止)
    3. 文件路径注入

答案 2 :(得分:7)

我确信这个列表会随着我开始寻找真正的漏洞而增长:

  1. Spring classloader

  2. 吞下的例外情况 - 正如已经指出的,吞食例外可能不会直接导致剥削,但它可能导致未发现剥削。

  3. String[] commands = {args[0]};
    Runtime.getRuntime().exec(commands);

    我意识到这是一个相当简单的项目,但运行类似于上面的代码可以允许您传递这样的内容:&& del /如果在Windows上或;rm -rf /在* nix上
  4. 人们制造危险的Java代码的最大方式就是懒惰。正如您所说,在运行之前没有清理用户输入。