Java漏洞

一、跨站脚本(Cross-Site Scripting,XSS)

是一种常见的Web安全漏洞,攻击者通过注入恶意代码到网页中,使得这些代码被其他用户的浏览器执行,从而攻击用户的计算机系统.
XSS攻击通常分为以下几类:

  • 反射型XSS:攻击者构造一个恶意的URL,将恶意代码注入到URL中,诱使用户点击该URL,从而触发攻击。

  • 存储型XSS:攻击者将恶意代码存储在服务器上的数据库中,当其他用户访问相应的页面时,这些代码会被读取并执行,从而攻击用户。

  • DOM-based XSS:攻击者通过修改浏览器中的DOM树,将恶意代码注入到网页中,诱使用户执行恶意代码。

当Java程序扫描到跨站脚本漏洞时,通常会给出一些具体的提示信息,比如漏洞出现的位置、攻击者可以注入的代码类型等等。一般来说,修复跨站脚本漏洞需要在应用程序的代码中加入一些安全措施,如输入验证、输出过滤等,以防止攻击者注入恶意代码。
跨站脚本示例:

示例一:

假设有一个搜索页面,用户在该页面输入一个关键词,然后该关键词将被发送到服务器进行搜索,最后将搜索结果返回给用户。

如果程序没有对用户输入的关键词进行过滤,攻击者就可以在搜索框中输入一段恶意的脚本代码,比如:

1
<script>alert('XSS attack');</script>

当其他用户访问该页面并搜索该关键词时,这段恶意代码就会被服务器返回给用户的浏览器执行,从而弹出一个警告框,对用户进行攻击。

为了避免这种攻击,程序应该对用户输入的关键词进行过滤和转义,以确保任何恶意的脚本都无法执行。例如,可以使用一些Web开发框架提供的安全函数来实现这一点,如在Java中可以使用ESAPI库中提供的函数进行输入验证和输出过滤。

示例二

假设有一个Java Web应用程序,其中一个Servlet接收一个名为”message”的参数,并将其显示在页面上。代码如下:

@WebServlet("/xss")
public class XssServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String message = request.getParameter("message");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>XSS漏洞示例</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

如果程序没有对用户输入的”message”参数进行过滤和转义,攻击者就可以在URL中注入恶意代码,例如:

1
http://example.com/xss?message=<script>alert('XSS attack');</script>

当其他用户访问该URL时,这段恶意代码就会被服务器返回给用户的浏览器执行,从而弹出一个警告框,对用户进行攻击。

为了避免这种攻击,程序应该对用户输入的参数进行过滤和转义,以确保任何恶意的脚本都无法执行。例如,在Java中可以使用ESAPI库中提供的函数进行输入验证和输出过滤,以确保用户输入的数据不会包含任何恶意的脚本。

二、SQL注入(SQL Injection)漏洞

攻击者通过在Web应用程序中注入恶意SQL语句来获取敏感信息,修改数据或者执行任意代码。
SQL注入漏洞示例

假设一个Web应用程序中有一个搜索功能,用户可以通过输入关键字搜索相关内容。如果程序没有对用户输入的关键字进行过滤,攻击者就可以在搜索框中注入恶意的SQL语句,例如:

1
' OR 1=1; --

这段代码将会被拼接到SQL查询语句中,并使查询语句变为:

SELECT * FROM articles WHERE title='' OR 1=1; -- '

攻击者就可以绕过身份验证,获取文章列表中所有文章的信息

三、文件包含(File Inclusion)漏洞

攻击者利用Web应用程序中存在的文件包含漏洞,向应用程序中注入恶意代码,以获取敏感信息或者执行任意代码。
文件包含漏洞示例

假设一个Web应用程序中有一个功能,允许用户在服务器上查看指定的文件。如果程序没有对用户输入的文件名进行过滤,攻击者就可以通过在URL中注入恶意的文件名来读取任意文件,例如:

1
http://example.com/viewfile.php?file=../../../etc/passwd

这段代码将会被拼接到文件路径中,并使程序读取/etc/passwd文件并将其显示在页面上,攻击者就可以获取敏感信息

四、CSRF(Cross-Site Request Forgery)漏洞

攻击者通过欺骗用户在已经登录的Web应用程序中执行某些操作,从而窃取用户的身份验证信息或者执行任意操作。
CSRF漏洞示例

假设一个Web应用程序中有一个功能,允许用户通过访问URL来删除自己的帖子。如果程序没有进行CSRF防护,攻击者就可以伪造一个带有删除帖子的请求的页面,欺骗用户点击链接,例如:

1
<img src="http://example.com/deletepost.php?postid=123&action=delete">

当用户点击该链接时,程序将会执行删除操作,攻击者就可以删除用户的帖子。

五、认证与授权漏洞

攻击者通过欺骗或者绕过Web应用程序的身份验证或者授权机制,获取未授权的访问权限或者执行任意操作。

认证与授权漏洞示例
假设一个Web应用程序中的一个页面需要特定的权限才能访问,例如管理员权限。如果程序没有进行足够的身份验证或者授权机制,攻击者就可以绕过该机制,获取管理员权限并执行任意操作。

六、逻辑漏洞

攻击者利用Web应用程序中的逻辑漏洞,绕过应用程序的安全措施,获取未授权的访问权限或者执行任意操作。

