首页
社区
课程
招聘
[原创]J2EE_WEB安全测试系列文章
发表于: 2016-6-7 14:01 15435

[原创]J2EE_WEB安全测试系列文章

2016-6-7 14:01
15435

文档参考:
1、JAVAWEB源码审计
9e5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3W2T1L8g2)9J5k6h3y4G2L8g2)9J5c8X3c8W2N6X3g2D9L8%4m8W2M7Y4N6G2M7X3E0K6i4K6u0r3j5$3&6Q4x3V1k6$3K9h3g2%4M7#2)9J5c8X3A6S2N6X3q4Q4x3V1k6D9K9h3u0J5j5i4u0&6N6X3W2W2N6#2)9J5k6h3A6K6M7q4)9K6c8Y4y4G2M7Y4c8Q4y4h3k6T1P5g2)9K6c8q4)9J5y4Y4y4Z5L8%4N6Q4y4h3k6S2j5Y4y4@1M7X3q4U0N6q4)9K6c8s2c8J5N6h3g2Q4x3U0k6K6K9r3!0%4i4K6g2X3j5h3I4D9i4K6y4p5i4K6t1$3M7$3g2S2M7X3y4Z5i4K6g2X3k6X3I4S2k6#2)9K6c8q4)9J5y4X3y4G2L8Y4c8W2L8Y4c8S2M7X3g2S2i4K6g2X3j5Y4W2Q4x3@1c8v1j5i4k6S2i4K6u0n7N6r3g2U0K9r3&6G2L8r3!0Y4P5g2)9J5y4Y4y4W2j5i4u0U0K9q4)9#2k6X3u0&6i4K6y4p5i4K6t1#2c8e0c8Q4x3U0g2n7b7W2)9J5y4f1p5K6i4K6t1#2c8e0N6Q4x3U0g2m8x3q4)9J5y4e0R3I4i4K6t1#2c8e0g2Q4x3U0g2m8c8g2)9J5y4f1p5I4i4K6t1#2c8e0S2Q4x3U0g2m8c8g2)9J5y4f1p5I4i4K6t1$3N6r3!0H3K9h3y4Q4y4h3k6T1P5g2)9K6c8q4)9J5k6o6q4Q4x3U0k6@1P5i4m8W2i4K6g2X3j5Y4W2Q4x3@1c8Q4x3U0g2q4y4W2)9J5y4e0R3&6i4K6t1#2z5o6m8Q4x3U0g2q4y4W2)9J5y4e0W2o6i4K6t1#2z5o6W2Q4x3U0g2q4y4#2)9J5y4f1t1I4i4K6t1#2b7V1u0Q4x3U0g2q4y4g2)9J5y4e0R3^5i4K6t1#2b7f1u0Q4x3U0k6A6j5X3#2Q4x3X3c8K6k6h3q4J5j5$3S2Q4x3@1c8Q4x3U0g2q4y4W2)9J5y4e0V1H3i4K6t1#2z5f1y4Q4x3U0g2q4y4#2)9J5y4f1t1@1i4K6t1#2b7e0t1`.
2、JSTL过滤XSS
6f1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8#2K9$3E0S2L8$3&6W2i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5I4i4K6u0r3x3o6q4Q4x3V1j5H3x3#2)9J5c8X3A6K6M7q4)9J5k6r3y4J5L8%4y4K6i4K6u0V1M7$3W2@1k6g2)9J5k6s2y4U0M7X3W2H3N6r3W2F1k6#2)9J5k6r3g2D9M7X3g2K6L8$3I4$3k6i4u0Q4x3X3g2Z5N6r3#2D9
3e8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4S2A6k6h3#2A6L8X3N6E0k6h3W2Q4x3X3g2A6N6r3g2&6k6g2)9J5k6h3y4G2L8g2)9J5c8X3u0D9L8$3N6Q4x3V1j5J5x3e0l9#2z5o6t1$3
d3bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4A6G2L8X3g2Q4x3X3g2%4L8$3!0&6N6h3&6Q4x3X3g2G2M7X3N6Q4x3V1k6U0L8$3&6@1k6h3&6@1i4K6u0r3x3U0b7@1z5l9`.`.
3、EL-injection
15bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8S2L8X3q4E0L8$3c8A6L8#2)9J5k6h3y4G2L8g2)9J5c8X3q4H3M7s2y4W2j5#2)9J5c8Y4u0W2M7$3g2S2M7X3y4Z5i4K6u0r3M7%4m8J5K9h3&6Y4i4K6u0V1M7X3g2E0L8%4c8W2i4K6u0V1j5$3!0V1k6g2)9J5k6s2N6A6N6r3S2Q4x3X3c8W2P5s2m8J5k6i4y4K6K9h3!0F1i4K6u0V1L8r3q4F1k6%4g2S2k6$3g2Q4x3X3c8A6L8X3A6W2j5%4c8A6L8$3&6Q4x3V1j5`.
4、XML漏洞
427K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4u0W2M7$3!0#2M7X3y4W2M7#2)9J5k6h3W2F1k6X3!0K6k6h3y4A6L8Y4y4@1K9i4c8#2N6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6L8$3q4H3i4K6u0V1j5i4c8@1j5h3y4C8i4K6u0V1x3W2)9J5c8R3`.`.
5、flash漏洞
1)4e2K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2V1k6i4c8W2j5%4c8A6k6Y4W2Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8%4y4@1i4K6u0r3z5o6j5J5z5e0R3K6z5o6l9J5x3K6y4Q4x3V1k6@1K9r3g2Q4x3X3c8H3K9i4c8X3j5h3I4D9M7#2)9J5k6r3!0X3i4K6u0V1j5h3I4D9L8%4N6A6L8X3N6Q4x3X3c8X3K9h3I4W2i4K6u0V1N6i4m8D9L8$3q4V1M7#2)9J5k6r3!0F1i4K6u0V1P5h3!0#2M7W2)9J5k6s2N6W2j5Y4y4A6N6r3f1`.
2)b77K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2W2L8s2m8Q4x3X3g2S2k6r3!0T1k6g2)9J5k6h3y4G2L8g2)9J5c8X3g2F1i4K6g2X3g2g2y4Q4x3V1k6r3L8r3q4K6K9q4m8D9j5i4c8X3L8%4u0E0i4K6u0r3M7X3g2X3k6i4u0W2L8X3y4W2i4K6u0r3j5h3y4@1K9h3!0F1M7$3y4J5K9i4m8@1i4K6u0r3x3#2)9J5c8X3k6D9j5i4y4Z5i4K6u0r3L8X3g2@1i4K6u0r3g2g2u0x3e0r3!0S2k6r3g2J5i4K6u0W2K9s2c8E0L8l9`.`.

