代码审计 | Wavsep靶场审计防御
字数 1317 2025-08-18 11:39:26
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
漏洞代码分析
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("&");
break;
case '<':
results.append("<");
break;
case '>':
results.append(">");
break;
case '"':
results.append(""");
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. 最佳实践总结
-
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项目:可用于更多安全测试场景