靶场项目编写实战
字数 2326 2025-08-11 11:39:36

电气鼠靶场系统安全漏洞教学文档

1. 项目概述

电气鼠靶场系统是一个基于Java开发的带有漏洞的Web应用程序,旨在为Web安全渗透测试学习者提供学习和实践的机会。系统使用Tomcat + MySQL技术栈,可通过docker-compose快速安装。

项目特点:

  • 使用Java语言实现(不同于常见的PHP靶场)
  • 包含多种常见Web安全漏洞案例
  • 每个漏洞案例都有详细说明和代码示例
  • 适合初学者通过实践学习漏洞原理和代码审计

2. XSS(跨站脚本攻击)

2.1 漏洞原理

XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本代码实现对用户的攻击。

2.2 易受攻击场景

  1. 表单提交和查询结果显示:未过滤用户输入直接显示
  2. URL参数传递:未编码的URL参数
  3. 富文本编辑器:未过滤HTML标签和脚本代码
  4. JavaScript代码编写:直接使用用户输入作为JS参数

2.3 攻击目的

  • 窃取用户信息(用户名、密码、Cookie等)
  • 欺骗用户(修改页面内容)
  • 利用用户权限进行恶意操作
  • 传播病毒

2.4 防御措施

  1. HTML编码:使用StringEscapeUtils.escapeHtml(content)
  2. URL编码:对URL参数进行编码
  3. 富文本过滤:使用编辑器自带过滤器或第三方库
  4. 安全JS编码:避免直接使用用户输入作为JS参数

2.5 代码示例

// 不安全示例
response.getWriter().write("输入内容:" + content);

// 安全示例
response.getWriter().write("输入内容:" + StringEscapeUtils.escapeHtml(content));

3. 暴力破解

3.1 漏洞原理

通过不断尝试所有可能的密码组合,直到找到正确密码。

3.2 防御措施

  1. 强密码策略:长度、复杂度要求
  2. 密码锁定策略:多次错误后锁定账户
  3. 多因素认证:短信验证码、指纹等
  4. 安全监控和报警:异常登录行为监控

3.3 验证码实现

3.3.1 图片验证码

// 验证码校验
public Boolean verificationImageCodeEasy(String text) {
    ImageCodeEntity entity = new ImageCodeEntity(text);
    return icd.find(entity) != null;
}

问题:验证码有效期过长(5分钟),应设置为一次性使用

3.3.2 隐藏域验证码

// Token校验
if (token == null || !token.equals(v_token)) {
    data.put("VerificationStatus", false);
    return data;
}
session.removeAttribute("token");

问题:Token可被Burp截获后用于暴力破解

4. CSRF(跨站请求伪造)

4.1 漏洞原理

利用受害者的登录状态发起恶意请求。

4.2 防御措施

  1. 验证来源站点:检查Referer和Origin头
  2. 添加Token验证:随机Token校验

4.3 代码示例

// Token校验
String token = request.getParameter("csrf_token");
String v_token = session.getAttribute("csrf_token") != null ? 
    String.valueOf(session.getAttribute("csrf_token")) : null;
if (token == null || !token.equals(v_token)) {
    data.put("VerificationStatus", false);
    return data;
}

问题:Session中Token 30分钟过期,窗口期过长

5. SQL注入

5.1 漏洞原理

通过恶意SQL语句注入到后端数据库执行。

5.2 防御措施

  1. 预编译语句:使用PreparedStatement
  2. 输入过滤验证:类型、格式、长度检查
  3. ORM框架:如Hibernate、MyBatis
  4. 最小权限原则:限制数据库用户权限
  5. 错误信息处理:避免暴露详细信息
  6. 数据加密:敏感数据加密存储
  7. 安全审计:定期数据库安全检查

5.3 不安全示例

// 直接拼接SQL
public HashMap<String, Object> findUserById(String id) {
    return query("select * from sys_account where id=" + id);
}

5.4 安全示例

// 使用预编译
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

6. RCE(远程命令执行)

6.1 漏洞原理

通过应用程序漏洞在服务器上执行任意命令。

6.2 Java中执行命令的方法

  1. Runtime.exec()
  2. ProcessBuilder

6.3 代码示例

// 不安全实现
String cmd = request.getParameter("cmd");
Process p = Runtime.getRuntime().exec(cmd);

// 相对安全实现
List<String> bash_cmd = new ArrayList<>();
bash_cmd.add("/bin/sh");
bash_cmd.add("-c");
bash_cmd.add(cmd);
Process p = Runtime.getRuntime().exec(bash_cmd.toArray(new String[0]));

7. 任意文件上传

7.1 漏洞原理

上传恶意文件到服务器执行。

