本文介绍攻击统计中涉及的攻击类型以及相关防护建议。

攻击类型 说明 防护建议
JNDI注入 当应用进行JNDI查询的时候,若查询的URL可以由攻击者控制,则攻击者可以使服务器去查询恶意的链接使得服务器加载一些恶意Class,实现任意代码执行。
  • 若该漏洞源于第三方组件,请及时进行组件版本升级。
  • 若为自写JNDI查询代码,请对查询的URL进行限制,禁止一些危险协议的查询。
JNI注入 JNI注入是一种通用的RASP(Runtime Application Self-Protection)绕过手段。当攻击者拿到代码执行权限后,可以通过Java Native函数去调用外部的恶意动态链接库,从而绕过Java层的安全防护,并隐匿具体的恶意行为。 您的服务器可能存在代码执行漏洞,请检查漏洞的位置并限制执行代码的功能。
JSTL任意文件包含 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。当用户可控参数被直接拼接到JSTL标签中而未对该参数进行任何限制的情况下,攻击者可以构造特殊的攻击脚本造成任意文件读取、SSRF的攻击。 尽可能不要将用户可控参数直接拼接到JSTL标签上,如果必须这样做,请对该参数的内容进行严格的白名单控制。
SQL注入 SQL注入手段通过把SQL命令插入到页面请求或Web表单的查询字符串中,以达到欺骗服务器执行指定SQL语句的目的。它可以通过在Web表单中输入SQL语句,得到存在安全漏洞的网站上的数据。 SQL注入是由拼接SQL语句引起的。请尽可能使用预编译来处理传入的参数,或通过白名单和黑名单来限制拼接参数。
XXE 指XML外部实体注入漏洞(XML External Entity Injection)。当XML文件在引用外部实体时,通过构造恶意内容,可以导致任意文件读取,命令执行和内网攻击等不良后果。 请检查应用程序在解析XML时是否需要加载外部实体。如果不需要,请在XML解析配置中禁用外部实体。
XSS 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 XSS漏洞本质上是一种HTML注入,也就是将HTML代码注入到网页中。那么其防御的根本就是在将用户提交的代码显示到页面上时做好一系列的过滤与转义。
  1. 过滤输入的数据,对例如:“ ‘ ”,“ “ ”,“ < ”,“ > ”,“ on* ”,script、iframe等危险字符进行严格的检查。这里的输入不仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
  2. 不仅验证数据的类型,还要验证其格式、长度、范围和内容。
  3. 不仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
  4. 对输出到页面的数据进行相应的编码转换,如HTML实体编码、JS编码等。对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行检查。
表达式注入 表达式组件提供了十分丰富的功能,支持在运行时查询和处理数据等,但很多表达式组件也提供了函数调用等权限较高的功能,一旦未对这些功能做限制,而攻击者又能够控制表达式执行的内容,那么攻击者将很有可能通过表达式执行任意代码。 请对进入表达式的内容进行严格限制,禁止大部分Java函数的调用。若是第三方组件漏洞导致,请及时升级组件版本。
恶意Attach Attach API是Java提供的动态修改字节码技术,该功能可以实现动态修改运行时应用的字节码。很多攻击者通过该手法进行Agent型内存马的注入,具有较高的欺骗性。 您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。
恶意Beans绑定 Java存在一些框架支持对应用运行时Beans的参数绑定,一旦未对绑定Beans的类型进行限制,攻击者就可以通过对一些敏感Beans值的修改,破坏应用的运行,甚至造成执行任意代码。 请对可以绑定的Beans的类型进行限制,禁止对类似于Class、Classloader类型的Beans值进行修改。若是第三方组件漏洞导致,请及时升级组件版本。
恶意DNS查询 恶意DNS查询存在多种利用方式。攻击者极有可能通过DNS协议来突破内网网络限制,从而将敏感信息带出内网,也可能通过DNS协议去探测内网系统是否存在SSRF、JNDI注入等漏洞。 恶意DNS查询是由服务器向用户控制的参数发送请求所引起的。请检查参数并通过白名单进行限制。
恶意反射调用 RASP自保护模块,禁止攻击者通过反射的方式去修改运行时RASP的相关数据。 您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。
恶意类加载 现阶段,很多0day、WebShell的利用均依赖于恶意类的加载,一旦恶意类加载成功,攻击者便可以通过恶意类的初始化来取得代码执行权限,从而进行一系列的恶意操作。
  • 若恶意类的加载是通过WebShell控制,请及时删除WebShell。
  • 若恶意类的加载是框架导致,请及时升级框架版本。