一、认证测试
1.1、用户名枚举漏洞测试
1.1.1、漏洞产生原因分析
目前很多注册页面在注册前采用ajax、jquery无刷新先判断用户名是否已经被注册,该机制方便提醒用户是否账户已被注册,同时引入登录账户名可枚举安全问题。
如下代码:
1、客户端使用ajax技术实现无刷新获取表单提交数据至后端验证(ajax代码仅供参考):
function validatorloginName(){
                 var loginName=document.getElementById("uname").value;
                 if(loginName == "")
                 {
                         alert("用户名不能为空!");
                         return;
                 }
                 $.ajax({
                                 type: "POST", //提交方式  
                         url: "ValidateName", //后端业务处理页面   
                          data: "loginName="+loginName, //提交post数据
                         success: function(data)//回调处理方法{
                            if(data=="true"){   
                             alert("恭喜您!用户名没有被使用!");  
                            }else{   
                             alert("抱歉!用户名已存在!");   
                            }
                                  }         
                        });   
                }               
2、后端servlet业务处理参考代码:

1.1.2、安全测试方法
1、        使用burpsuite拦截ajax报文发送至Send to Intruder

2、针对用户名字段添加变量符$,添加payload进行账户遍历猜解。

1.1.3、修复建议
添加验证码、一次性token

