面向RFID系统的SQL注入攻击检测和防御算法
0 引言
射频识别(Radio Frequency Identification,RFID)技术是一种标签技术[1],它能够自动识别不在视线内的实体,大大提高了自动化效率[2]。然而,RFID系统存在许多安全性问题,其中一个主要问题为SQL注入攻击(SQL Injection Attacks,SQLIA)[3,4],增加了RFID标签的潜在威胁[5]。因此,检测和防御RFID系统中SQLIA对RFID的应用至关重要。文献[6]提出了一种基于数据完整性策略的SQL攻击检测算法,通过运行监控确保产生的查询符合条件,一定程度上提高了安全性。然而,该算法期望存在原始SQL结构,需要人工干预建立所有组件,成本较高。
本文提出一种新的SQL注入攻击的检测和防御算法,利用数据完整性策略和意图符合条件、大小符合条件和标识符符合条件来检测和防御SQL注入攻击。实验结果表明了本算法的有效性及高效性。
1 SQL注入攻击问题
拥有RFID恶意软件检测和防御机制对于维护能RFID系统非常重要[7],本文中SQLIA问题如下[8]:
已知:动态产生SQL查询q和I=t1,t2,…,tn输入数据集;
问题:SQLIA检测问题是设计一种算法A,在下列约束下确定q是否为SQL注入攻击:
(a)I=t1,t2,…,tn输入数据集仅来源于RFID标签;
(b)中间件基于I=t1,t2,…,tn输入数据集生成q;
(c)q能执行企业数据库的数据插入、数据更新、数据删除和数据检索操作。
2 提出的SQLIA检测和防御算法
定义1(动态SQL查询):给定应用程序P和n条输入数据d1,d2,…,dn,通过映射RFID标签输入到常量查询字符串,P构建动态SQL查询q:
q←P(d1,d2,…,dn)(1)
部分查询静态配置于中间件中,而其他部分从输入参数导出。
定义2(恶意SQL):将利用源自RFID标签的输入d1,d2,…,dn数据形成的动态SQL查询q,若满足下列任意条件,则视为恶意SQL:
(1)意图符合:substr(qi)∈{substr(d1),…,substr(dm)}
(2)大小符合:M
(3)标识符符合:di.vki.v|v∈{op,artry,type,size}
意图符合条件确保正常SQL语句不能是用于产生动态查询的程序的输入字符串元素。大小符合条件确保输入数据的大小(F)不能大于标识符数据的大小(M)。标识符符合条件严格限制每个输入数据(如d1,d2,…,dm),使其遵守标识符的属性。
图1描述了提出的SQLIA检测和防御算法的整体结构,包含数据完整性策略、意图符合、大小符合和SQL符合部分。
2.1 数据完整性策略
SQLIA攻击依赖于不合法结构的数据成功输入,为了解决这一问题,使用数据完整性策略在数据库标识符值上定义一组约束,每个动态生成的SQL语句包含一组标识符:
I=〈k1〈P〉,…,kn〈P〉〉(2)
每个标识符ki∈I有一组属性ki〈P〉=〈p1,…,pn〉,例如数据类型和数据位允许的最大尺寸。
这种策略用以确保数据为强类型、语法正确、在长度边界内、仅包含允许的字符、正确签名数字且数字在范围边界内。策略对每个标识符使用一组数据完整性规则,通过验证每个标识符声明的属性来定义这些输入数据完整性规则。
图2为使用巴科斯范式表示系统标识符的约束,“op”性质规定“创建、读、更新、删除”中的哪些操作允许在标识符上执行。SQL编程中,4个基本函数(创建、读、更新、删除)对应于INSERT、SELECT、UPDATE(SET)和DELETE[9]。类型性质规定无论它们持有什么,都将视为字符串或数值,而不是任意代码。大小性质规定可存储的数字或字符的最大数量。
2.2 SQL注入攻击检测和防御
本文算法使用有关SQL语法知识的架构和策略检测一个查询是否为SQLIA,如算法1所示。算法的输入为动态产生的SQL语句、从RFID标签获得的数据集D={d1,d2,…,dm}和用于程序P生成SQL的输入参数集S={t1,t2,…,tn}。
在运行过程中,当由中间件产生的SQL查询的语法结构与RFID应用程序开发者所设定的SQL语法结构不同时,SQL注入攻击发生。将SQL语句写成查询集Q={q1,q2,…,qn},使用分号“;”和注释“—”作为代码内多个查询的分隔符,然后处理每个查询qi∈Q(一次一个),若任一查询qi∈Q不遵守意图符合条件、大小符合条件和标识符符合条件,则拒绝该SQL语句。
算法1:SQLIA检测算法
1.输入: SQL,D={d1,d2,…,dm},S={t1,t2,…,tn}
2.BEGIN
3. Q←SQL中查询集
4. FOREACH qi∈Q DO
5.计算M和F
6.IF(M≥F)∧(qiD)THEN
7. I←qi中标识符集
8. IC=IdentifierConformity(I,D,S)
9. IF (IC==FALSE) THEN
10.REJECT;EXIT
11.ENDIF
12. ENDIF
13.ENDFOR
14.END
2.2.1 大小符合
期望和实际输入数据的大小能够表示纯净SQL语法和受污染SQL语法之间的差异,每个动态生成的SQL语句包括一组标识符I=k1,…,kn,每个标识符ki∈I有一组属性P=p1,…,pn,其中一个为允许标识符持有的数据最大尺寸。该算法计算输入字符串的总大小(即d1,d2,…,d|D|)和标识符允许的总数据大小(即k1,k2,…,k|I|),如下:
若实际输入和期望输入不匹配或存在空数据输入时,设置F=0。对于满足大小符合约束的查询qi∈Q,输入数据的总和不能超过设计时定义的参数总大小。
2.2.2 意图符合
将SQL语句划分为一组独立SQL语句Q={q1,q2,…,qn},对于每个查询qi∈Q,算法检查是否符合下列意图符合条件:
式(5)规定qi∈Q不能为输入字符串的元素,若查询qi∈Q不符合意图符合条件,则拒绝原始SQL语句。
2.2.3 标识符符合
算法2描述了针对每个查询qi∈Q执行的标识符符合算法的伪代码,算法的输入为RFID标签数据集D={d1,d2,…,dm}、例如保留关键字和操作符的非文本标记集R={t1,t2,…,tn}和标识符集I={k1,k2,…,kn}。
强制执行下列两个数据完整性验证规则:
(1)如果D={d1,d2,…,dm}和R={t1,t2,…,tn}的交集非空,则认为输入数据受到污染,拒绝SQL语句。
(2)对于每个ki∈I,检查下列操作和类型完整性条件:
Operation integrity:(di.op≠ki.op)∧(di.artry≠ki.artry)
(6)
Type integrity(di.type≠ki.type)∧(di.size≠ki.size)(7)
若不满足上述两个条件任一条,则拒绝SQL语句。
算法2:标识符符合检测算法
1.输入:D,I,R
2.输出: clean=True
3.BEGIN
4. IF(R∩D)THEN
5.clean=False;EXIT
6. ENDIF
7. FOR 每个标识符 ki∈I DO
8.IF(di.op≠ki.op)∧(di.artry≠ki.artry)THEN
9. clean=False;EXIT
10.ELSEIF(ki∈I≠table)THEN
11. IF((di.type≠ki.type)∧(di.size≠ki.size))THEN
12.clean=False;EXIT
13. ENDIF
14.ENDIF
15. ENDFOR
16.END算法
3 实验结果与分析
3.1 实验环境
为了评估提出的SQLIA检测和防御算法的性能,构建模块化测试平台,如图3所示。
实验使用的RFID系统是UHF RFID阅读器和SkyeTek、Intermec公司的两类标签。本文创建了三个虚拟克隆RFID标签,用来发送各种类型SQLIA。中间件运行在笔记本电脑上,使用MySQL数据库,中间件通过MySQLC API连接到数据库。
实验测试了可能在RFID系统中动态生成的各类SQL查询(例如SELECT、UPDATE、INSERT),通过克隆标签和合法标签产生的700个SQL注入攻击和1 300个合法请求,组成大约2 000个查询来测试提出的算法。其中,SQL注入攻击包含一些攻击类型(如重言式、联合查询、后置贪心查询等)。
3.2 SQLIA检测结果
实验运行2 000个查询,共有700种恶意查询,包括280个SELECT类查询、251个UPDATE类查询和169个INSERT类查询,恶意查询的比例可从5%至35%之间变化。
图4描述了在存在不同比例恶意查询情况下,接受和拒绝查询的百分比。结果表明,由于所有恶意查询至少不满足意图符合、大小符合、标识符符合条件之一,采用三个条件连同数据完整性策略能够有效的遏制SQLIA,同时很好地保证了合法查询。
当查询不符合意图符合、大小符合、标识符符合条件之一时,算法就会跳过其他过滤条件,直接判断为恶意查询,从而大大降低了算法开销,提高了性能。
3.3 比较及分析
3.3.1 耗时比较
在互联网上选取一个存在SQL注入漏洞的网页,将本文算法与基于节点序列的比对算法[4]、快速比对算法[6]进行比较,处理100到10 000个查询,运行200次,取各个算法查询时间的平均值,如表1所示。
从表1可看出,本文算法消耗时间仅为节点序列比对算法的29.7%,仅为快速比对算法的76.0%,体现了本文算法的高效率。结果表明,本文算法对系统的额外开销很少,因为本文算法使用简单字符串比较。
3.3.2 检测性能比较
将本文算法在攻击检测系统中的有效性与当前常用的两款检测工具BSQL Hacker[9]和Pangolin[10]进行比较,分别对测试样本进行检测。首先通过表2的关键语句在Google中搜索出一定的URL以构建测试样本集,然后对获取的URL测试样本进行SQL攻击检测,根据对获取的URL添加不同的注入命令的返回页面与正常页面的异同来判定URL是否存在攻击。判定后,采取措施进行攻击防御,检测结果如表3所示。
从表3可看出,本文工具的消耗时间略多于其他两种攻击,但检测到的URL总数明显最多,且检测率分别比BSQL Hacker和Pangolin高13.8%和20.6%,表明本文算法能够保证正常查询,可有效检测和防御SQL注入攻击。
4 结束语
本文提出一种能够准确检测并防御RFID系统中的SQL注入攻击算法,利用数据完整性策略来防御SQLIA攻击。通过检测查询是否符合意图符合条件、大小符合条件和标识符符合条件来检测SQL注入攻击。本文算法成功阻止了所有攻击,并保证了所有合法的查询。相比现有的检测算法和检测工具,本文算法简单有效,具有程序计算开销低、检测率高等优点。