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

-回复 -浏览
楼主 2018-07-15 09:41:01
举报 只看此人 收藏本贴 楼主

微信号freebuf

周末了,又到了一星期中的美好时刻,因为期待,因为渲染在时光中的慵散。本周,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)原创奖励计划,未经许可禁止转载


我要推荐
转发到