1.2、用户名/密码弱口令
1.2.1、漏洞产生原因分析
业务系统发布或调试阶段使用弱口令,常见弱口令有admin/admin、admin/admin888、system/system888等等。

1.2.1、安全测试方法
测试人员可根据常见社工库做筛选排序,选出最常用的200个、6000个密码作为个人字典,在不同类型网站中进行使用。
1.2.2、修复建议
使用字母、数字、特殊字符长度超过8位字符位元素设置强壮口令,并定期修改。

1.3、登录认证模式绕过
υ        漏洞产生原因:
很多网站登录设计采用表单验证模式,登录设计如果存在sql注入漏洞,则可以通过sql注入语句进行表单绕过。
漏洞代码参考:

υ        安全测试方法
用户名/密码:'or'='or'/ 'or'='or',admin' or '1'='1/ admin' or '1'='1, ' or '1'='1/ ' or '1'='1,admin' or '1'='1—/11
υ        修复建议:

使用PrepareStatement预编译对象进行参数化查询。

1.3.2、非授权访问
υ        漏洞产生原因:
一些需要登录才能访问页面,缺乏对用户登录会话、token进行验证有效性判断,导致非合法会话、token也可以访问原本需要用户登录态页面。
υ        安全测试方法:
1、借助Dirbuster进行目录猜解、点击测试需授权访问页面能否在非登录状态下打开访问。
2、手工访问常见登录后页面main.jsp、menu.jsp、left.jsp、botton.jsp等。
υ        修复建议:
修复方法可以在某个页面文件包含一个用于验证会话/token是否有效的文件,也可以新建个过滤器Filter,在dofilter()方法中进行用户会话\token有效性判断,并在web.xml配置filter适用url,推荐使用过滤器,效率高如:
<filter>
        <filter-name>login</filter-name>
        <filter-class>com.jingxing.oa.filter.LoginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>login</filter-name>
        <url-pattern>admin/*</url-pattern>
</filter-mapping>

1.3.3、验证码机制绕过
υ        漏洞产生原因:
验证码设计用于区分机器与人为操作,可用于防治恶意注册、暴力破解等频发操作,如果验证码采用本地cookie生成验证、验证码无法一次/一用(不及时刷新)、或者验证码可以轻易OCR识别则存在设计不当。
υ        安全测试方法:
1、        验证码输出在cookie中

1、        验证码不及时更新漏洞
每次登录验证码老半天不更新、一次多用。
2、        可轻易OCR(噪点或扭曲度不够)
可下载b9cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4A6G2L8X3g2Q4x3X3g2%4L8$3!0&6N6h3&6Q4x3X3g2G2M7X3N6Q4x3V1k6U0L8$3&6@1k6h3&6@1i4K6u0r3x3e0V1I4z5o6S2Q4x3@1k6Q4x3U0k6X3M7X3!0E0i4K6y4p5j5h3&6V1M7X3!0A6k6s2q4I4i4@1x3J5i4@1p5H3i4@1f1#2i4@1t1%4i4@1p5#2i4@1f1#2i4K6R3#2i4@1t1%4i4@1f1$3i4@1t1#2i4K6S2n7i4@1f1^5i4@1q4r3i4K6V1#2i4@1f1&6i4@1q4m8i4K6S2o6i4@1f1^5i4@1q4r3i4K6R3I4i4@1f1%4i4@1p5H3i4K6R3I4i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1#2i4K6V1H3i4@1p5$3i4@1f1#2i4K6S2r3i4@1q4r3i4@1f1@1i4@1u0n7i4@1p5#2i4@1f1^5i4@1q4r3i4K6R3$3i4@1f1#2i4K6R3^5i4@1q4n7i4@1f1K6i4K6R3H3i4K6R3J5

3、        验证码逻辑设计不当,无非空判断等
可参考:0efK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6G2L8%4W2#2L8W2)9J5k6h3!0J5k6#2)9J5c8X3u0#2k6%4y4Q4x3V1k6%4L8$3!0&6N6h3&6Q4x3X3b7J5x3o6p5@1i4K6u0V1x3o6R3K6x3o6f1H3

1.3.4、后台Js跳转验证绕过
υ        漏洞产生原因:
网站的后台登陆在输入用户名和密码错误以后使用的JS跳转,页面会自动跳转到登陆页面,也就是说如果突破了JS也就可以直接管理后台了(利用条件是登录后的页面未判断session、token)。
υ        安全测试方法:
这类漏洞一般都会访问时,都可以通过肉眼看到部分登录后页面,或者抓包能看到加载了登录后页面。

1、在Firefox地址栏里输入“about:config”。
2、在搜索栏输入“javascript.enabled”查找到首选项。
3、点击鼠标右键选择“切换”,把“javascript.enabled”键值改为“false”
这样就能禁止JavaScript的运行了。
4、再次访问页面,如果能登录成功,则存在安全问题。
υ        修复方案
身份验证检测放服务端检测、参考登录验证章节。
response.sendRedirect("main.jsp");
<jsp:forward page="main.jsp"></jsp:forward>

1.3.5、手机OTP认证绕过
υ        漏洞产生原因分析
网站手机OTP动态口令绕过主要存在以下几种情况:
1、        手机otp动态码失效时间设计有问题,目前多半是2分钟左右时效,如果时效过长,存在一定风险;
2、        手机otp动态码发送后,在页面源代码中本地显示;
3、        手机otp位数低于4位,设计安全性不高;
4、        后台otp验证机制有缺陷,如无非空判断;
5、        手机otp与账密验证逻辑分离,可绕过;
6、        手机otp随机性不强,可预测。
7、        手机otp验证结果前端认证,修改返回状态码,可绕过。
υ        漏洞测试方法
1、        在等待输入手机otp页面,超过2分钟后输入,观测是否失效;
2、        view-source页面源代码,观测是否在本地代码中显示动态号;
3、        上述3-6根据抓包比对分析,难度不大。
υ        修复建议
略。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 250
活跃值: (70)
能力值: (RANK:140 )
在线值:
发帖
回帖
粉丝
2
接上个章节讲
2.1、会话固定漏洞(失效的会话管理)
2.1.1、漏洞产生原因
该漏洞主要是因为Web应用程序没有正确的执行会话管理,例如用户登陆前的会话Cookie和登录后的是一样的,另外一个例子是当用户点击退出的时候,Session不会失效。
漏洞代码示例:
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "e72K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3g2q4u0Q4x3V1k6Z5N6r3#2D9y4q4)9J5c8X3I4G2L8%4y4W2i4K6u0W2k6s2c8V1">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title> </title>
</head>
<body>
<%
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root" , "");
    PreparedStatement ps=(PreparedStatement) con.prepareStatement("select * from users where username=? and password=? limit 0,1");
    ps.setString(1,user);
    ps.setString(2,pass);
    ResultSet rs=ps.executeQuery();
    if(rs.next())
    {
        session.setAttribute("useracc", rs.getString("user"));
        out.println("Login success");
    }
    else
    {
        out.println("Login failed");
    }
%>
</body>

2.1.2、安全测试方法

漏洞测试比较简单,可借助Firefox、Burpsuite等工具在观察登录前、登录后、退出状态下cookie、jsessionid是否有异同,如果不变,则存在问题。
2.1.3、修复建议
一般来说,解决固定会话是相当容易的。最基本的建议就是:一旦用户登录成功以后,马上invalidate用户的会话。具体的步骤如下:
➊ 用户输入用户名和密码。
➋ 系统对用户进行验证通过。
➌ 已有的会话信息如果仍然需要,则转移到一个临时变量中去(请参考➌)。
➍ invalidate 当前的会话(请参考➍)。
➎ 创建一个新的会话(请参考➎)。
➏ 把临时变量中保存的会话信息恢复到新创建的会话中去(请参考➏)。
➐ 用户使用这个新的会话登录到系统中并进行操作。
修复代码参考:
<%
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root" , "");
    PreparedStatement ps=(PreparedStatement) con.prepareStatement("select * from users where username=? and password=? limit 0,1");
    ps.setString(1,user);
    ps.setString(2,pass);
    ResultSet rs=ps.executeQuery();
    if(rs.next())
    {
        session.invalidate();
        request.getSession(true);
        session.setAttribute("useracc", rs.getString("user"));
        out.println("Login success");
    }
    else
    {
        out.println("Login failed");
    }
%>
以上修复后的代码中,用户在登录的时候,首先会让之前的session失效,然后又获取新的seesion。

2.2、越权漏洞
2.2.1、漏洞产生原因
如果一个Web应用程序不严格检查用户是否被授权访问(鉴权),就有可能产生越权类安全问题。例如帐号A在登录的状态下,遍历访问资源ID就可以查看其它人的相关信息。
漏洞代码示例:
<%@page import="java.util.Enumeration"%>
<%@ page import="java.sql.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "9c9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3g2q4u0Q4x3V1k6Z5N6r3#2D9y4q4)9J5c8X3I4G2L8%4y4W2i4K6u0W2k6s2c8V1">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Account Balance</title>
</head>
<body>
<%
    int flag = 0;
    Enumeration e = session.getAttributeNames();
    while (e.hasMoreElements())
    {
        String name = (String) e.nextElement();
        String value = session.getAttribute(name).toString();
        if(name.equals("useracc") && !(value.isEmpty()))
        {
            flag = 1;
            break;
        }
    }
    if(flag == 1)
    {
        String accno = request.getParameter("accno");
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "");
        PreparedStatement ps = (PreparedStatement) con.prepareStatement("select * from account_balance where accno=? limit 0,1");
        ps.setString(1,accno);
        ResultSet rs = ps.executeQuery();
        if(rs.next())
        {
            String s = rs.getString("balance");
            out.println("<h1>Welcome to your account</h1>");
            out.println("<br>Account Number: "+session.getAttribute("useracc"));
            out.println("<br>Your current balance is: "+s);
        }
        else
        {
            out.println("Error: Contact administrator.");
        }
    }
    else
    {
        response.sendRedirect("login.jsp");
    }
%>
</body>
</html>
2.2.2、安全测试方法
抓包修改用于区分用户标识的account_id、memberid字段,查看是否可以越权查看其他人信息。
2.2.3、修复建议
判断了用户的Session,在为True的情况下才能够查看返回的信息,因此当用户遍历accno的值来尝试获取返回结果时,会提示无权访问。
<%
    int flag = 0;
    Enumeration e = session.getAttributeNames();
    while (e.hasMoreElements())
    {
        String name = (String) e.nextElement();
        String value = session.getAttribute(name).toString();
        if(name.equals("useracc") && !(value.isEmpty()))
        {
            flag = 1;
            break;
        }
    }
      
    if(flag == 1)
    {
        String sess_accno = session.getAttribute("useracc").toString();
        String accno = request.getParameter("accno");
//数据库查询时,先判断查询的账户信息是否和现登录态用户一致        
if(sess_accno.equals(accno))
        {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "");
            PreparedStatement ps = (PreparedStatement) con.prepareStatement("select * from account_balance where accno=? limit 0,1");
            ps.setString(1,accno);
            /*
            This line will be better
            ps.setString(1,sess_accno);
            */
            ResultSet rs = ps.executeQuery();
            if(rs.next())
            {
                String s = rs.getString("balance");
                out.println("<h1>Welcome to your account</h1>");
                out.println("<br>Account Number: "+session.getAttribute("useracc"));
                out.println("<br>Your current balance is: "+s);
            }
            else
            {
                out.println("Error: Contact administrator.");
            }
        }
        else
        {
            out.println("Unauthorized Access Detected");
        }
    }
    else
    {
        response.sendRedirect("login.jsp");
    }