逻辑漏洞示例
假设一个Web应用程序中的一个功能需要进行支付,用户需要在完成支付后才能获得相应的商品或者服务。如果程序存在逻辑漏洞,例如没有对支付进行验证或者没有对用户状态进行检查,攻击者就可以绕过支付流程,获得相应的商品或者服务,而不需要真正支付
七、敏感数据泄露漏洞

Web应用程序在处理敏感信息时出现漏洞,导致敏感信息泄露。

敏感数据泄露漏洞示例
假设一个Web应用程序中存储了用户的敏感信息,例如信用卡号、社保号码等等。如果程序没有对这些信息进行足够的保护,攻击者就可以通过利用程序的漏洞或者直接攻击数据库等方式获取这些信息。

八、命令注入(Command Injection)漏洞

攻击者通过在Web应用程序中注入恶意命令,从而获取敏感信息或者执行任意代码.

命令注入漏洞示例
假设一个Web应用程序中有一个命令行操作的功能,例如允许管理员执行一些命令来管理服务器。如果程序没有对用户输入的命令进行过滤,攻击者就可以在命令中注入恶意的代码,例如:

1
; rm -rf /

这段代码将会被拼接到命令中,并使命令变为:

1
ls; rm -rf /

攻击者就可以执行任意代码,删除服务器上的所有文件。

需要注意的是,以上示例仅仅是每个漏洞类型的一个简单示例,实际的漏洞可能会更加复杂,攻击者也会不断地创造新的攻击方式来绕过应用程序的防御措施。为了确保Web应用程序的安全性,需要开发人员注重代码的安全性,以及定期进行安全测试和漏洞扫描

审计方法总结

主要代码审计方法是跟踪用户输入数据和敏感函数参数回溯:跟踪用户的输入数据,判断数据进入的每一个代码逻辑是否有可利用的点,此处的代码逻辑可以是一个函数,或者是条小小的条件判断语句。

敏感函数参数回溯,根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的,只要找到这些函数,就能够快速挖掘想要的漏洞。

以下是基于关键词审计技巧总结:

在搜索时要注意是否为整个单词,以及小写敏感这些设置

漏洞名称 关键词
密码硬编码、密码明文存储 password 、pass、jdbc
XSS getParamter、<%=、param.
SQL 注入 Select、Dao 、from 、delete 、update、insert
任意文件下载 download 、fileName 、filePath、write、getFile、getWriter
任意文件删除 Delete、deleteFile、fileName 、filePath
文件上传 Upload、write、fileName 、filePath
命令注入 getRuntime、exec、cmd、shell
缓冲区溢出 strcpy,strcat,scanf,memcpy,memmove,memeccpy
Getc(),fgetc(),getchar;read,printf
XML 注入 DocumentBuilder、XMLStreamReader、SAXBuilder、SAXParser
SAXSource 、TransformerFactory 、SAXTransformerFactory 、
反序列化漏洞 ObjectInputStream.readObject、ObjectInputStream.readUnshared、XMLDecoder.readObject
Yaml.load 、 XStream.fromXML 、 ObjectMapper.readValue 、JSON.parseObject
url 跳转 sendRedirect、setHeader、forward
不安全组件暴露 activity、Broadcast Receiver、Content Provider、Service、 inter-filter
日志记录敏感信息 log log.info logger.info
代码执行 eval、system、exec

其他漏洞审计方法

  1. CSRF

审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制

在Smpkpiappealcontroller.java中200处,直接用用ids控制删除操作,而没有添加防 csrf的随机token验证检查,存在csrf漏洞。

Java/main/com/venustech/tsoc/cupid/smp/kpi/dao/smpkpideclardao.java 517行,对传

入的ids进行删除操作。

  1. Struts2 远程代码执行漏洞

审计方法:查看 struts 插件的版本信息是否为漏洞版本漏洞版本查询网址:https://www.exploit-db.com/

  1. 越权操作

审计方法:重点关注用户操作请求时查看是否有对当前登陆用户权限做校验从而确定是否存在漏洞,有些厂商会使用一些主流的权限框架,例如 shiro ,spring security 等框架,那么需要重点关注框架的配置文件以及实现方法

漏洞示例:

在以下文件中采用了 shiro 框架进行权限控制,在代码 58-72 行处为控制访问路径的权限设置,51-55 行处为对 admin 路径下访问限制,只有 SysyUserFilter 设置了 isAccessAllowed 方法,其他过滤均没有

SysUserFilter 中 isAccessAllowed 具体实现方法如下,90-93 行处没有对是否为当前用户进行判断,导致了越权

其他过滤文件均只设置了 onAccessDaniad()方法

如果没有使用框架的话,就要注意每个操作是否有权限

代码 7 行处获取 session 里的 username,只判断了 username 是不是为空,如果在截取数据包的时候将 username 再重新赋一个值就有可能造成越权漏洞。

以这个年度服务费用编制功能为例,测试一下,代码如图所示:

  1. 会话超时设置

审计方法:

Javaweb 应用会话超时设置一般有俩种方法:一是在配置文件 web.xml 设置

二是通过 java 代码设置

  1. 敏感数据弱加密

审计方法:

敏感数据弱加密主要看数据传输中的加密方法,一般写在工具类 util 中以下文件中为 base64 编码方法