基于TADK的SQLI检测
根据开放web应用安全项目(OWASP)的统计,SQL注入(SQL injection, SQLI) 是web应用程序排名第一的威胁。攻击者通过将恶意SQL查询插入用户输入框来从后端数据库窃取关键信息从而危害web应用程序。传统检测SQLI是利用黑名单过滤机制,使用正则表达式将某些关键字列入黑名单或非法语句。
但这种方法只能检测到已知的攻击,对新的攻击没有效果。此外,规则库的维护和更新也需要专业的知识,门槛相对较高。并且通常情况下用户需要花费一定的费用来获得商业版的规则库。近年来,基于机器学习的检测方法逐渐流行起来,但是对于切词(tokenization),特征提取 (feature extraction) 还没有比较高效的解决方案。
再加上业界一般多采用较为复杂的神经网络来训练模型,导致推理速度难以达到实际部署的要求。目前,比较主流的SQLI检测产品比如Modsecurity都是基于Libinjection库实现的。Libinjection定义了SQLI的28个token 类型,如图1所示。
Libinjection将输入的数据依据图1的定义逐个字符进行分析转换,之后就会得到SQLI的识别特征,或者说指纹 (fingerprint),然后通过二分查找算法,在特征库中进行匹配,匹配到则报SQLI攻击。为了降低特征库的规模以提升二分查找的效率,Libinjection会对原始生成的fingerprint进行压缩,最终库的规模维持在8000+条fingerprint。整个处理流程如图2所示。