%>
上传的附件:
2016-6-7 14:19
0
雪    币: 574
活跃值: (663)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持,好文章
2016-6-7 20:31
0
雪    币: 250
活跃值: (70)
能力值: (RANK:140 )
在线值:
发帖
回帖
粉丝
4
接上章继续,后续章节有空再慢慢补,最近工作有点变动,有点抽不出时间整理,这些都是之前工作中断断续续整理的一些内容
三、文件I/O类漏洞测试
3.1、下载类漏洞
3.1.1、漏洞产生原因分析
文件下载功能设计不当,可能导致目录穿越漏洞(php中称为文件包含),可以通过构造filename、filepath等下载文件名路径下载任意文件,导致敏感信息泄露。
漏洞代码示例:

3.1.2、安全测试方法
一般存在类似漏洞,都会类似存在一些共性,现在文件名+参数,例如,filename=?或filepath=?或file=?或path=?
一般测试,可在正常文件名前加%0a/../,观测是否可正常下载,如果下载正常,很可能存在问题,更多测试payload网上很多,下面例举部分:
1、        download?filename=../../../../../../../etc/passwd;
2、        download?filename=../../../../boot.ini;
3、        download?filename=/../..//../..//../../etc/passwd%00.jpg;
4、        download?filename=/../..//../../etc/passwd%3f.html
5、        java语言中会把"%c0%ae"解析为"\uC0AE",最后转义为ASCCII字符的"."(点)。
3.1.3、修复建议
对客户端下载文件名uri进行检查,可参考以下代码:
String filename = request.getParameter("filename");  
获取的filename参赛可能为../../或/../../总之有..
if(filename.indexOf("..")>=0){
                PrintWriter pw=response.getWriter();
                pw.print("下载文件非法..");
        }