7.2 防御措施

  1. 文件类型校验:白名单校验(后缀名+文件头)
  2. 文件大小限制
  3. 文件重命名
  4. 内容校验:杀毒扫描
  5. 低权限运行:上传目录低权限

7.3 不安全示例

// 仅检查MIME Type
if (file.getContentType().equals("image/"+i)) {
    return uploadFile(file, uploadPath(request));
}

// 黑名单绕过
String suffixName = fileName.substring(fileName.lastIndexOf("."));
for(String i : BLACK_FILE_TYPE) {
    if (suffixName.equals(i)) {
        return false;
    }
}

问题:未考虑大小写(如.jsp vs .JSP),未检查文件内容

8. 目录遍历

8.1 漏洞原理

通过../等符号访问非授权目录。

8.2 代码示例

// 不安全实现
String fileName = request.getParameter("fileName");
FileInputStream in = new FileInputStream(uploadPath(request)+fileName);

8.3 防御措施

  1. 过滤./../
  2. 随机字符串ID下载
  3. 最小权限配置
  4. 路径后拼接固定后缀

9. XXE(XML外部实体注入)

9.1 漏洞原理

利用XML解析器漏洞读取服务器文件或执行远程请求。

9.2 防御措施

  1. 禁用外部实体
  2. 使用安全配置的XML解析器

9.3 代码示例

// 不安全实现
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(ist);

9.4 安全配置

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

10. SSRF(服务器端请求伪造)

10.1 漏洞原理

诱使服务器向攻击者指定地址发起请求。

10.2 防御措施

  1. URL白名单校验
  2. 禁用危险协议(如file://)
  3. 限制请求目标范围

10.3 代码示例

// 不安全实现
String url = request.getParameter("imageURL");
URL u = new URL(url);
URLConnection urlConnection = u.openConnection();

11. SpEL表达式注入

11.1 漏洞原理

通过恶意SpEL表达式执行任意代码。

11.2 防御措施

使用SimpleEvaluationContext替代标准解析

11.3 代码示例

// 不安全实现
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(apply);
expression.getValue();

12. SSTI(服务器端模板注入)

12.1 漏洞原理

在模板中注入恶意代码执行。

12.2 防御措施

  1. 使用无逻辑模板引擎(如Handlebars)
  2. 前端框架渲染(如Vue)

12.3 代码示例

// Velocity引擎不安全实现
VelocityContext context = new VelocityContext();
Velocity.evaluate(context, sw, "test", template);

13. Java反序列化

13.1 漏洞原理

通过恶意序列化数据执行任意代码。

13.2 关键生命周期方法

  1. readObject()
  2. writeObject()
  3. readResolve()
  4. writeReplace()

13.3 防御措施

  1. 避免反序列化不可信数据
  2. 使用安全替代方案(如JSON)
  3. 实现readObject()时进行严格验证

13.4 代码示例

// 不安全实现
byte[] decode = Base64.getDecoder().decode(hasCookie.getValue());
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(decode));
Object o = in.readObject();

// 恶意类示例
private void readObject(java.io.ObjectInputStream stream) throws Exception {
    stream.defaultReadObject();
    res = Runtime.getRuntime().exec(cmd);
}

14. 项目贡献与反馈

  1. 提交issue:https://github.com/linjiananallnt/ElectricRat/issues
  2. 邮件联系:linjiananallnt@outlook.com
  3. Fork仓库提交Pull Request

15. 总结

电气鼠靶场系统全面覆盖了常见的Web安全漏洞,通过实际代码演示了漏洞产生的原因和防御方法。学习时应重点关注:

  1. 每种漏洞的原理和危害
  2. 漏洞代码的具体实现方式
  3. 相应的防御措施和最佳实践
  4. 实际环境中的综合防护策略

建议学习者结合靶场环境实际操作,深入理解漏洞本质,掌握安全开发技能。

