靶场项目编写实战
字数 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 易受攻击场景
- 表单提交和查询结果显示:未过滤用户输入直接显示
- URL参数传递:未编码的URL参数
- 富文本编辑器:未过滤HTML标签和脚本代码
- JavaScript代码编写:直接使用用户输入作为JS参数
2.3 攻击目的
- 窃取用户信息(用户名、密码、Cookie等)
- 欺骗用户(修改页面内容)
- 利用用户权限进行恶意操作
- 传播病毒
2.4 防御措施
- HTML编码:使用
StringEscapeUtils.escapeHtml(content) - URL编码:对URL参数进行编码
- 富文本过滤:使用编辑器自带过滤器或第三方库
- 安全JS编码:避免直接使用用户输入作为JS参数
2.5 代码示例
// 不安全示例
response.getWriter().write("输入内容:" + content);
// 安全示例
response.getWriter().write("输入内容:" + StringEscapeUtils.escapeHtml(content));
3. 暴力破解
3.1 漏洞原理
通过不断尝试所有可能的密码组合,直到找到正确密码。
3.2 防御措施
- 强密码策略:长度、复杂度要求
- 密码锁定策略:多次错误后锁定账户
- 多因素认证:短信验证码、指纹等
- 安全监控和报警:异常登录行为监控
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 防御措施
- 验证来源站点:检查Referer和Origin头
- 添加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 防御措施
- 预编译语句:使用PreparedStatement
- 输入过滤验证:类型、格式、长度检查
- ORM框架:如Hibernate、MyBatis
- 最小权限原则:限制数据库用户权限
- 错误信息处理:避免暴露详细信息
- 数据加密:敏感数据加密存储
- 安全审计:定期数据库安全检查
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中执行命令的方法
- Runtime.exec()
- 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 防御措施
- 文件类型校验:白名单校验(后缀名+文件头)
- 文件大小限制
- 文件重命名
- 内容校验:杀毒扫描
- 低权限运行:上传目录低权限
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 防御措施
- 过滤
./和../ - 随机字符串ID下载
- 最小权限配置
- 路径后拼接固定后缀
9. XXE(XML外部实体注入)
9.1 漏洞原理
利用XML解析器漏洞读取服务器文件或执行远程请求。
9.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 防御措施
- URL白名单校验
- 禁用危险协议(如file://)
- 限制请求目标范围
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 防御措施
- 使用无逻辑模板引擎(如Handlebars)
- 前端框架渲染(如Vue)
12.3 代码示例
// Velocity引擎不安全实现
VelocityContext context = new VelocityContext();
Velocity.evaluate(context, sw, "test", template);
13. Java反序列化
13.1 漏洞原理
通过恶意序列化数据执行任意代码。
13.2 关键生命周期方法
readObject()writeObject()readResolve()writeReplace()
13.3 防御措施
- 避免反序列化不可信数据
- 使用安全替代方案(如JSON)
- 实现
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. 项目贡献与反馈
- 提交issue:https://github.com/linjiananallnt/ElectricRat/issues
- 邮件联系:linjiananallnt@outlook.com
- Fork仓库提交Pull Request
15. 总结
电气鼠靶场系统全面覆盖了常见的Web安全漏洞,通过实际代码演示了漏洞产生的原因和防御方法。学习时应重点关注:
- 每种漏洞的原理和危害
- 漏洞代码的具体实现方式
- 相应的防御措施和最佳实践
- 实际环境中的综合防护策略
建议学习者结合靶场环境实际操作,深入理解漏洞本质,掌握安全开发技能。