else{
业务….
}

3.2、文件上传漏洞
ν        漏洞概述
上传漏洞,根据其意主要是由于文件上传过程中安全设计有问题,导致可以非法上传恶意脚本文件,根据漏洞利用方式又可以细分为客户端检测漏洞、服务端MIME类检测漏洞、服务端文件扩展名检测漏洞、服务端文件内容检测漏洞、服务端文件路径检测漏洞、及web容器解析(IIS、apache、nginx)漏洞等,可参考下述链接:
d62K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0%4j5i4y4H3i4K6u0W2L8%4u0Y4i4K6u0W2j5$3&6Q4x3V1k6a6g2@1q4e0f1q4)9#2k6W2c8J5j5h3W2F1K9h3&6Y4i4K6u0r3g2i4m8D9L8$3q4V1i4K6g2X3b7i4c8@1j5h3y4C8i4K6g2X3c8Y4u0S2L8h3g2%4L8%4u0C8i4K6u0W2M7r3c8X3
本节以客户端检测、文件扩展名检测进行举例说明:
3.2.1、客户端上传检测漏洞
υ        漏洞产生原因
客户端上传文件至Web服务器过程采用客户端javascript 、ajax进行文件合法性检测检测,漏洞代码参考:
Javascript检查文件扩展名
function fileFormatCheck(s)
    {
       var i = s.lastIndexOf(".");//获取文件名.字符串位置
         if(i < 0)
           {
           alert("<%translate("Certificate file error"); %>.");
           return false;
       }

     var  var1 = s.substring(i+1) ;//获取文件名. 后面后缀
        if(var1 == "jpg" || var1 == "gif" || var1 == "jpeg")
         {
           return true;
         }
      else
         {
        alert("<%translate("Certificate file error"); %>.");
        return false;
     }
}
υ        安全测试方法
1、借助firebug、浏览器自带开发者工具、鼠标定位到提交按钮,查看上传动作,定位到代码段,如果有类似onsubmit、onclick等响应函数,则可能采用本地检测;
2、采用本地安全检测有个明显特点,选择待上传文件后,如果文件不合法,则在点提交动作前,提前触发;
3、将.jsp文件上传前改为.jpg等合法文件,并借助burpsuite工具拦截修改上传报文。
υ        修复建议
见本章节文件上传漏洞修复方案。

