现在你可以阅读很多有关代码注入,漏洞利用,缓冲区,堆栈和堆溢出等的信息,从而导致注入和运行代码。我想知道这些东西与Java有什么关系。
我知道,Java语言中没有指针。但是JVM是否在堆和/或堆栈中组织数据? 我知道没有eval函数(比如在PHP中)所以你不能轻易地将输入用作Java代码。我不太确定在字节码级别上会发生什么。
我认为XSS是可能的,例如在Java EE应用程序中,当没有过滤输入时。但这不是一个JavaScript注入,因为注入的代码在浏览器中而不是在JVM中运行吗?
那么使用java可以进行哪些代码注入,哪些不是?这对其他Java平台语言也是如此吗?
提前致谢。
答案 0 :(得分:15)
java程序本身几乎不容易受到代码注入的攻击。但是,支持该应用程序的所有本机代码都容易受到所有不同类型的代码注入的攻击 - 这包括应用程序或其库中的JVM和所有本机代码部分。
此外,还有一些事情需要考虑:
可以将java用作其他系统的网关:
SQL注入
XSS(最终只不过是JavaScript注入)
如果java程序本身就是某种解释器/编译器,则可能会将代码注入解释语言/编译程序(这包括将程序用作java编译器......)
当然,如果你可以让java程序将文件写入包含代码的磁盘(无论是本机,java还是其他东西),你可以通过其他方式(可能是一个不同的漏洞)执行它在您的应用程序,操作系统或其他应用程序) - 这不是直接代码注入,但实际上非常相似。
答案 1 :(得分:4)
如果服务器应用程序在运行时创建字节码(例如使用BCEL或Javassist),并且如果此创建可能受到用户输入的影响,则可以注入代码。
但是,如果您的应用程序不使用魔法(应该是所有应用程序的99%),则无法实现。
答案 2 :(得分:3)
您可以编写一个接受Java代码片段的Web服务,将其包装在类/方法声明中,将其保存到磁盘,在其上运行编译器,然后动态加载并执行结果。因此代码注入肯定是可能的。
但是对于典型的Java实现,它可能效率不高,因为相对较重的编译过程(尽管对某些应用程序可能仍然有用)。
代码注入与SQL高度相关,因为许多初学者的“初步猜测”是使用字符串连接将变量插入到语句中。但它很少成为Java程序员的一个想法。所以这就是它没有太大关注的原因。
如果Java编译器被公开为轻量级的库服务,那么你就会有更接近等同于eval
的东西,因此它可能会开始变成一个相关的问题。
答案 3 :(得分:2)
如果有可能,Java已经死了很长时间。
另一方面,通过使用PreparedStatement
来存储用户控制的输入,很容易避免SQL注入,并且通过使用<c:out/>
(重新)显示用户来轻松避免使用XSS在网页上控制输入。
答案 4 :(得分:2)
有几种方法可以将Java代码注入到应用程序中,例如使用脚本API或动态JSP包含。
下面的代码允许用户将任意Javascript注入Java的脚本引擎。
import javax.script.*;
public class Example1 {
public static void main(String[] args) {
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
System.out.println(args[0]);
engine.eval("print('"+ args[0] + "')");
} catch(Exception e) {
e.printStackTrace();
}
}
}
在这种情况下,攻击者决定注入在文件系统上创建文件的代码。
hallo'); var fImport = new JavaImporter(java.io.File); with(fImport) { var f = new File('new'); f.createNewFile(); } //
查看owasp网站了解更多示例
答案 5 :(得分:1)
除非你在服务器上做了奇怪的事情(比如动态生成代码等),否则不可能为代码注入做好准备。
虽然我可以想到应用程序根据用户输入动态创建JSP的(丑陋)情况。该JSP将被转换为Java代码,该代码由Web容器编译为字节代码,然后执行。这可以引入注入点。但是通常动态生成JSP没有任何意义。
答案 6 :(得分:0)
你不能注入Java。但是如果你不小心,人们可以注入Javascript(即你提到的XSS)或SQL。有堆和堆栈,但无法找到它们。
答案 7 :(得分:0)
您无法注入java,但如果输入未正确过滤,则所有Web应用程序都容易受到XSS攻击。任何与sql数据库交互的应用程序都可能容易受到SQL注入攻击。为避免这种情况,您需要查看参数化查询。
答案 8 :(得分:0)
Java让自己自行入侵,我不确定是否可以正确阅读所有这些响应,但是我认为Java极其脆弱。注射很有可能