电气鼠靶场系统安全漏洞教学文档 1. 项目概述 电气鼠靶场系统是一个基于Java开发的带有漏洞的Web应用程序,旨在为Web安全渗透测试学习者提供学习和实践的机会。系统使用Tomcat + MySQL技术栈,可通过docker-compose快速安装。 项目特点: 使用Java语言实现(不同于常见的PHP靶场) 包含多种常见Web安全漏洞案例 每个漏洞案例都有详细说明和代码示例 适合初学者通过实践学习漏洞原理和代码审计 2. XSS(跨站脚本攻击) 2.1 漏洞原理 XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本代码实现对用户的攻击。 2.2 易受攻击场景 表单提交和查询结果显示 :未过滤用户输入直接显示 URL参数传递 :未编码的URL参数 富文本编辑器 :未过滤HTML标签和脚本代码 JavaScript代码编写 :直接使用用户输入作为JS参数 2.3 攻击目的 窃取用户信息(用户名、密码、Cookie等) 欺骗用户(修改页面内容) 利用用户权限进行恶意操作 传播病毒 2.4 防御措施 HTML编码 :使用 StringEscapeUtils.escapeHtml(content) URL编码 :对URL参数进行编码 富文本过滤 :使用编辑器自带过滤器或第三方库 安全JS编码 :避免直接使用用户输入作为JS参数 2.5 代码示例 3. 暴力破解 3.1 漏洞原理 通过不断尝试所有可能的密码组合,直到找到正确密码。 3.2 防御措施 强密码策略 :长度、复杂度要求 密码锁定策略 :多次错误后锁定账户 多因素认证 :短信验证码、指纹等 安全监控和报警 :异常登录行为监控 3.3 验证码实现 3.3.1 图片验证码 问题:验证码有效期过长(5分钟),应设置为一次性使用 3.3.2 隐藏域验证码 问题:Token可被Burp截获后用于暴力破解 4. CSRF(跨站请求伪造) 4.1 漏洞原理 利用受害者的登录状态发起恶意请求。 4.2 防御措施 验证来源站点 :检查Referer和Origin头 添加Token验证 :随机Token校验 4.3 代码示例 问题:Session中Token 30分钟过期,窗口期过长 5. SQL注入 5.1 漏洞原理 通过恶意SQL语句注入到后端数据库执行。 5.2 防御措施 预编译语句 :使用PreparedStatement 输入过滤验证 :类型、格式、长度检查 ORM框架 :如Hibernate、MyBatis 最小权限原则 :限制数据库用户权限 错误信息处理 :避免暴露详细信息 数据加密 :敏感数据加密存储 安全审计 :定期数据库安全检查 5.3 不安全示例 5.4 安全示例 6. RCE(远程命令执行) 6.1 漏洞原理 通过应用程序漏洞在服务器上执行任意命令。 6.2 Java中执行命令的方法 Runtime.exec() ProcessBuilder 6.3 代码示例 7. 任意文件上传 7.1 漏洞原理 上传恶意文件到服务器执行。 7.2 防御措施 文件类型校验 :白名单校验(后缀名+文件头) 文件大小限制 文件重命名 内容校验 :杀毒扫描 低权限运行 :上传目录低权限 7.3 不安全示例 问题:未考虑大小写(如.jsp vs .JSP),未检查文件内容 8. 目录遍历 8.1 漏洞原理 通过 ../ 等符号访问非授权目录。 8.2 代码示例 8.3 防御措施 过滤 ./ 和 ../ 随机字符串ID下载 最小权限配置 路径后拼接固定后缀 9. XXE(XML外部实体注入) 9.1 漏洞原理 利用XML解析器漏洞读取服务器文件或执行远程请求。 9.2 防御措施 禁用外部实体 使用安全配置的XML解析器 9.3 代码示例 9.4 安全配置 10. SSRF(服务器端请求伪造) 10.1 漏洞原理 诱使服务器向攻击者指定地址发起请求。 10.2 防御措施 URL白名单校验 禁用危险协议(如file://) 限制请求目标范围 10.3 代码示例 11. SpEL表达式注入 11.1 漏洞原理 通过恶意SpEL表达式执行任意代码。 11.2 防御措施 使用 SimpleEvaluationContext 替代标准解析 11.3 代码示例 12. SSTI(服务器端模板注入) 12.1 漏洞原理 在模板中注入恶意代码执行。 12.2 防御措施 使用无逻辑模板引擎(如Handlebars) 前端框架渲染(如Vue) 12.3 代码示例 13. Java反序列化 13.1 漏洞原理 通过恶意序列化数据执行任意代码。 13.2 关键生命周期方法 readObject() writeObject() readResolve() writeReplace() 13.3 防御措施 避免反序列化不可信数据 使用安全替代方案(如JSON) 实现 readObject() 时进行严格验证 13.4 代码示例 14. 项目贡献与反馈 提交issue:https://github.com/linjiananallnt/ElectricRat/issues 邮件联系:linjiananallnt@outlook.com Fork仓库提交Pull Request 15. 总结 电气鼠靶场系统全面覆盖了常见的Web安全漏洞,通过实际代码演示了漏洞产生的原因和防御方法。学习时应重点关注: 每种漏洞的原理和危害 漏洞代码的具体实现方式 相应的防御措施和最佳实践 实际环境中的综合防护策略 建议学习者结合靶场环境实际操作,深入理解漏洞本质,掌握安全开发技能。