文本相似度在安全测试中的一些应用
字数 1620 2025-08-24 23:51:09
文本相似度在安全测试中的应用
1. 文本相似度概述
文本相似度是用来衡量文本之间相似程度的量化指标,在信息安全领域有多种应用场景:
- 信息检索:返回与搜索文本相似的资源
- 文档检测:如论文查重系统
- 安全测试场景:
- SQL注入检测
- 越权测试
- 路径枚举
- 验证码识别对抗
2. 文本相似度计算方法
计算文本相似度通常分为两个步骤:
2.1 文本向量化
将文本映射为数值向量表示,常用方法:
-
词袋模型(Bag of Words):
- 分词后统计词频
- 不考虑词语顺序
- 简单但有效
-
TF-IDF模型:
- 考虑词语在文档中的重要性
- 降低常见词权重
-
Word2Vec:
- 考虑词语语义
- 更高级的向量表示
2.2 向量相似度计算
常用算法:
-
余弦相似度:
- 计算向量夹角余弦值
- 范围[-1,1],值越大越相似
-
欧式距离:
- 计算向量空间直线距离
- 距离越小越相似
-
神经网络方法:
- 更复杂的相似度计算
- 适用于高级场景
3. 词袋模型与余弦相似度实现
3.1 词袋模型实现步骤
-
分词处理:
- 使用分词工具(如jieba)将文本分割为词语
- 示例代码:
import jieba text = "今天又是安服仔打工的一天" words = list(jieba.cut(text))
-
构建词表:
- 收集所有不重复词语
- 使用Python set集合去重
- 示例代码:
word_set = set(words1 + words2) word_list = list(word_set)
-
向量化:
- 创建与词表等长的全零向量
- 统计每个词语出现次数
- 示例代码:
vector = [0] * len(word_list) for word in words: if word in word_list: index = word_list.index(word) vector[index] += 1
3.2 余弦相似度计算
公式:
cosθ = (A·B) / (||A|| * ||B||)
Python实现:
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot_product / (norm1 * norm2)
4. 安全测试应用场景
4.1 SQL注入检测
原理:
- 构造正确和错误的SQL语法
- 比较返回页面的相似度
- 相似度差异大则可能存在注入
实现步骤:
-
预处理响应:
- 接口响应:去除标点等特殊符号
- HTML页面:过滤掉HTML标签
-
计算相似度:
- 使用词袋模型和余弦相似度
- 设置阈值判断是否存在注入
注意事项:
- 词语顺序影响小,因不同SQL响应通常词语也不同
- 可调整阈值控制检测敏感度
4.2 越权测试
应用场景:
- 未授权访问
- 垂直越权
- 水平越权
实现方案:
-
半自动化Burp插件设计:
- 手动添加待测试URL
- 排除静态资源(js/css等)
- 存储请求和响应
-
核心逻辑:
# 存储URL和请求 url_map = {path: request_body} # 存储响应 response_map = { 'original': first_response, 'repeat': second_response } -
越权检测:
- 替换权限标识符
- 发送修改后的请求
- 比较响应相似度
- 高度相似则可能存在越权
优化点:
- 处理500错误重试
- 考虑增删操作的特殊情况
4.3 路径枚举
问题背景:
- 404页面可能返回200状态码
- 需要区分真实页面和伪装404
解决方案:
-
获取参考404页面:
- 随机访问不存在的路径
- 记录返回内容
-
枚举检测:
- 对返回200的页面
- 计算与参考404的相似度
- 高度相似则判定为无效页面
优势:
- 有效降低误报率
- 提高自动化枚举效率
4.4 验证码识别对抗(黑灰产应用)
攻击原理:
-
图片验证码分析:
- 提取验证码中的图标
- 与目标图标进行相似度比对
-
自动化点击:
- 确定目标坐标
- 模拟人类点击行为
防御建议:
- 使用动态变化的验证码
- 增加行为验证机制
- 监控异常请求模式
5. 实践建议
-
预处理优化:
- 根据场景决定是否去除停用词
- 安全测试中保留更多原始信息可能更准确
-
算法选择:
- 简单场景:词袋+余弦相似度
- 复杂场景:考虑TF-IDF或Word2Vec
-
性能考虑:
- 大规模应用时优化向量计算
- 考虑使用专业NLP库
-
阈值设定:
- 通过实验确定最佳阈值
- 不同场景可能需要不同阈值
-
扩展应用:
- 可用于Web应用防火墙(WAF)规则
- 自动化测试工具集成
6. 示例代码汇总
6.1 完整文本相似度计算
import jieba
import numpy as np
from collections import Counter
def text_to_vector(text):
words = list(jieba.cut(text))
word_counts = Counter(words)
return word_counts
def cosine_similarity(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x]**2 for x in vec1.keys()])
sum2 = sum([vec2[x]**2 for x in vec2.keys()])
denominator = np.sqrt(sum1) * np.sqrt(sum2)
if not denominator:
return 0.0
return float(numerator) / denominator
text1 = "今天又是安服仔打工的一天"
text2 = "今天你挣到可以退休的钱了吗"
vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)
similarity = cosine_similarity(vector1, vector2)
print(f"文本相似度: {similarity:.2f}")
6.2 简单越权检测原型
import requests
from bs4 import BeautifulSoup
def preprocess_html(html):
soup = BeautifulSoup(html, 'html.parser')
text = soup.get_text()
# 进一步清理特殊字符
return text
def check_unauthorized(url, original_text, modified_text, threshold=0.9):
# 预处理文本
original_processed = preprocess_html(original_text)
modified_processed = preprocess_html(modified_text)
# 计算相似度
vec1 = text_to_vector(original_processed)
vec2 = text_to_vector(modified_processed)
similarity = cosine_similarity(vec1, vec2)
if similarity >= threshold:
print(f"可能存在越权漏洞,相似度: {similarity:.2f}")
return True
return False
7. 总结
文本相似度计算在安全测试中具有多种实用价值:
- SQL注入检测:通过响应差异识别潜在注入点
- 越权测试:比较权限变更后的内容相似度
- 路径枚举:有效区分真实页面与伪装404
- 对抗验证码:黑灰产利用相似度破解验证码
实现时需注意:
- 根据场景选择合适的算法和阈值
- 预处理步骤对结果影响大
- 词语顺序在某些场景中影响较小
这种技术可以作为安全测试工具包中的有用补充,特别是在自动化测试和漏洞扫描场景中。