1 算法描述
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,学习策略为间隔最大化,可将处理的实际问题形式化为一个求解凸二次规划的问题。 SVM的学习算法就是求解凸二次规划的最优化算法。其中本文采用SVM算法,经过关键字识别,结构分析,异常模式检测三大步骤,标注异常数据和正常数据后人工研判,完成数据模型的训练。在完成模型训练后,SVM可以对的外部传入的SQL查询语句进行检测,识别常见的SQL注入攻击。
1.1基础原理
SQL注入(SQL injection)攻击,主要是指针对数据库的入侵,它也是目前最常见的数据库入侵手法,对网络安全形成了很大威胁。所以对各种丰富多样的SQL注入攻击类型及变体,研究一种更高效的自动化识别方法对于信息安全领域有着重大的科研意义。
如图1所示,web服务一般会采用浏览器+服务器+数据库的三[6]层架构模式。 web服务器中存在web脚本来处理浏览器传来的用户名密码等身份验证信息和各种查询请求,并将数据库中的查询结果反馈给客户端浏览器进行显示,由于编程者对程序安全性的疏忽,并未对来自浏览器端的数据进行检测,则攻击者就可以利用此漏洞,将重组后的SQL语句输入到浏览器表单或请求查找字符中,来欺骗服务器将攻击者想要看到的信息回传。
此种攻击手法即为SQL注入攻击。
图1
举例:
场景一:在MySQL数据库中,攻击者构造恶意的SQL查询语句,查询高敏感度的数据,如:
Select * from user where id =-1 union select 1 , group_concat (table_name) , 3 from information_schema . tables where table_schema = ’security’
场景二:好多web应用都会使用预设框架,对这些框架盲目信任则也可能导致恶意的查询语句的产生,如Hibemate中恶意构造的查询语句(HQL):
from User where name = ‘ admin ’ or ‘ 1 ’ > ‘ 0 ’ or name like ‘ admin & user.password = 1’ and password = ‘ + password + ‘
类似于将参数“id”改为“’or’ 1’ = ‘1”这样构造的Payload,在url 的表现形式如下所示: http://example.com/app/accountView?id=’or’1’=’1
此payload 的含义则变为由accounts 表中返回所有数据,像这样构造payload 还可以构造成修改数据、调用存储过程、直接执行数据库命令等对数据库威胁更大的命令。
基于SQL注入攻击的特性,本文提出的检测框架包括以下几个步骤:
1.SQL语句解析:使用解析器分析SQL语句的语法结构。
2.语义特征提取:提取SQL语句中的关键特征(如表名、字段名、操作符等)。
3.异常检测:利用机器学习模型对提取的特征进行分类,以识别正常和异常的SQL语句。
1.2 实现步骤(或执行过程)
我采用上文所提到的支持向量机(SVM)作为分类模型,因为SVM在高维空间中具有良好的分类性能,适合用于处理特征SQL注入攻击这类稀疏的情况。
支持向量机基本原理:SVM通过寻找最优超平面,将不同类别的样本分开。按统计学习理论,分类器在经过学习并应用于新数据时会产生风险,风险的类型可分为经验风险和结构风险(后文公式均以LateX软件书写,这里插入LateX语法编译后的公式的图片)
式中f表示分类器,经验风险由损失函数定义,描述了分类器所给出的分类结果的准确程度;结构风险由分类器参数矩阵的范数定义,描述了分类器自身的复杂程度以及稳定程度,复杂的分类器容易产生过拟合,因此是不稳定的。若一个分类器通过最小化经验风险和结构风险的线性组合以确定其模型参数其目标是最大化分类间隔,公式如下:
常数C是正则化系数。当p=2时,硬边界SVM的经验风险可以归0。在本SQL注入检测项目中,经验风险会反映SVM在训练集(即包含正常和异常SQL查询的样本)上的分类效果。如果模型在训练集上的误分类率较高,则说明经验风险较大。如果经验风险过高,可能表示模型未能很好地学习到正常查询和SQL注入之间的特征差异,导致在训练数据上出现较多错误。由于使用matlab软件实现此风险平衡的优化算法难度较大,故引入人工研判数据的方式,人工研判依据如图2所示。
图2
另外查询资料显示SQL注入语句大部分都具有线性关系,故SVM算法中处理线性不可分关系的核方法等内容由于数学关系过于复杂也暂时忽略,该模型用于处理大多数情况。
简化后的SVM算法通过寻找最优超平面,将不同类别的样本分开。其目标是最大化分类间隔,公式如下:
2 结果与讨论
2.1 算法参数设置
算法参数设置如下:
- fitcsvm:用于创建支持向量机分类器的函数。
- BoxConstraint:设置正则化参数C。
- KernelScale:对于某些核函数(如RBF),可以指定缩放因子。
2.2 算法实验结果
图3 正常SQL语句
图4 SQL注入攻击语句
2.3 讨论
由于SVM算法的复杂性,此项目简化了原算法模型中较为复杂的部分,但对比结果发现对于一般的SQL注入语句检测效果较好,符合研究预期,并与其他论文数据结果相比基本一致。
图5 基于语义的SQL注入攻击智能检测方法研究_王付祥 沈阳理工大学硕士研究生学位论文
3结论与展望
随着大数据,人工智能,云计算等互联网技术的飞速发展和web2.0时代的到来,数字经济和数字技术已经深入各行各业,如:车间机器人、5G通信、大数据 消费等。各国正向投入数字经济,据统计发达国家数字经济GDP占比已高达43.9%, 随着投入的越来越大,针对网络数据的攻击也逐年上升,对于互联网设备的防御技术具有很大科研价值。在本实验中,我们使用多个正常和异常的SQL语句进行训练和测试。实验结果表明,该方法能够有效识别常见的SQL注入攻击,同时结合了matlab相关技术进行实现。未来还可以继续优化算法,做到全程由机器学习自动化识别,省去人工研判步骤。
附matlab程序如下:
% 加载数据 load fisheriris; % 示例数据集 % 特征选择和标签设置 X = meas(:, 1:2); % 使用前两个特征 Y = species; % 目标标签 % 设置SVM参数 C = 1; % 正则化参数 kernelFunction = 'rbf'; % 核函数(这里选择高斯核) sigma = 1; % RBF核的带宽参数 % 创建SVM分类器,自己填入参数,这里为示例 SVMModel = fitcsvm(X, Y, ... 'KernelFunction', kernelFunction, ... 'BoxConstraint', C, ... 'KernelScale', sigma); % 可选:设置核函数的缩放因子,默认不用 % 查看模型信息 disp(SVMModel); % 需要已经安装了统计和机器学习工具箱 % 数据准备:示例SQL语句(正常与异常) sql_queries = { 'SELECT * FROM users WHERE id = 1'; % 正常 'SELECT * FROM users WHERE id = 1 OR 1=1'; % 注入 'DROP TABLE users;'; % 注入 'SELECT username FROM users WHERE username = ''admin'';'; % 正常 }; % 标签(0表示正常,1表示异常) labels = [0; 1; 1; 0]; % 特征提取(简单的示例,实际情况应更复杂,自己填入适当参数) features = []; for i = 1:length(sql_queries) query = sql_queries{i}; % 统计关键词频率等(这里只做简单示例) features(i, 1) = contains(query, 'SELECT'); features(i, 2) = contains(query, 'DROP'); features(i, 3) = sum(query == ''''); % 统计单引号数量 end % 训练SVM模型 SVMModelSQL = fitcsvm(features, labels); % 注意变量名 % 测试新的SQL语句 test_query = 'SELECT * FROM users WHERE id = 1 OR 1=1'; test_features = zeros(1, size(features, 2)); test_features(1) = contains(test_query, 'SELECT'); test_features(2) = contains(test_query, 'DROP'); test_features(3) = sum(test_query == ''''); % 预测 [prediction, score] = predict(SVMModelSQL, test_features); % 注意变量名 % 输出结果 if prediction == 1 fprintf('检测结果:可能存在SQL注入攻击\n'); else fprintf('检测结果:正常SQL查询\n'); end % 可视化SVM决策边界 figure; gscatter(X(:,1), X(:,2), Y); % 绘制数据点 hold on; % 创建网格以评估模型 x1range = linspace(min(X(:,1)), max(X(:,1)), 100); x2range = linspace(min(X(:,2)), max(X(:,2)), 100); [x1grid, x2grid] = meshgrid(x1range, x2range); XGrid = [x1grid(:), x2grid(:)]; % 预测网格点 [~, scores] = predict(SVMModel, XGrid); % 绘制决策边界 contour(x1grid, x2grid, reshape(scores(:,2), size(x1grid)), [0 0], 'k'); % 假设第二类为正类 title('SVM Decision Boundary'); xlabel('Feature 1'); ylabel('Feature 2'); legend('Setosa', 'Versicolor', 'Virginica', 'Decision Boundary'); hold off;
参考资料:
[1] 曹鹏飞,潘绪超,王凡,等.基于语义分析的SQL注入行为检测方案研究[J].计算机时代, 2019(11):5.DOI:CNKI:SUN:JSJS.0.2019-11-006.
[2] 支持向量机_百度百科
[3] OWASP Foundation. (2021). SQL Injection.
[4]李晓东等. "基于大语言模型的SQL注入攻击检测方法研究." 通讯世界 31.6(2024):61-63.