基于卷积神经网络的SQL注入检测
字数 979 2025-08-18 11:37:23
基于卷积神经网络的SQL注入检测技术详解
一、概述
本文详细讲解如何利用卷积神经网络(CNN)结合自然语言处理(NLP)技术来构建SQL注入检测系统。该系统能够有效识别SQL注入攻击,同时也能检测XSS攻击。
二、数据集准备
2.1 数据集组成
系统使用三类数据集:
- 训练集:用于训练检测模型
- 正常样本:24,500条
- SQL注入样本:25,527条
- XSS攻击样本:25,112条
- 验证集:用于训练过程中验证模型准确率
- 每类样本各10,000条
- 测试集:用于最终测试模型性能
- 每类样本各4,000条
2.2 数据样本示例
- 正常样本:
code%3Dzs_000001%2Czs_399001%2Czs_399006%26cb%3Dfortune_hq_cn%26_%3D1498591852632 - SQL注入样本:
-9500%22%20WHERE%206669%3D6669%20OR%20NOT%20%284237%3D6337%29 - XSS注入样本:
site_id%3Dmedicare%22%3E%3Cscript%3Ealert%281337%29%3C/script%3E%2Casdf
三、文本预处理
3.1 URL解码
由于样本大多经过URL编码,需要进行循环解码:
def URLDECODE(payload):
payload = payload.lower()
while True:
test = payload
payload = unquote(payload)
if test == payload:
break
return payload
3.2 数据规范化
为减少无关因素影响:
- 将数字替换为"0"
- 将URL替换为"http://u"
# 数字泛化为"0"
payload, num = re.subn(r'\d+', "0", payload)
# 替换URL为"http://u"
payload, num = re.subn(r'(http|https)://[a-zA-Z0-9\.@&/#!#\?]+', "http://u", payload)
3.3 分词处理
使用正则表达式进行分词:
r = '''(?x)[\w\.]+?
| \w+?\'\w+?
| http://\w
| </\w+>
| <\w+>
| <\w+
| \w+=\w+
| \.\.\.
| [\w\.]+'''
return nltk.regexp_tokenize(payload, r)
3.4 处理前后对比
处理前:
1)))%252bAND%252b8941%25253d8941%252bAND
/yk10/?page=54%20LIMIT%201%2C1%20UNION%20ALL%20SELECT%22C%20NULL%2C%20NULL%23
处理后:
['0'and', '0=', '0', 'and']
['yk0', 'page=', '0', 'limit', '0', '0', 'union', 'all', 'select', 'null', 'null', 'null']
四、词向量训练
使用Word2Vec将单词转化为计算机可理解的向量:
4.1 Word2Vec模型
Word2Vec有两种主要模型:
- CBOW:通过上下文预测当前词
- Skip-Gram:通过当前词预测上下文
4.2 训练代码
def train_word2vec():
sentences = MySentences(datadir)
cores = multiprocessing.cpu_count()
if os.path.exists(model_dir):
print("Find cache file %s" % model_dir)
model = Word2Vec.load(model_dir)
else:
model = Word2Vec(size=max_features, window=5,
min_count=10, iter=10, workers=cores)
model.build_vocab(sentences)
model.train(sentences, total_examples=model.corpus_count,
epochs=model.iter)
model.save(model_dir)
print("save model complete!")
4.3 词向量示例
单词"select"转化后的向量:
[ 5.525984 -2.4446 -0.9985928 -1.6910793 1.8828514
2.8958166 -0.0354603 -7.432402 -0.68348515 -4.0790896]
五、CNN模型构建与训练
5.1 网络结构
模型由三部分组成:
- 卷积层:3层
- 池化层:3层
- 全连接层
5.2 训练代码
def train_cnn():
# 读取输入形状
for line in open("./file/INPUT_SHAPE"):
input_shape = int(line)
INPUT_SHAPE = (input_shape, 16)
# 读取数据长度
for line in open("./file/len"):
lens = int(line)
data_size = ceil(lens // (BATCH_SIZE * NB_EPOCH))
# 读取验证集长度
for line in open("./file/valid_len"):
valid_lens = int(line)
valid_size = ceil(valid_lens // (BATCH_SIZE * NB_EPOCH))
# 构建模型
model = CNN.build(input_shape=INPUT_SHAPE, classes=3)
model.compile(loss="categorical_crossentropy",
optimizer=OPTIMIZER,
metrics=["accuracy"])
# 设置回调
call = TensorBoard(log_dir=log_dir+"cnn", write_grads=True)
checkpoint = ModelCheckpoint(filepath='bestcnn',
monitor='val_acc',
mode='auto',
save_best_only='True')
# 数据生成器
next_batch = data_generator(BATCH_SIZE, input_shape, "./file/x_train")
next_valid_batch = data_generator(BATCH_SIZE, input_shape, "./file/x_valid")
# 训练模型
model.fit_generator(batch_generator(next_batch, data_size),
steps_per_epoch=data_size,
epochs=NB_EPOCH,
callbacks=[call, checkpoint],
validation_data=batch_generator(next_valid_batch, data_size),
nb_val_samples=valid_size)
# 保存模型
model.save('cnn')
print("model save complete!")
六、模型性能评估
6.1 测试结果
-
SQL注入检测:
- 准确率:97%
- 误报率:3%
-
XSS攻击检测:
- 准确率:98%
- 误报率:2%
-
正常样本检测:
- 准确率:98%
- 误报率:2%
七、系统工作流程
-
预处理阶段:
- 对三组数据集进行分词和规范化处理
- 训练得到词向量模型
-
训练阶段:
- 使用词向量模型将训练集转化为向量
- 使用CNN训练检测模型
-
检测阶段:
- 使用训练好的模型对输入数据进行检测
- 判断是否存在攻击行为
八、参考文献
- FreeBuf相关文章
- Bonelee的博客
- 刘焱. Web安全之深度学习实战 [M]. 机械工业出版社,2017.
九、代码获取
项目代码已托管,具体地址请参考原文。
注:本文基于fishyyh的原创文章,属于FreeBuf原创奖励计划,未经许可禁止转载