最近在整理内部安全培训资料时,发现现有教学案例存在环境搭建复杂、攻击场景单一的问题。于是花了三个月时间设计开发了一套基于SpringBoot的攻防靶场平台,目前已在公司内部安全团队培训中投入使用,效果超出预期。
这个平台本质上是一个模块化的Web安全实验环境,主要解决以下几个痛点:
平台采用SpringBoot+MyBatis技术栈,前后端分离架构,目前已实现SQL注入、XSS、CSRF等12类常见漏洞的靶场环境,支持动态加载漏洞模块、攻击流量记录、自动化评分等功能。
后端选择SpringBoot主要基于:
前端采用Vue+ElementUI组合:
数据库选用MySQL+Redis组合:
系统主要包含以下功能模块:
实验管理模块
攻击检测模块
防御演练模块
评分系统模块
通过类加载器实现热部署漏洞模块:
java复制public class VulModuleLoader {
private static final String MODULE_DIR = "modules";
public void loadModule(String moduleName) {
File moduleFile = new File(MODULE_DIR, moduleName+".jar");
URLClassLoader classLoader = new URLClassLoader(
new URL[]{moduleFile.toURI().toURL()},
Thread.currentThread().getContextClassLoader()
);
Class<?> moduleClass = classLoader.loadClass(
"com.vulmodule."+moduleName+".VulInstance"
);
VulModule module = (VulModule) moduleClass.newInstance();
moduleRegistry.register(module);
}
}
关键设计点:
采用责任链模式实现多层检测:
java复制public interface AttackDetector {
void detect(HttpRequest request, AttackChain chain);
}
// 示例检测器:SQL注入检测
public class SqlInjectionDetector implements AttackDetector {
private static final Pattern SQL_PATTERN = Pattern.compile("(['\"]|\\b)(union|select|insert).*?\\b");
@Override
public void detect(HttpRequest request, AttackChain chain) {
String params = request.getParameterString();
if(SQL_PATTERN.matcher(params).find()) {
chain.markAsAttack("SQL_INJECTION");
}
chain.doNext(request);
}
}
检测流程:
实现有漏洞的查询接口:
java复制@GetMapping("/user/search")
public List<User> searchUser(@RequestParam String name) {
String sql = "SELECT * FROM users WHERE name = '" + name + "'";
return jdbcTemplate.query(sql, new UserRowMapper());
}
配套防御方案:
java复制String sql = "SELECT * FROM users WHERE name = ?";
return jdbcTemplate.query(sql, new Object[]{name}, new UserRowMapper());
java复制@Intercepts(@Signature(type= StatementHandler.class,
method="query",
args={Statement.class, ResultHandler.class}))
public class SqlInjectionInterceptor implements Interceptor {
public Object intercept(Invocation invocation) {
String sql = ((BoundSql)invocation.getArgs()[0]).getSql();
if(checkSqlInjection(sql)) {
throw new SecurityException("检测到SQL注入风险");
}
return invocation.proceed();
}
}
故意设计的有漏洞评论功能:
java复制@PostMapping("/comment/add")
public String addComment(String content) {
// 危险:直接输出未过滤内容
return "<div class='comment'>" + content + "</div>";
}
防御方案对比:
java复制String safeContent = HtmlUtils.htmlEscape(content);
java复制Policy policy = Policy.getInstance("antisamy.xml");
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(content, policy);
String safeContent = cr.getCleanHTML();
网络层防护
应用层防护
数据层防护
通过过滤器添加安全头:
java复制public class SecurityHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
response.setHeader("X-XSS-Protection", "1; mode=block");
response.setHeader("X-Content-Type-Options", "nosniff");
response.setHeader("X-Frame-Options", "DENY");
response.setHeader("Content-Security-Policy",
"default-src 'self'; script-src 'self' 'unsafe-inline'");
chain.doFilter(request, response);
}
}
使用状态机管理实验流程:
java复制public enum ExperimentState {
INITIALIZED,
VUL_SCAN_STARTED,
ATTACK_DETECTED,
DEFENSE_APPLIED,
COMPLETED
}
public class Experiment {
private String experimentId;
private ExperimentState currentState;
private Map<String, Object> contextData;
public void transit(ExperimentEvent event) {
currentState = stateMachine.transit(currentState, event);
}
}
基于规则引擎的评分实现:
java复制public class ScoringEngine {
private List<ScoringRule> rules;
public ScoreResult evaluate(Experiment experiment) {
ScoreResult result = new ScoreResult();
for(ScoringRule rule : rules) {
rule.apply(experiment, result);
}
return result;
}
}
// 示例规则:检测是否使用预编译语句
public class SqlPreparedStatementRule implements ScoringRule {
public void apply(Experiment exp, ScoreResult result) {
if(exp.containsFix("SQL_PREPARED_STATEMENT")) {
result.addPoints(20, "正确使用预编译语句");
}
}
}
Docker-compose配置示例:
yaml复制version: '3'
services:
app:
image: vul-lab:1.0
ports:
- "8080:8080"
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: safepassword
redis:
image: redis:alpine
集成Prometheus监控:
java复制@Configuration
@EnablePrometheusEndpoint
public class MonitorConfig {
@Bean
public CollectorRegistry metricRegistry() {
return new CollectorRegistry(true);
}
@Bean
public ServletRegistrationBean<MetricsServlet> metricsServlet() {
return new ServletRegistrationBean<>(
new MetricsServlet(metricRegistry()), "/metrics");
}
}
关键监控指标:
常见原因及解决方案:
类冲突问题
接口版本不兼容
权限不足
优化策略:
java复制// 原检测规则
if(param.contains("select")) { flag(); }
// 优化后
if(param.matches("\\bselect\\b.+?from\\b") && !isWhitelisted(param)) {
flag();
}
java复制public boolean isWhitelisted(String input) {
return whitelist.stream()
.anyMatch(pattern -> pattern.matcher(input).matches());
}
支持的新漏洞类型:
业务逻辑漏洞
新型注入攻击
Kubernetes集成方案:
新增功能:
在开发过程中有几个关键收获值得分享:
安全性与可用性平衡
性能优化经验
教学效果提升
实际使用中发现,将防御方案与漏洞实例紧密结合的教学方式,比传统理论讲解效果提升明显。后续计划增加更多真实业务场景的漏洞案例,比如微服务间的安全调用、API接口防护等场景。