基于卷积神经网络的SQL注入检测

本文介绍了一种利用卷积神经网络(CNN)训练SQL注入检测模型的方法。通过对数据进行预处理、训练词向量模型并最终训练出CNN模型,该模型能够有效识别SQL注入攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文结合自然语言处理技术,采用卷积神经网络算法训练SQL注入检测模型,主要包括文本处理、提取文本向量和训练检测模型三个部分。

 

训练数据

实验过程中的数据集主要分为三组训练集(用于训练检测模型的数据)、验证集(训练过程中验证模型的准确率)、测试集(测试训练完成后模型的准确率)。

训练集中正常样本24500条,SQL注入攻击样本25527条,XSS攻击样本25112条;验证集中正常样本10000条,SQL注入攻击样本10000条,XSS攻击样本10000条;测试中正常样本4000条,SQL注入攻击样本4000条,XSS攻击样本4000条。

正常样本数据格式如下:

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

文本处理

训练过程中使用的数据基本都经过了URL编码,有的可能经过过了多重编码,因此需进行URL循环解码,并且为了减少数字和其他无关因素对数据样本的影响对数据进行范化处理,将数字替换为0,超链接替换为http://u。代码如下:

def URLDECODE(payload): 
    payload=payload.lower()
    while True:
        test=payload
        payload=unquote(payload)
        if test==payload:
            break
        else:
            continue
    #数字泛化为"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)
    #分词
    r = '''
        (?x)[\w\.]+?\(
        |\)
        |"\w+?"
        |'\w+?'
        |http://\w
        |</\w+>
        |<\w+>
        |<\w+
        |\w+=
        |>
        |[\w\.]+
    '''
    return nltk.regexp_tokenize(payload, r) 

未处理的数据样本如下:

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是Google在2013年开源的一款将自然语言转化为计算机可以理解特征向量的工具。Word2Vec主要有CBOW(Continuous Bag-Of-Words)和Skip-Gram两种。CBOW模型训练过程是输入某一个词上下文相关的词对应的词向量,输出是这个词的词向量;而Skip-Gram与之相反,输入特定一个词的词向量,输出该特定词的上下文词向量。

将分词处理完的数据作为文本向量的训练数据,训练得到词向量模型,通过此模型,可将单词转化为计算机所能理解的向量,如单词select经过转化后如下:

 

[ 5.525984  -2.4446     -0.9985928  -1.6910793  1.8828514   2.8958166

 0.90518814 -1.3623474 -1.8427371   0.5957503  -3.9347208  1.4152565

 -0.0354603 -7.432402   -0.68348515 -4.0790896]

训练词向量模型的代码如下:

 

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!") 

训练检测模型

卷积神经网络结构如图所示,由三个卷积层、三个池化层组成,最后连接全连接层:

实现代码如下:

 

