SQL注入检测(转载)
SQL注入常用于攻击Web应用程序,攻击者的输入值被传输到程序中的数据库中执行查询语句,从而形成SQL代码。SQL注入攻击实现简单且威胁程度高,被OWASP列为十大Web应用程序漏洞之一,且长期位居榜首。
SQL漏洞的产生主要是由于在编写代码时不恰当的使用API操作数据库以及缺乏有效的输入验证和过滤机制。SQL注入攻击一般可能造成以下损害:
资料表中的资料外泄
数据结构被黑客探知,得以做进一步攻击
数据库服务器被攻击,系统管理员账户被窜改
获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及Phishing等
经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统
攻击者利用数据库提供的各种功能操纵文件系统,写入Webshell,最终导致攻击者攻陷系统
破坏硬盘资料,瘫痪全系统
获取系统最高权限
网站主页被窜改
SQL注入方式主要有以下几种:
同义反复:将恶意代码插入到多个条件语句中,使SQL语句的条件子句部分总是为真,致使原条件失效,主要用于绕过身份验证。
逻辑错误查询:向被测系统提交错误的SQL语句,通过分析系统返回的错误信息来判断系统内部信息。
联合查询:通过在SQL语句中加入“UNION”求并集子句来获得额外信息。
复合查询:使用“;”将SQL查询、插入、删除等操作连接并执行。
存储过程:存储过程包含参数,在参数传递中存在SQL注入。
推理:构造条件互相对立的SQL语句,可分为条件盲注和时间盲注。
编码替换:利用ASCII编码、十六进制编码等方式转换语句进行注入。
按具体的攻击手段,常用的SQL注入方法大致有Union注入、Boolean注入、报错注入、时间注入、堆叠查询注入、二次注入、宽字节注入、Cookie注入、Base64注入、XFF注入等。
SQL注入攻击防范
SQL注入攻击防范主要有以下几种方法:
在服务端正式处理之前对提交数据的合法性进行检测
封装客户端提交信息
替换或删除敏感字符/字符串
屏蔽出错信息
使用SQL变量而不是用字符串建立SQL查询
目录最小化权限设置
修改或移除Web服务器上默认的危险命令
数据敏感信息非常规加密
使用其他更安全的方式连接SQL数据库
增强WAF的防御力
SQL注入检测
SQL注入攻击检测可根据入侵事件发生的前后进行区分,在入侵前可以对Payload进行检测等方式以预防SQL注入攻击。在入侵检测后可以通过对数据库、IIS日志等进行检查以进行判断。
传统的SQL注入检测方法通常根据经验提取特征,然后基于规则库匹配的方法来检测是否为SQL注入语句。其设计一般较为复杂,且规则模式更新频繁。在此采用机器学习的方式尝试对SQL注入语句进行检测。
CharCNN
CharCNN模型架构来源于Character-level Convolutional Networks for Text Classification这篇论文,大部分基于深度学习的文本分类网络模型大都从单词、短语、句子等层面或者对语义和语法结构进行分析建模,而CharCNN利用字符层面信息进行文本分类。由此可见,CharCNN较为适合类似于payload等这种由各种字符构成的短文本。
CharCNN模型结构:
CharCNN以一系列编码字符作为输入。通过为输入大小为的字母表,然后采用one-hot等编码方式对每个字符进行量化来完成编码。然后,将字符序列转换为固定长度的向量序列。长度超过固定长度的任何字符都将被忽略,并且不存在于字母表的字符都将转化为全零向量。由于字符编码顺序是向后的,因此最新读入的字符始终放在输出的开头,即要反向处理字符编码。
CharCNN论文中设计了两种类型的卷积,且它们都由6个卷积层和3个全连接层组成。除此之外,在3个全连接层之间加入2个Dropout层以实现模型正则化。
在此次SQL注入检测中,设计了如下字符表:
abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:'\"/\\|_@#$%^&*~`+-=<>()[]{}
且对特殊字符采用特殊编码表示,并对字母数据一律采用小写字母表示。
在数据采集方面,SQLi检测的训练集包含了53739个SQL注入样本,48497个正常样本。测试集包含了5954个SQL注入样本,5406个正常样本。对数据进行预处理后,采用CharCNN进行约10轮epoch的训练。payload样本字符串取150个字符的测试结果如下:
AUC: 0.99689285
ACC: 0.99674296
Recall: 0.99378569
F1-score: 0.99688316
Precision: 1.00000000
样本字符串取300个字符在40次epoch后的测试结果如下:
AUC: 0.99904220
ACC: 0.99903169
Recall: 0.99882432
F1-score: 0.99907602
Precision: 0.99932784
Bi-LSTM
Bi-LSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。由于LSTM对句子进行建模时存在无法编码从后到前的信息的问题,故采用Bi-LSTM来更好的捕捉双向的语义依赖。
样本字符串取300个字符在50次epoch后的测试结果如下:
AUC: 0.99965558
ACC: 0.99964789
Recall: 0.99949614
F1-score: 0.99966403
Precision: 0.99983199
结果
经过测试,CharCNN模型在公司实时数据中可以检测出如下所示的SQL注入攻击:
%2C%28SELECT+2726+FROM+%28SELECT+EXP%28~%28SELECT+%2A+FROM+%28SELECT+CONCAT%280x7170766b71%2C%28SELECT+%28ELT%282726%3D2726%2C1%29%29%29%2C0x716a6b6a71%2C0x78%29%29x%29%29%29s%29
同时在未迭代的Bi-LSTM原始模型基础上检测出了如下类似蚁剑WebShell链接流量:
?a=Ev al ("Ex"&"e"&"cute(""Server.ScriptTimeout=3600:On Error Resume Next:Function bd(byVal s):For i=1 To Len(s) Step 2:c=M"&"i"&"d(s,i,2):If IsNumeric(M"&"i"&"d(s,i,1)) Then:Ex"&"e"&"cute(""""bd=bd&c"&"h"&"r(&H""""&c&"""")""""):Else:Ex"&"e"&"cute(""""bd=bd&c"&"h"&"r(&H""""&c&M"&"i"&"d(s,i+2,2)&"""")""""):i=i+2:End If""&c"&"h"&"r(10)&""Next:End Function:Response.Write(""""@*lxl*@""""):Ex"&"e"&"cute(""""On Error Resume Next:""""&bd(""""526573706F6E73652E577269746528224C584C2229"""")):Response.Write(""""*@lxl@*""""):Response.End"")")
在后期的模型迭代升级上,需要在训练集中加入现有模型误报和漏报的数据,以使模型更针对于实际网络环境下的数据。并可以结合模式匹配、专家规则等方式,以提高模型的检测效果。
参考文献
Zhang X, Zhao J, LeCun Y. Character-level convolutional networks for text classification[J]. arXiv preprint arXiv:1509.01626, 2015.
黄小丹. SQL注入漏洞检测技术综述[J]. 现代计算机, 2020, No.682(10):52-59.
陈小兵, 张汉煜, 骆力明, 等. SQL 注入攻击及其防范检测技术研究[D]. , 2007.
猎豹安全中心技术分享频道
海量日志分析的预处理
OSSEC-Execd功能模块分析
通过流量快速识别域名信息
从android源码看脱壳
Ossec-Agentd模块分析
猎豹移动DPIA系统开源
一种新的分词方法在机器学习中的应用
Ossec-Logcollector模块分析
Ossec-Agent-Syscheckd模块分析
Ossec Agent总结
HTTP走私漏洞分析
BurpSuite扩展插件使用分享
webshell连接工具流量分析
JDK7u21调用链分析
php函数中的那些坑
通过sqlmap源代码分析SQL注入漏洞检测流程
猎豹移动通过“全球首个隐私信息管理体系标准”ISO/IEC 27701认证
DGA域名检测
基于NSL-KDD数据集的网络入侵检测分析
采用HAN网络模型的WebShell检测