代码审计 | Wavsep靶场审计防御
字数 1317 2025-08-18 11:39:26

Wavsep靶场代码审计与防御实战指南

1. 实验环境搭建

1.1 Java环境配置

  • 需预先配置Java运行环境
  • 推荐使用JDK 8或以上版本

1.2 Wavsep靶场部署

  1. 下载wavsep.war包
  2. 将war包放置于Tomcat的webapps目录下
  3. 自动解压为wavsep文件夹
  4. 访问地址:http://127.0.0.1:8080/wavsep/

1.3 靶场结构说明

  • SQL注入测试页面:在URL后追加index-xss.jsp等路径
  • XSS测试页面:类似结构访问

2. SQL注入漏洞审计与防御

2.1 字符型SQL注入

漏洞示例

测试URL:http://127.0.0.1:8080/wavsep/SInjection-Detection-Evaluation-GET-500Error/Case1-InjectionInLogin-String-LoginBypass-WithErrors.jsp

注入payload:'or'7'='7

漏洞代码分析

String SqlString = "SELECT username, password " + 
                  "FROM users " + 
                  "WHERE username='" + username + "'" + 
                  " AND password='" + password + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SqlString);

防御方案一:字符转义

String username = request.getParameter("username").replace("'", "''");
String password = request.getParameter("password").replace("'", "''");

防御方案二:参数化查询(推荐)

String SqlString1 = "SELECT username, password " + 
                   "FROM users " + 
                   "WHERE username=?" + 
                   " AND password=?";
PreparedStatement prepstmt = conn.prepareStatement(SqlString1);
prepstmt.setString(1, username);
prepstmt.setString(2, password);
ResultSet rs = prepstmt.executeQuery();

2.2 数字型SQL注入防御

Integer.parseInt(s) // 将输入强制转换为数字类型

2.3 非字符非数字型SQL注入

漏洞示例(ORDER BY注入)

测试URL:http://127.0.0.1:8080/wavsep/SInjection-Detection-Evaluation-GET-500Error/Case5-InjectionInSearchOrderBy-String-BinaryDeliberateRuntimeError-WithErrors.jsp

防御方案:输入长度限制

String order = request.getParameter("orderby");
if(order.length() > 10){
    return;
}

3. XSS跨站脚本漏洞审计与防御

3.1 反射型XSS示例

测试URL:http://127.0.0.1:8080/wavsep/RXSS-Detection-Evaluation-GET/Case1-Tag2HtmlPageScope.jsp

payload:<script>alert(1)</script>

3.2 漏洞代码分析

String userinput = request.getParameter("userinput");
out.println("The reflected value: " + userinput);

3.3 XSS防御方案:HTML编码

<%! 
String HTML(String text){
    if(text == null) return "";
    StringBuffer results = null;
    char[] orig = null;
    int beg = 0, len = text.length();
    for(int i = 0;i < len;++i){
        char c = text.charAt(i);
        switch(c){
            case 0:
            case '&':
            case '<':
            case '>':
            case '"':
                if(results == null){
                    orig = text.toCharArray();
                    results = new StringBuffer(len + 10);
                }
                if(i>beg)results.append(orig,beg,i-beg);
                beg = i + 1;
                switch(c){
                    default: // case 0:
                        continue;
                    case '&':
                        results.append("&amp;");
                        break;
                    case '<':
                        results.append("&lt;");
                        break;
                    case '>':
                        results.append("&gt;");
                        break;
                    case '"':
                        results.append("&quot;");
                        break;
                }
                break;
        }
    }
    if(results == null) return text;
    results.append(orig,beg,len - beg);
    return results.toString();
}
%>

// 使用方式
String userinput = HTML(request.getParameter("userinput"));
out.println("The reflected value: " + userinput);

4. 最佳实践总结

  1. SQL注入防御

    • 优先使用参数化查询(PreparedStatement)
    • 次选方案:对输入进行严格转义
    • 数字型输入强制类型转换
    • 对特殊场景(如ORDER BY)实施长度限制
  2. XSS防御

    • 所有动态输出到HTML的内容必须进行编码
    • 实现全面的HTML编码函数
    • 考虑使用现成的安全库(如OWASP ESAPI)
  3. 其他建议

    • 实施输入验证白名单机制
    • 对敏感操作实施CSRF防护
    • 记录安全事件日志

5. 扩展资源

  • OWASP SQL注入防御指南:https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
  • OWASP XSS防御指南:https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
  • Wavsep项目:可用于更多安全测试场景
Wavsep靶场代码审计与防御实战指南 1. 实验环境搭建 1.1 Java环境配置 需预先配置Java运行环境 推荐使用JDK 8或以上版本 1.2 Wavsep靶场部署 下载wavsep.war包 将war包放置于Tomcat的webapps目录下 自动解压为wavsep文件夹 访问地址:http://127.0.0.1:8080/wavsep/ 1.3 靶场结构说明 SQL注入测试页面:在URL后追加index-xss.jsp等路径 XSS测试页面:类似结构访问 2. SQL注入漏洞审计与防御 2.1 字符型SQL注入 漏洞示例 测试URL:http://127.0.0.1:8080/wavsep/SInjection-Detection-Evaluation-GET-500Error/Case1-InjectionInLogin-String-LoginBypass-WithErrors.jsp 注入payload: 'or'7'='7 漏洞代码分析 防御方案一:字符转义 防御方案二:参数化查询(推荐) 2.2 数字型SQL注入防御 2.3 非字符非数字型SQL注入 漏洞示例(ORDER BY注入) 测试URL:http://127.0.0.1:8080/wavsep/SInjection-Detection-Evaluation-GET-500Error/Case5-InjectionInSearchOrderBy-String-BinaryDeliberateRuntimeError-WithErrors.jsp 防御方案:输入长度限制 3. XSS跨站脚本漏洞审计与防御 3.1 反射型XSS示例 测试URL:http://127.0.0.1:8080/wavsep/RXSS-Detection-Evaluation-GET/Case1-Tag2HtmlPageScope.jsp payload: <script>alert(1)</script> 3.2 漏洞代码分析 3.3 XSS防御方案:HTML编码 4. 最佳实践总结 SQL注入防御 : 优先使用参数化查询(PreparedStatement) 次选方案:对输入进行严格转义 数字型输入强制类型转换 对特殊场景(如ORDER BY)实施长度限制 XSS防御 : 所有动态输出到HTML的内容必须进行编码 实现全面的HTML编码函数 考虑使用现成的安全库(如OWASP ESAPI) 其他建议 : 实施输入验证白名单机制 对敏感操作实施CSRF防护 记录安全事件日志 5. 扩展资源 OWASP SQL注入防御指南:https://www.owasp.org/index.php/SQL_ Injection_ Prevention_ Cheat_ Sheet OWASP XSS防御指南:https://cheatsheetseries.owasp.org/cheatsheets/Cross_ Site_ Scripting_ Prevention_ Cheat_ Sheet.html Wavsep项目:可用于更多安全测试场景