def train_cnn():

       forline in open("./file/INPUT_SHAPE"):

              input_shape=int(line)

              print(input_shape)

       INPUT_SHAPE=(input_shape,16)

       forline in open("./file/len"):

              lens=int(line)

              print(lens)

       data_size=ceil(lens//(BATCH_SIZE*NB_EPOCH))

       print(data_size)

       forline in open("./file/valid_len"):

              valid_lens=int(line)

              print(valid_lens)

       valid_size=ceil(valid_lens//(BATCH_SIZE*NB_EPOCH))

       print(valid_size)

       model= CNN.build(input_shape=INPUT_SHAPE, classes=3)

       print('1')

       model.compile(loss="categorical_crossentropy",optimizer=OPTIMIZER,

              metrics=["accuracy"])

       print('2')

       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)

       print('3')

       model.save('cnn')

       print("modelsave complete!")

对测试集的4000个SQL注入攻击样本进行测试结果如下,准确率为0.97,误报率0.03

SPEV{`QKY}XP)EVP{)BPYJF.png

对测试集的4000个XSS攻击样本进行测试结果如下,准确率0.98,误报率0.02

M(6{`S8TK5[3AWF~R]F3MDF.png

对测试集的4000个正常进行测试结果如下,准确率0.98,误报率0.02

~X~XS4T7OC{A~0}LDT0A_YN.png

系统运行流程

首先将三组数据集进行分词范化处理,并通过训练得到词向量模型。然后将训练集通过词向量模型转化为向量,使用卷积神经网络训练检测模型。最后使用注入检测模型对测试集数据进行检测是否存在攻击。

参考文章

http://www.freebuf.com/news/142069.html

https://www.cnblogs.com/bonelee/p/7978729.html

https://github.com/fishyyh/CNN-SQL.git

<think>嗯,用户想了解如何用卷积神经网络CNN)来做源代码漏洞检测。这个问题听起来有点技术性,我需要先回忆一下CNN的基本原理和它在其他领域的应用,再想想怎么应用到源代码分析上。 首先,CNN主要用于图像处理,因为它能捕捉局部特征并通过卷积层提取空间信息。那源代码是文本,怎么能用CNN呢?可能需要把代码转换成类似图像的表示。比如,用词嵌入或者向量化的方法把代码转化为矩阵,这样每个词或token对应一个向量,整个代码就像一张二维的图像了。 然后,用户可能关心具体的步骤。应该分几个阶段:数据预处理、模型构建、训练和评估。数据预处理是关键,可能需要处理大量的源代码,标记漏洞的位置。这里可能需要用一些工具来解析代码,比如抽象语法树(AST)或者控制流图(CFG),把结构信息转化为数字形式。 接下来是模型设计。传统的CNN可能直接处理向量化的代码,但可能需要调整网络结构,比如卷积核的大小,是否结合池化层,以及全连接层的设计。另外,可能还需要考虑代码的序列特性,这时候可以结合RNN或者Transformer,但用户问的是CNN,所以得专注于卷积层。 然后,我需要考虑现有的研究或应用案例。比如,有的论文会用CNN处理代码片段,把代码当作图像输入,或者利用嵌入层将代码token转化为向量,再应用卷积操作。可能还需要数据增强,比如对代码进行小的修改生成更多的训练样本。 还有可能遇到的挑战,比如代码的长距离依赖,CNN可能不太擅长捕捉,这时候可能需要深层网络或者结合其他机制。另外,数据不平衡问题,漏洞样本可能比较少,需要过采样或调整损失函数。 用户可能还想知道实际效果如何,准确率怎么样,有哪些成功的例子。可能需要引用一些论文或实验结果,说明CNN在这个领域的潜力和局限性。 最后,确保回答结构清晰,分步骤解释,并给出示例或应用场景,帮助用户理解整个过程。同时,要注意使用正确的中文术语,避免技术错误,比如正确使用“卷积核”、“池化层”等词汇。</think>利用卷积神经网络CNN)进行源代码漏洞检测的核心思路是将**代码特征转化为可学习的空间结构**,并通过逐层抽象捕捉漏洞模式。以下是具体实现步骤: --- ### 一、数据预处理:代码的向量化表示 1. **代码解析与标记化** - 使用词法分析器(如ANTLR)将代码分解为token序列 - 示例:`strcpy(buffer, input)` → `[strcpy, (, buffer, ,, input, )]` 2. **结构化表示(选以下一种方式)**: $$代码向量 = \begin{cases} \text{词嵌入矩阵} & \text{(每个token映射为$d$维向量)} \\ \text{控制流图(CFG)邻接矩阵} & \text{(节点表示基本块)} \\ \text{抽象语法树(AST)序列} & \text{(通过树遍历生成线性序列)} \end{cases}$$ 3. **数据增强** - 通过变量重命名/死代码插入生成等价变体 - 对抗样本生成:在安全代码中插入漏洞代码片段 --- ### 二、CNN模型架构设计 ```python # 典型模型结构示例(基于Keras) model = Sequential([ Embedding(vocab_size, 128, input_length=max_len), # 词嵌入层 Conv1D(64, 3, activation='relu'), # 1D卷积捕捉局部序列模式 MaxPooling1D(2), # 下采样重要特征 Conv1D(128, 5, activation='relu'), # 深层卷积扩大感受野 GlobalMaxPooling1D(), # 提取全局特征 Dense(64, activation='relu'), Dropout(0.5), Dense(1, activation='sigmoid') # 二分类输出 ]) ``` #### 关键设计点: 1. **多尺度卷积核**:同时使用$3 \times 3$、$5 \times 5$等不同尺寸卷积核,捕捉短距离语法错误和长距离逻辑缺陷 2. **注意力机制增强**:在池化层前加入SE(Squeeze-and-Excitation)模块,加权重要通道 3. **混合模型结构**:CNN与BiLSTM结合,同时捕捉局部特征和全局上下文 --- ### 三、训练优化策略 1. **损失函数设计**: $$L = \alpha \cdot BCE + (1-\alpha) \cdot Focal\ Loss$$ - 解决类别不平衡问题(漏洞样本通常占比<5%) 2. **梯度裁剪**:限制梯度范数在$[0,1]$区间,防止梯度爆炸 3. **动态学习率**:采用余弦退火策略,初始学习率设为$10^{-3}$ --- ### 四、效果评估与部署 1. **评估指标**: - 精确率-召回率曲线下面积(AUPRC)比AUC更适用于不平衡数据 - 误报率需控制在<15%(工业级应用要求) 2. **可视化解释**: - 使用Grad-CAM技术定位可疑代码段 $$Heatmap = ReLU\left(\sum_k w_k^c \cdot A^k\right)$$ 其中$A^k$为第$k$个特征图,$w_k^c$为类别$c$的权重 3. **部署优化**: - 使用TensorRT加速推理,单文件检测时间<500ms - 结合符号执行对可疑结果进行验证 --- ### 五、典型应用案例 1. **缓冲区溢出检测**:识别`strcpy`/`memcpy`等危险函数的使用模式 2. **SQL注入漏洞**:检测未过滤的用户输入拼接SQL语句 3. **竞态条件检测**:通过文件操作序列的时间特征识别TOCTOU漏洞 --- ### 六、挑战与改进方向 1. **语义理解局限**:CNN难以捕捉跨函数的复杂数据流,可结合图神经网络(GNN) 2. **对抗样本防御**:采用对抗训练提升模型鲁棒性 3. **多语言支持**:需要为不同编程语言(C/Java/Python等)设计专用词表 通过上述方法,工业级系统如微软CodeQL、Checkmarx已实现超过80%的漏洞检出率。未来发展方向是构建**代码理解-漏洞检测-修复建议**的端到端智能系统。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值