基于卷积神经网络的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 数据规范化

为减少无关因素影响:

  1. 将数字替换为"0"
  2. 将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有两种主要模型:

  1. CBOW:通过上下文预测当前词
  2. 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 网络结构

模型由三部分组成:

  1. 卷积层:3层
  2. 池化层: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 测试结果

  1. SQL注入检测

    • 准确率:97%
    • 误报率:3%
  2. XSS攻击检测

    • 准确率:98%
    • 误报率:2%
  3. 正常样本检测

    • 准确率:98%
    • 误报率:2%

七、系统工作流程

  1. 预处理阶段

    • 对三组数据集进行分词和规范化处理
    • 训练得到词向量模型
  2. 训练阶段

    • 使用词向量模型将训练集转化为向量
    • 使用CNN训练检测模型
  3. 检测阶段

    • 使用训练好的模型对输入数据进行检测
    • 判断是否存在攻击行为

八、参考文献

  1. FreeBuf相关文章
  2. Bonelee的博客
  3. 刘焱. Web安全之深度学习实战 [M]. 机械工业出版社,2017.

九、代码获取

项目代码已托管,具体地址请参考原文。

注:本文基于fishyyh的原创文章,属于FreeBuf原创奖励计划,未经许可禁止转载

基于卷积神经网络的SQL注入检测技术详解 一、概述 本文详细讲解如何利用卷积神经网络(CNN)结合自然语言处理(NLP)技术来构建SQL注入检测系统。该系统能够有效识别SQL注入攻击,同时也能检测XSS攻击。 二、数据集准备 2.1 数据集组成 系统使用三类数据集: 训练集 :用于训练检测模型 正常样本:24,500条 SQL注入样本:25,527条 XSS攻击样本:25,112条 验证集 :用于训练过程中验证模型准确率 每类样本各10,000条 测试集 :用于最终测试模型性能 每类样本各4,000条 2.2 数据样本示例 正常样本 : SQL注入样本 : XSS注入样本 : 三、文本预处理 3.1 URL解码 由于样本大多经过URL编码,需要进行循环解码: 3.2 数据规范化 为减少无关因素影响: 将数字替换为"0" 将URL替换为"http://u" 3.3 分词处理 使用正则表达式进行分词: 3.4 处理前后对比 处理前 : 处理后 : 四、词向量训练 使用Word2Vec将单词转化为计算机可理解的向量: 4.1 Word2Vec模型 Word2Vec有两种主要模型: CBOW :通过上下文预测当前词 Skip-Gram :通过当前词预测上下文 4.2 训练代码 4.3 词向量示例 单词"select"转化后的向量: 五、CNN模型构建与训练 5.1 网络结构 模型由三部分组成: 卷积层 :3层 池化层 :3层 全连接层 5.2 训练代码 六、模型性能评估 6.1 测试结果 SQL注入检测 : 准确率:97% 误报率:3% XSS攻击检测 : 准确率:98% 误报率:2% 正常样本检测 : 准确率:98% 误报率:2% 七、系统工作流程 预处理阶段 : 对三组数据集进行分词和规范化处理 训练得到词向量模型 训练阶段 : 使用词向量模型将训练集转化为向量 使用CNN训练检测模型 检测阶段 : 使用训练好的模型对输入数据进行检测 判断是否存在攻击行为 八、参考文献 FreeBuf相关文章 Bonelee的博客 刘焱. Web安全之深度学习实战 [ M ]. 机械工业出版社,2017. 九、代码获取 项目代码已托管,具体地址请参考原文。 注:本文基于fishyyh的原创文章,属于FreeBuf原创奖励计划,未经许可禁止转载