扒一扒基于词法分析和语法分析的SQL注入攻击检测

周末了,又到了一星期中的美好时刻,因为期待,因为渲染在时光中的慵散。本周,Black Hat大会,应该是安全界中的大事件。

这不,经过一番紧锣密鼓的搜罗,发现了一篇关于Black Hat上关于国人的新闻“Black Hat|长亭科技:防SQL注入利器--SQLChop”。

技术背景

咦,SQL注入,老生常谈了,不禁有些许唏嘘。先来看看,报道中对SQLChop的介绍:

调整思路后,长亭科技将目光放在了传统的编译原理方法上。在BlackHat2012会议中提出的libinjection首先考虑到了词法分析, 但是其结果仍存在较大的改进空间。经过技术人员不懈的努力,在多方调研和尝试后确立了在词法分析的基础上再作了语法分析的思路。 研究解决了包括输入数据的编码多样性,词法分析需要考虑语句拼接以及语法分析要覆盖SQL庞大的语法集在内的各种技术难题,最后研发出了无规则的基于词法分析和语法分析的SQL注入攻击检测与防御引擎——SQLChop。SQLChop在检测准确率和召回率两方面相比传统的WAF都有了质的飞越,真正使SQL注入防御技术上了一个新的台阶。

我想说的是,国内应该已经有几家安全厂商早已使用了基于词法语法分析的SQL防注入引擎。这样做的好处就是,再也不用写那些千变万化的规则了,而且漏报的情况很少,相对的,如何处理误报,才是要好好斟酌的事。

说白了,用词法语法分析SQL注入,是一种大而全的比较投机的方法,精确度和传统的规则匹配,还是有一定差距的。但是他可以检测出未知的sql注入。至于所谓的技术难题,我也来说道说道。

词法语法分析SQL注入的一些环节

首先,需要一个HTTP协议解析引擎,将url,post,cookie等相关的参数进行解析,还原成用户输入的数据。如:

www.baidu.com/index.asp?id=123&name=admin

对于id,name所代表的含义我们并不关心,我只要解析后用户所输入的数据,如123,admin。

然后,我需要对这些数据进行拼接。

Select * from table where id = XXX

XXX就是所谓的用户输入的数据。Select * from table where id =,设置成固定模板即可,它存在的价值,只是为了语法分析器能够进行分析而已。至于id后面的参数是否需要添加引号等细节问题,就不一一说明了。

当然,每个参数都需要拼接成一条完整的SQL语句。如上述的url中含有两个参数,id和name,那么我们就需要拼接成两条sql语句,分别进行检测了。

现在我们就有了完整的sql语句了。接下来,我们就要进行词法语法分析了,用啥工具好呢,首先想到的当然是flex&bison了。

但是,难道要我们自己去实现一套sql语句的语法分析,Oh,No,别忘了,我们有更趁手的武器,那就是开源的mysql啊!

Mysql使用了yacc作为语法分析,具体的实现,看mysql server的代码就可以了。Mysql的关键字token在sql/lex.h中也有定义。

有了词法分析,我们就可以统计token的数量,尤其是我们认为的恶意的token。然后通过词法分析中得到的token的数量,作为判断是否是sql注入的凭证之一。

有了语法分析,我们再也不用关心各种变形了,编码的多样性对语法分析器来说,已经无关紧要。因为我们使用的是原生的语法分析器,无论如何变形,只要语法分析器可以通过,那么他就是一条有效的sql语句。

有人会问,你现在只是针对mysql的语法啊,其他的数据库,如MSsql,oracle等并不能愉快的工作。当然,你不能完全的借鉴mysql server的代码吧,至少需要你自己去做一些完善吧,把mysql不兼容的token加入其中,添加一些其他数据库的语法规则,这应该也属于一个关键点吧。至于如何去完善,可以看看各种的SQL语法手册,慢慢去公关。

如果我们拼接的sql语句,在词法分析中发现了7个关键字(Token),并且通过了语法分析,那么我们可以姑且可以粗略地认为这是一条有效的攻击数据。对于SQL注入的评定标准,那就是仁者见仁智者见智。对于如何去判断,哪些是真正的攻击,如何去除误报,还是一个长期优化的过程。

至此,一个完整的通过词法语法检测SQL注入的流程,已经跃然纸上。当然,如果要做成一个合格的产品,还有好多路要走。

后言

SQLChop采用的技术就是词法语法分析那一套,但是具体的实现方案,并不清楚,以上只是个人对于基于词法语法分析SQL注入的一些看法。

基于词法语法分析SQL注入检测,并不是什么新的技术,如何能做好,做到各种数据库都可以完美兼容,如何做到最大限度的减少误报,这个才是真正的技术难题。

同时,发现了SQLChop的Demo已经可以在github下载(https://github.com/chaitin/sqlchop),但是,检测引擎只提供了so动态链接库。

展望

词法语法分析的确是个好东西,既然用到了SQL注入了,那么下一届大会上,是不是就要有基于词法语法的XSS注入攻击检测与防御引擎了啊,这个在技术上,也是完全可以的啊~

同时,希望有更多的安全工具可以开源,独乐乐不如众乐乐~

参考资料

Google专利搜索:sql注入 语法

中国的各大安全厂商都蹦出来了,而且写的都很详细,内容也都大同小异

*本文作者:九如,本文属FreeBuf黑客与极客(FreeBuf.COM)原创奖励计划,未经许可禁止转载

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2015-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

关系型数据库是如何运作的(上)

一说到关系型数据库,我总感觉缺了点什么。如果你尝试透过“关系型数据库是如何运作的”的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的。难道说是由于它已经太...

22380
来自专栏张善友的专栏

微软在动态语言支持上超越了Java?

当.NET在2000/2001年第一次发布的时候,Java社区认为它仅仅是从语言以及标准库上对Java的一个“克隆”。我们把二者的简单实例代码进行比较以后就可以...

191100
来自专栏牛客网

今日头条2018春招安卓面经

一面: 协变 线程间通信?有几种同步/加锁方式? 进程间通信?答了三个只知道概念的和安卓的AIDL。 又问这“三个”中任选一个阐述原理 hashCode()方法...

36960
来自专栏不二小段

【爬虫与反爬】记一次网址编码研究

相爱相杀的爬虫与反爬工程师啊……愿你们和谐相处。 前些日子写爬虫时遇到一个比较奇怪的编码,是构造目标网址的一个组成部分,我更倾向于说是编码而不是加密,虽然的确有...

35180
来自专栏牛客网

阿里一面 京东一面+二面

38040
来自专栏牛客网

阿里前端一面

11540
来自专栏从流域到海域

《笨办法学python》 第14课手记

《笨办法学Python》 第14课手记 本节课将argv和raw_input和起来使用,作者在之前说,这个组合是个蛮顺手的用法。请注意,引入argv并使用arg...

246100
来自专栏Java架构

每个 JavaScript 工程师都应当知道的 10 个面试题以人为本1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?2. 什么是函数式编程?3. 类继承和原型继承有什么区别?

30860
来自专栏iOS开发日记

给我十个可爱的订阅的粉丝带来的一篇iOS面经。。。。

大大小小参加过不下30+公司的面试,其中不乏BAT、TMD等一线互联网公司,总结一下,发现大厂招聘都有一个共性。

490130
来自专栏青玉伏案

设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

在前段时间呢陆陆续续的更新了一系列关于重构的文章。在重构我们既有的代码时,往往会用到设计模式。在之前重构系列的博客中,我们在重构时用到了“工厂模式”、“策略模式...

22560

扫码关注云+社区

领取腾讯云代金券