3.2.2、服务端文件扩展名检测漏洞
υ        漏洞产生原因
服务端对上传文件扩展名检测机制存在设计问题,如使用黑名单机制文件扩展名类型有遗漏、或匹配扩展名代码有缺陷。
漏洞代码示例:

υ        安全测试方法
更多参考:c9eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0%4j5i4y4H3i4K6u0W2L8%4u0Y4i4K6u0W2j5$3&6Q4x3V1k6a6g2@1q4e0f1q4)9#2k6W2c8J5j5h3W2F1K9h3&6Y4i4K6u0r3g2i4m8D9L8$3q4V1i4K6g2X3b7i4c8@1j5h3y4C8i4K6g2X3c8Y4u0S2L8h3g2%4L8%4u0C8i4K6u0W2M7r3c8X3

3.2.3、其他参考pdf介绍
补充一点,在servlet 3.0之前,javaweb上传文件比较麻烦,往往需要借助第三方sdk,如apache commons-fileuplaod-1.2.1.jar、commons-io-1.4.jar,往往在实现时,程序员容易忽视上传安全机制。

    HashMap<String, String> extMap = new HashMap<String, String>();
    extMap.put("image", "gif,jpg,jpeg,png,bmp");
    extMap.put("flash", "swf,flv");
    extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
    extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
