技术讨论 | 自动化Web渗透Payload提取技术
字数 1652 2025-08-18 11:37:38
自动化Web渗透Payload提取技术详解
1. 技术背景与问题定义
1.1 传统WAF的局限性
- 规则匹配机制:基于黑名单的防御方式
- 主要问题:
- 容易被绕过(各种"打狗"技巧)
- 只能发现已知攻击类型
- 对新攻击存在更新延迟
- 维护成本高
- 无法对特定网站进行建模,采用无差别保护
1.2 机器学习在WAF中的应用现状
- 主流方法:有监督机器学习
- 面临挑战:
- 有标记的攻击数据集(黑样本)难以大量获取
- 无监督异常检测方法精确度低
2. 技术思路与创新点
2.1 核心思路
- 分解问题:不直接判断整个请求是否为攻击,而是先提取异常Payload
- 关键创新:无监督学习,无需先验规则即可自动提取异常Payload
2.2 技术路线
- 按访问路径对请求进行拆解
- 分析参数value在同路径同参数Key的其他参数值中的异常程度
3. 算法实现细节
3.1 算法步骤
-
特征向量化:
- 基于TF-IDF对不同路径下的样本分别处理
- 按参数维度对特征向量进行汇聚
-
异常分数计算:
- 提取样本参数在同路径同参数Key的其他参数值中的异常分数(AS)
-
异常提取:
- 设置阈值T,取出AS>T的异常参数值作为输出
3.2 数据集处理
-
使用数据集:HTTP CSIC 2010
- 包含36000正常请求和25000+攻击请求
- 攻击类型:SQL注入、文件遍历、CRLF注入、XSS、SSI等
-
预处理步骤:
- 去除冗余信息(只保留HTTP方法、路径和参数)
- 执行迭代的urldecode
- 生成标准化的参数:
- 大小写字母→"a"
- 数字→"n"
- 保留原始参数和标准化参数
def normalize(self, s, with_sub=True):
# urldecode
while True:
new_s = parse.unquote(s, encoding='ascii', errors='ignore')
if new_s == s:
break
else:
s = new_s
# normalize
if withsub:
s = re.sub('\ufffd', 'a', s)
s = re.sub('[a-zA-Z]', 'a', s)
s = re.sub('\d', 'n', s)
s = re.sub('a+', 'a+', s)
s = re.sub('n+', 'n+', s)
return s
4. 关键技术实现
4.1 向量化处理
-
选择TF-IDF的原因:
- 标准化后参数值可能性多,词袋模型特征向量过大
- 请求中参数个数通常≤10,词向量信息有限
- TF-IDF能反映参数value的特异性(特别是IDF项)
-
TF-IDF计算示例:
- 正常请求(9990个):
ipAddr=n+.n+.n+.n+- TF-IDF = 1 * log(10000/(9990+1)) ≈ 0.001
- 异常请求(10个):
ipAddr=alert('XSS')- TF-IDF = 1 * log(10000/(1+1)) ≈ 8.517
- 正常请求(9990个):
-
特征向量优化:
- 对相同参数key的TF-IDF项求和
- 公式:vn = ∑TF-IDFxn (xn∈{x | x startswith 'kn='})
# 关键代码片段
for path, strs in path_buckets.items():
if not strs:
continue
vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)\b\S\S+\b")
try:
tfidf = vectorizer.fit_transform(strs)
# 按参数key聚合
param_index = {}
for kv, index in vectorizer.vocabulary.items():
k = kv.split('=')[0]
if k in param_index.keys():
param_index[k].append(index)
else:
param_index[k] = [index]
# 收缩TF-IDF向量
tfidf_vectors = []
for vector in tfidf.toarray():
v = []
for param, index in param_index.items():
v.append(np.sum(vector[index]))
tfidf_vectors.append(v)
4.2 异常参数提取
- 数据标准化(Standardization)
- 根据阈值确定异常参数
- 根据异常分数在训练集矩阵的位置提取对应的参数值
# 异常提取关键代码
x = np.load(f"../vectorize/paths/~tienda1~publico~registro.jsp_x.npy")
params = np.load(f"../vectorize/paths/~tienda1~publico~registro.jsp_params.npy")
# 标准化
ases = StandardScaler().fit_transform(x[:, :len(params)])
indices = ases > 6 # 阈值设为6
# 提取异常payload
for s in range(indices.shape[0]):
for p in range(indices.shape[1]):
if indices[s, p] and params[p] in samples[s]['OriParams'].keys() and samples[s]['OriParams'][params[p]].strip():
print(f"##{params[p]}## ##{samples[s]['OriParams'][params[p]]}##")
5. 实验结果
5.1 提取的异常Payload示例
- SQL注入:
##modo## ##registro' AND '1'='1## ##dni## ##'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%## - XSS攻击:
##cp## ##paros"+style="background:url(javascript:alert('Paros'))&id=2## - 命令注入:
##modo## ##registroalert("Paros")## - CRLF注入:
##cp## ##any?Set-cookie:+Tamper=1041264011025374727##
5.2 验证结果
- 使用随机森林模型验证特征有效性
- 准确率>95%(即使未调参)
- 学习曲线显示模型仍处于欠训练状态,更多数据可提升效果
6. 项目扩展与未来方向
6.1 GitHub项目
- 项目地址:https://github.com/zhanghaoyil/Hawk-I
- 持续完善中,欢迎贡献代码
6.2 后续计划
- 利用更多Web系统结构信息:
- 访问时序特征
- 访问来源主体(IP、UID、设备指纹等)
- 访问分布特征
- 开发无规则化的简易机器学习WAF
7. 关键知识点总结
- 无监督异常检测:无需标记攻击样本即可发现异常
- 路径感知分析:同路径同参数Key下的异常检测更精准
- TF-IDF优化应用:通过参数维度汇聚解决稀疏性问题
- 标准化预处理:统一字母数字表示,保留语义同时降低维度
- 阈值选择:通过统计分析确定异常分数阈值(文中使用6)
8. 实际应用建议
-
部署流程:
- 收集足够量的正常访问日志作为基线
- 按路径建立参数特征模型
- 定期更新模型以适应网站变化
-
阈值调整:
- 根据误报率和漏报率平衡调整异常分数阈值
- 可对不同参数设置不同敏感度
-
结果应用:
- 辅助安全分析人员快速定位可疑请求
- 自动生成WAF规则
- 实时攻击检测和阻断