恶意外连 SSRF(Server-side request forgery)服务器端请求伪造漏洞指的是攻击者通过构造由服务端发起的请求,对网站内部系统进行攻击。 SSRF是由服务器向用户传入的参数发送请求所引起的。请检查参数并通过白名单进行限制。
恶意文件读写 Java提供RandomAccessFile,用于文件读写操作。当使用该Class进行文件读写的时候,如果未对文件路径、文件内容进行限制,攻击者可能读取到系统敏感文件,也可能上传木马文件。 请检查文件读取和上传是否正常。如果出现异常,请检查函数代码,并通过黑名单进行限制。
恶意文件上传 对于网站提供的文件上传功能,如果未对上传文件的类型进行限制,攻击者可能通过上传木马文件来获取服务器的更大权限,从而造成严重危害。 请限制上传文件的类型,禁止上传具有执行权限的文件,如JSP。
反序列化攻击 Java反序列是指把字符序列恢复为Java对象的过程,在对象生成过程中,若该对象包含一些危险度较高的代码,则攻击者可能通过控制生成对象的成员变量在对象进行反序列化的时候实现一些恶意攻击。
  1. 及时升级存在漏洞的组件版本。
  2. 若官方还未提供漏洞修复的组件版本,请暂时关闭该功能。
命令执行 命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令。 通常远程命令执行是由Web Shell或服务器的危险代码引起的。请检查命令执行的位置。如果是Web Shell,请及时删除。如果是服务器的正常功能,则可以通过白名单限制执行的命令。
目录遍历 网站自身的配置缺陷可能会使得网站目录被任意浏览,导致隐私信息泄露。攻击者可以利用该信息对网站进行攻击。 请检查目录遍历操作是否正常。如果异常,请检查函数的代码,并通过黑名单对相关命令(如“./”和“../”)进行限制。
内存马注入 内存马是一种新兴的木马技术,攻击者通过一些特殊的技术手段将木马注入到内存中,可以有效绕过WAF和主机防御的检测。 您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。
任意文件删除 对于网站提供的文件删除功能,如果是直接通过绝对路径或目录穿越符对文件进行读取和下载,没有相关文件路径的限制,那么,攻击者就可以利用这种方式获取敏感信息,对服务器进行攻击。 请检查文件删除操作是否正常。如果异常,请检查函数的代码,并使用黑名单对传入参数(如“./”和“../”)进行限制。
任意文件读取 对于网站提供的文件下载和读取功能,如果是直接通过绝对路径或目录穿越符对文件进行读取和下载,没有相关文件路径的限制,那么,攻击者就可以利用这种方式获取敏感信息,对服务器进行攻击。 请检查文件读取操作是否正常。如果异常,请检查函数的代码,并使用黑名单对传入参数(如“./”和“../”)进行限制。
数据库弱口令 当数据库使用强度较低的密码时,攻击者可能通过暴力破解获取正确的数据库密码,从而达到窃取数据库数据、获取系统权限等目的。 请使用更复杂的密码。
线程注入 线程注入是一种通用的RASP绕过手段。当攻击者拿到代码执行权限后,可以通过新建线程的方式使RASP丢失掉运行环境的上下文,从而影响RASP的防御能力。 您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。
危险协议使用 若服务端进行访问的URL用户端可控,而应用本身又未对该URL的协议进行限制,那么攻击者可能通过File、NetDoc等危险协议对服务器上的敏感文件进行读取。 请对URL可以访问的协议进行限制。
引擎注入 Java提供较多的第三方引擎组件(如rhino、Nashorn等JS引擎,velocity、freemarker等模板引擎),这些引擎通常提供了函数调用等权限较高的功能,一旦对这些功能未做限制,而攻击者又能够控制引擎执行的内容,那么攻击者将很有可能通过引擎执行任意代码。 请对进入引擎文件的内容进行严格限制,禁止大部分Java函数的调用。若是第三方组件漏洞导致,请及时升级组件版本。