// 检查扩展名
        String fileExt = fileName.substring(
            fileName.lastIndexOf(".") + 1).toLowerCase();
        if (!Arrays.<String> asList(extMap.get(dirName).split(","))
            .contains(fileExt)) {
          out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许"
              + extMap.get(dirName) + "格式。"));
          return;
        }
上传的附件:
2016-6-7 22:43
0
雪    币: 250
活跃值: (70)
能力值: (RANK:140 )
在线值:
发帖
回帖
粉丝
5
没人顶、自己顶
2016-6-8 11:50
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
路过,帮忙顶
2016-6-9 16:18
0
雪    币: 1207
活跃值: (681)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
不错,很好的资料~
2016-6-19 21:28
0
雪    币: 217
活跃值: (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以把你的几篇文章转走么?
2016-6-24 10:12
0
雪    币: 250
活跃值: (70)
能力值: (RANK:140 )
在线值:
发帖
回帖
粉丝
9
可以的,没问题
2016-6-24 19:29
0
雪    币: 250
活跃值: (70)
能力值: (RANK:140 )
在线值:
发帖
回帖
粉丝
10
可以的,没问题
2016-6-24 19:30
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主强大
2016-8-10 18:10
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好帖子,顶起
2016-8-16 13:23
0
雪    币: 2593
活跃值: (2465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
非常宝贵的文章,学习啦!~
2016-8-22 13:40
0
雪    币: 9162
活跃值: (5126)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
顶一下,虽然乌云上不了,而且有些图挂了!
2016-8-22 21:27
0
雪    币: 1216
活跃值: (315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持,web安全版块
2016-8-23 23:18
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持支持
2016-9-8 09:58
0
雪    币: 41
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主继续写啊,挺好的。
2016-9-14 16:15
0
雪    币: 240
活跃值: (441)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
18
感谢大牛分享,学习中
2016-9-20 10:42
0
雪    币: 1207
活跃值: (681)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
看雪web安全这块,不是很活跃啊
2016-10-18 15:36
0
雪    币: 1490
活跃值: (762)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢分享,顶一下!
2016-10-19 18:26
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
版主,一般j2ee 都是用到框架整合起来的,你给的例子好像都没用到,实际工作中的代码审计怎么做的/
2017-1-4 13:20
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
谢谢分享,mark
2017-5-16 10:29
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
给新人指了条明路
2017-5-20 22:22
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
挺好的,想自己设计网站,知道了那些是危险点,有更多的危险点就更好了
2017-6-4 10:00
0
雪    币: 76
活跃值: (71)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
好资料,楼主辛苦!
2017-6-4 10:21
0
游客
登录 | 注册 方可回帖
返回