免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4468 | 回复: 0
打印 上一主题 下一主题

撰写一组SNORT规则防御SQL注入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-03 00:20 |只看该作者 |倒序浏览

撰写一组SNORT规则防御SQL注入
tomqq 1/23/2006

1.文档概述
本文档详细阐述了SQL注入规则集合的设计过程和理论依据,并对每一类规则的检测原理和修正过程进行了相关的分析。

2.规则部署要求
     适用于包含SNORT 2.3及以上版本检测引擎。

3.规则详细设计
3.1.  对select+union+select利用的检测
SELECT+union用于利用现有脚本的SQL语句,对数据库其他表进行窥探和暴表。攻击的原理是:首先利用歧义SQL(or 11之类)安全避过脚本中原有的SQL,然后利用UNION+SQLECT构造第二段SQL。构造的难度在于猜测需要窥探表的字段个数和类型。当个数和类型都符合的的时候,一般可以在正常页面实现暴表。因为系统表一般存有非常重要的信息,所以这种攻击一旦成功,基本可以认为系统安全已经崩溃。考察正常的探测情况,攻击者一般构造形如
http://127.0.0.1/rule_manage_system/code/edit_rule.php?sid=1430%20and%2011%20%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21%20from%20admin的URL
,这种攻击利用,空格+union是都有的特征;其次,2次SQL语句中的select,最后是2次sql末尾的from。另外?号和=号也是必不可少的特征。在URL中按照先后次序应该是:?=   union select,基本可以认定为SQL注入攻击。

规则设计:
首先正则表达式为:
/(\%3D|=)+((\S|\s))+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%6F)|o|O|(\%4F))((\%6E)|n|n|(\%4E))((%20)|(\w+)|\S|\s)+((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%63)|c|C|(\%43))((\%74)|t|T|(\%54))/ix
解释:
\w - 零个或多个字符或者下划线。
正则表达式首先检测是否有URL的=号,这是有参数URL的首要特征;其次检测=号后有没有UNION的大写、小写或者16进制代码的组合;随后,检测UNION1个或多个其他字符;最后检测UNION后的URL中是否含有SELECT的大写、小写或者16进制代码的组合;这种关键字的检测组合,是任何UNION+SELECT借用的最基本特征。
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?修正后的完整规则是:
1)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+((\S|\s))+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%6F)|o|O|(\%4F))((\%6E)|n|n|(\%4E))((%20)|(\w+)|\S|\s)+((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%63)|c|C|(\%43))((\%74)|t|T|(\%54))/ix";nocase; sid:10114; rev:1;)
         
         3.2.  对select+load_file()利用的检测
SELECT+LOAD_FILE用于利用现有脚本的SQL语句,对系统重要文件窥探和暴露。攻击的原理是:首先利用歧义SQL(or 11之类)安全避过脚本中原有的SQL,然后利用UNION+LOADFILE()构造第二段SQL。构造的难度在于猜测需要窥探表的字段个数和类型。当个数和类型都符合的的时候,一般可以在正常页面实现重要文件的暴露。这种攻击一旦成功,后果相当严重。考察正常的探测情况,攻击者一般构造形如
1%20%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,LOAD_FILE('/home/hek/1.txt'),17,18,19,20,21%20from%20admin%23''">http://127.0.0.1/rule_manage_system/code/edit_rule.php?sid=1430%20and%2011%20%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,LOAD_FILE('/home/hek/1.txt'),17,18,19,20,21%20from%20admin%23
,考察这种攻击利用,必不可少的特征,首先是UNION,其次是2次SQL语句中的LOAD_FILE(),另外?号和=号也是必不可少的特征。在URL中按照先后次序出现如下这类字符,基本可以认定为SQL注入攻击。由此,构造正则表达式。

规则设计:
正则表达式为:
/(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%6F)|o|O|(\%4F))((\%6E)|n|n|(\%4E))(\S|\s)+((\%6c)|l|L|(\%4c))((\%6F)|o|O|(\%4F))((\%61)|a|A|(\%41))((\%64)|d|D|(\%44))((\%5F)|(_))((\%66)|f|F|(\%46)) ((\%69)|i|I|(\%49)) ((\%6c)|l|L|(\%4c)) ((\%65)|e|E|(\%45)) ((\%28)|()/ix
解释:
\w - 零个或多个字符或者下划线。
正则表达式首先检测是否有URL的=号,这是有参数URL的首要特征;其次检测=号后有没有UNION的大写、小写或者16进制代码的组合;随后,检测UNION1个或多个其他字符;最后检测UNION后的URL中是否含有LOAD_FILE()的大写、小写或者16进制代码的组合;这种关键字的检测组合,是任何UNION+LOAD_FILE()借用的最基本特征。
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?修正后的完整规则是:
2)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%6F)|o|O|(\%4F))((\%6E)|n|n|(\%4E))(\S|\s)+((\%6c)|l|L|(\%4c))((\%6F)|o|O|(\%4F))((\%61)|a|A|(\%41))((\%64)|d|D|(\%44))((\%5F)|(_))((\%66)|f|F|(\%46)) ((\%69)|i|I|(\%49)) ((\%6c)|l|L|(\%4c)) ((\%65)|e|E|(\%45)) ((\%28)|()/ix ";nocase; sid:10115; rev:1;)

          3.3.  对LODE DATE INFILE利用的检测
语法:
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
INTO TABLE tbl_name
LOAD DATA INFILE 语句从一个文本文件中以很高的速度读入一个表中。
因为这个语句一般情况下不能在浏览器里直接输入,所以作用不是很大,在本规则集不予检测。
      
      3.4.  对暴力猜解密码类利用的检测
这类利用的主要原理是:利用字符类函数,将设定的字符与系统表中的字段值进行一位一位的比较,如果比较成功,页面将会显示正常,由此判断为猜解成功;依此类推,直到猜出所有值。可以用不同的组合来猜解字段长度或者值。按照不同的数据库系统,此类函数主要有:min(), length(), ASCII(), char() ,str(), ASC(), substr(), Unicode(), asc(), chr(), nchar(), substring(), abc(), abs()。攻击方式举例:
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20ascii(mid(username,1,1))=97
)
       考察这种典型攻击,首先URL中含有?号和=号;其次,含有此类函数之一;最后,
一般情况下函数后会含有=号,单经过实际试验并非必须,应此抽象出检测要点:1)检测=和?;2)检测特征函数。为了减少误报,一并检测函数的左括号;
规则设计:
正则表达式为:
/(\%3D|=)+(\S|\s)+((\%6D)|m|M|(\%4D))((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%28)|\() /ix
其他的依此类推,最后得到所有正则表达:
min() :       /(\%3D|=)+(\S|\s)+((\%6D)|m|M|(\%4D))((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%28)|\() /ix

length():   /(\%3D|=)+(\S|\s)+((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%6E)|n|N|(\%4E))((\%67)|g|G|(\%57)) ((\%74)|t|T|(\%54)) ((\%68)|h|H|(\%48)) ((\%28)|\() /ix

ASCII():       /(\%3D|=)+(\S|\s)+((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%6E)|n|N|(\%4E))((\%67)|g|G|(\%57)) ((\%74)|t|T|(\%54)) ((\%68)|h|H|(\%48)) ((\%28)|\() /ix

Char():         /(\%3D|=)+(\S|\s)+((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%61)|a|A|(\%41))((\%72)|r|R|(\%52)) ((\%28)|\() /ix

str():   /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%74)|t|T|(\%54))((\%72)|r|R|(\%52)) ((\%28)|\() /ix

ASCII():       /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%73)|s|S|(\%53))((\%63)|c|C|(\%43))((\%69)|i|I|(\%49)) ((\%69)|i|I|(\%49)) ((\%28)|\() /ix

substr():       /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%75)|u|U|(\%55))((\%62)|b|B|(\%42)) ((\%73)|s|S|(\%53))((\%74)|t|T|(\%54))((\%72)|r|R|(\%52)) ((\%28)|\() /ix

unicode():     /(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%63)|c|C|(\%43)) ((\%6F)|o|O|(\%4F)) ((\%64)|d|D|(\%44)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix
asc():   /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%73)|s|S|(\%53))((\%63)|c|C|(\%43)) ((\%28)|\() /ix
chr():          /(\%3D|=)+(\S|\s)+((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%72)|r|R|(\%52)) ((\%28)|\() /ix

nchar():        /(\%3D|=)+(\S|\s)+((\%6E)|n|N|(\%4E))((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%61)|a|A|(\%41)) ((\%72)|r|R|(\%52)) ((\%28)|\() /ix

substring():            /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%75)|u|U|(\%55))((\%62)|b|B|(\%42))((\%73)|s|S|(\%53)) ((\%74)|t|T|(\%54)) ((\%72)|r|R|(\%52)) ((\%69)|i|I|(\%49)) ((\%6E)|n|N|(\%4E)) ((\%67)|g|G|(\%47)) ((\%28)|\() /ix

abc():            /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%62)|b|B|(\%42))((\%63)|c|C|(\%43)) ((\%28)|\() /ix

abs():            /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%62)|b|B|(\%42))((\%73)|s|S|(\%53)) ((\%28)|\() /ix

测试修正后的完整规则是:
3)     alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%6D)|m|M|(\%4D))((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%28)|\() /ix
";nocase; sid:10116; rev:1;)

4)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%6E)|n|N|(\%4E))((\%67)|g|G|(\%57)) ((\%74)|t|T|(\%54)) ((\%68)|h|H|(\%48)) ((\%28)|\() /ix
";nocase; sid:10117; rev:1;)

5)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45))((\%6E)|n|N|(\%4E))((\%67)|g|G|(\%57)) ((\%74)|t|T|(\%54)) ((\%68)|h|H|(\%48)) ((\%28)|\() /ix
";nocase; sid:10118; rev:1;)

6)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%61)|a|A|(\%41))((\%72)|r|R|(\%52)) ((\%28)|\() /ix
";nocase; sid:10119; rev:1;)

7)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%74)|t|T|(\%54))((\%72)|r|R|(\%52)) ((\%28)|\() /ix
";nocase; sid:10120; rev:1;)

8)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%73)|s|S|(\%53))((\%63)|c|C|(\%43))((\%69)|i|I|(\%49)) ((\%69)|i|I|(\%49)) ((\%28)|\() /ix
";nocase; sid:10121; rev:1;)

9)      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%75)|u|U|(\%55))((\%62)|b|B|(\%42)) ((\%73)|s|S|(\%53))((\%74)|t|T|(\%54))((\%72)|r|R|(\%52)) ((\%28)|\() /ix
";nocase; sid:10122; rev:1;)

10)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%6E)|n|N|(\%4E))((\%69)|i|I|(\%49))((\%63)|c|C|(\%43)) ((\%6F)|o|O|(\%4F)) ((\%64)|d|D|(\%44)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix
";nocase; sid:10123; rev:1;)

11     alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%73)|s|S|(\%53))((\%63)|c|C|(\%43)) ((\%28)|\() /ix
";nocase; sid:10124; rev:1;)

12)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%72)|r|R|(\%52)) ((\%28)|\() /ix
";nocase; sid:10125; rev:1;)

13)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%6E)|n|N|(\%4E))((\%63)|c|C|(\%43))((\%68)|h|H|(\%48))((\%61)|a|A|(\%41)) ((\%72)|r|R|(\%52)) ((\%28)|\() /ix
";nocase; sid:10126; rev:1;)

14)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%73)|s|S|(\%53))((\%75)|u|U|(\%55))((\%62)|b|B|(\%42))((\%73)|s|S|(\%53)) ((\%74)|t|T|(\%54)) ((\%72)|r|R|(\%52)) ((\%69)|i|I|(\%49)) ((\%6E)|n|N|(\%4E)) ((\%67)|g|G|(\%47)) ((\%28)|\() /ix
";nocase; sid:10127; rev:1;)

15)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%62)|b|B|(\%42))((\%63)|c|C|(\%43)) ((\%28)|\() /ix
";nocase; sid:10128; rev:1;)

16)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%61)|a|A|(\%41))((\%62)|b|B|(\%42))((\%73)|s|S|(\%53)) ((\%28)|\() /ix
        ";nocase; sid:10129; rev:1;)

          3.5.  对常用利用函数的检测
部分数据库系统函数,常用于注入攻击的综合利用,具体利用原理前面都有叙述。这些常见的函数是drop table,       truncate,  between and,  net use,   user>0,   user   user_name(),  db_name(),     insert into

规则设计:
drop table: 攻击者利用该命令恶意毁坏数据库。
/(\%3D|=)+(\S|\s)+((\%64)|d|D|(\%44))((\%72)|r|R|(\%52))((\%6F)|o|O|(\%4F))((\%70)|p|P|(\%50))(\S+|\s+)((\%74)|t|T|(\%54))((\%61)|a|A|(\%61))((\%62)|b|B|(\%42))((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45)) /ix

:
/(\%3D|=)+(\S|\s)+((\%74)|t|T|(\%54))((\%72)|r|R|(\%52))((\%75)|u|U|(\%55))((\%6E)|c|C|(\%4E)) ((\%63)|c|C|(\%43))((\%61)|a|A|(\%61))((\%74)|t|T|(\%54))((\%66)|e|E|(\%45)) /ix

between and:
/(\%3D|=)+(\S|\s)+((\%62)|b|B|(\%42))((\%65)|e|E|(\%45))((\%74)|t|T|(\%54))((\%77)|w|W|(\%57))((\%65)|e|E|(\%65))((\%65)|e|E|(\%65))((\%6E)|n|N|(\%4E))(\S|\s)+((\%61)|a|A|(\%41))((\%6E)|n|N|(\%4E))((\%64)|d|D|(\%44))/ix

net use:
/(\%3D|=)+(\S|\s)+((\%6E)|n|N|(\%6e))((\%65)|e|E|(\%45))((\%74)|t|T|(\%54)) (\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))/ix

exec():
/(\%3D|=)+(\S|\s)+((\%65)|e|E|(\%45))((\%78)|x|X|(\%58))((\%65)|e|E|(\%45)) ((\%63)|c|C|(\%43)) ((\%28)|\() /ix

user>0|这是专用于对SQLSERVER取得数据库用户名的有效地攻击手段。
/(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45)) ((\%72)|r|R|(\%52)) ((\%3E)|>|3C)) (0) /ix

user_name():
/(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%72)|r|R|(\%52)) ((\%5F)| (_)) ((\%6E)|n|N|(\%4E)) ((\%61)|a|A|(\%41)) ((\%6D)|m|M|(\%4D)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix

db_name():
/(\%3D|=)+(\S|\s)+((\%64)|d|D|(\%44))((\%62)|b|B|(\%42)) ((\%5F)| (_)) ((\%6E)|n|N|(\%4E)) ((\%61)|a|A|(\%41)) ((\%6D)|m|M|(\%4D)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix

insert into +
/(\%3D|=)+(\S|\s)+((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%72)|r|R|(\%52))((\%74)|t|T|(\%54))(\S|\s)+((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%74)|t|T|(\%54))((\%6F)|o|O|(\%4F))(\S|\s)+((\%3c)|3f))+/ix

修正后完整的规则如下:
17) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%64)|d|D|(\%44))((\%72)|r|R|(\%52))((\%6F)|o|O|(\%4F))((\%70)|p|P|(\%50))(\S+|\s+)((\%74)|t|T|(\%54))((\%61)|a|A|(\%61))((\%62)|b|B|(\%42))((\%6C)|l|L|(\%4C))((\%65)|e|E|(\%45)) /ix
";nocase; sid:10130; rev:1;)

18)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%74)|t|T|(\%54))((\%72)|r|R|(\%52))((\%75)|u|U|(\%55))((\%6E)|c|C|(\%4E)) ((\%63)|c|C|(\%43))((\%61)|a|A|(\%61))((\%74)|t|T|(\%54))((\%66)|e|E|(\%45)) /ix ";nocase; sid:10131; rev:1;)

19)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%62)|b|B|(\%42))((\%65)|e|E|(\%45))((\%74)|t|T|(\%54))((\%77)|w|W|(\%57))((\%65)|e|E|(\%65))((\%65)|e|E|(\%65))((\%6E)|n|N|(\%4E))(\S|\s)+((\%61)|a|A|(\%41))((\%6E)|n|N|(\%4E))((\%64)|d|D|(\%44))/ix ";nocase; sid:10132; rev:1;)

20) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%6E)|n|N|(\%6e))((\%65)|e|E|(\%45))((\%74)|t|T|(\%54)) (\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))/ix ";nocase; sid:10133; rev:1;)

21) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%65)|e|E|(\%45))((\%78)|x|X|(\%58))((\%65)|e|E|(\%45)) ((\%63)|c|C|(\%43)) ((\%28)|\() /ix
";nocase; sid:10134; rev:1;)

22)alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45)) ((\%72)|r|R|(\%52)) ((\%3E)|>|3C)) (0) /ix
";nocase; sid:10135; rev:1;)

23) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%75)|u|U|(\%55))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%72)|r|R|(\%52)) ((\%5F)| (_)) ((\%6E)|n|N|(\%4E)) ((\%61)|a|A|(\%41)) ((\%6D)|m|M|(\%4D)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix
";nocase; sid:10136; rev:1;)

24) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%64)|d|D|(\%44))((\%62)|b|B|(\%42)) ((\%5F)| (_)) ((\%6E)|n|N|(\%4E)) ((\%61)|a|A|(\%41)) ((\%6D)|m|M|(\%4D)) ((\%65)|e|E|(\%45)) ((\%28)|\() /ix
";nocase; sid:10137; rev:1;)

25) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /(\%3D|=)+(\S|\s)+((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%73)|s|S|(\%53))((\%65)|e|E|(\%45))((\%72)|r|R|(\%52))((\%74)|t|T|(\%54))(\S|\s)+((\%69)|i|I|(\%49))((\%6E)|n|N|(\%4E))((\%74)|t|T|(\%54))((\%6F)|o|O|(\%4F))(\S|\s)+((\%3c)|3f))+/ix
";nocase; sid:10138; rev:1;)

       3.6.  检测危险字符‘    “   ;    : ―― #(删除此条sid:10170)
主要危害:
这些字符用于SQL注入攻击中的攻击串的构造,如:造成SQL语句闭合、添加恶意语句等等。例如在登陆权限绕过注入攻击中,相关验证代码通常为为:$exec="select * from user where usr='".$_POST['usr']."' and psw='".$_POST['psw']."'"; 攻击者通常使用‘号或者“号来闭合SQL语句,如提交类似请求:usr=’admin’, psw=’ 1' or 1=1 order by id#’ 后,程序内部执行语句变为:select * from user where usr='admin' and psw='1' or 1=1 order by id#',#号为mysql忽略后续语句的标记,成功造成内部SQL语句的闭合,绕过登陆成功。对于不同的攻击情况,这些字符用于不同的数据库、脚本闭合、攻击串构造,属于通用的普遍的但是攻击又不可缺少特征。

检测要点:
1)  过滤上述的危险字符‘   “      # ――  ;   
2)  由于该内容是使用表单提交或者URL提交,考察HTTP协议,故关联TCP流中的关键字 ? 和 = ;

规则设计:
正则表达式为:/((')|(%27))|((")|(%22))|((\#)|(%23))|((--)|(%2d%2d))/ix,即:检测‘号或者等值的16进制编码 | 检测”号或者等值的16进制编码 | 检测#号或者等值的16进制编码 | 检测--号或者等值的16进制编码
由于“号在实际脚本程序中,无法单独引起SQL语句的闭合,故规则中忽略该项;在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?和=;另外在实际应用中发现,合法的HTTP协议流中也可能含有;号,为了避免误报,增加检测条件,即在URL中,=号后再来检测分号,即:
26)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; uricontent:”?”;pcre:" /((')|(%27))|((")|(%22))|((\#)|(%23))|((--)|(%2d%2d))/ix ";nocase; sid:10139; rev:1;)

       3.7.  过滤危险字符1=1   1’=’1  1=2    1’=’2 11  a=a a’=’a aa a’’a
这些明显冗余或歧意的字符用于SQL注入攻击中的攻击串的构造,主要和or/and/union联合使用来造成恶意SQL语句等。在网页脚本中,这种字符串一般用于平稳避过正常SQL语句,从而使得恶意构造的SQL语句得以执行,此类敏感字符串在常用SQL注入攻击工具中也是常见手段,属于通用的普遍的攻击特征。

检测要点:
1)  过滤上述的危险字符;
2)  由于该内容是使用表单提交或者URL提交,考察HTTP协议,故关联TCP流中的关键字 ? 和 = ;
3)  降低误报和漏报,优化检测效率。1=1,1=2,类似的也可一构造1=3,14等其他串。但是前者具有普遍性,在攻击手法和实际工具中最这类写法最常见,这里综合考虑,考虑到普遍性,对这类问题检测1=1,11,1=2,12,a=a, aa。

规则设计:
正则表达式为:/([=]+)(1=1)|(1'='1)|(1=2)|(11)|(aa)/ix
由于在实际脚本程序中,有需要‘号引起SQL语句的闭合的情况,故规则中增加检测‘号和数字字母的组合。修正后的表达式为:/([=]+)(1=1)|(1'='1)|(1=2)|(11)|(aa) |(a=a) (1’=’2)|(1’’1)|(a’’a) |(a’’a) /ix
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?和=,即:
27)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /([=]+)(1=1)|(1'='1)|(1=2)|(11)|(aa) |(a=a) (1’=’2)|(1’’1)|(a’’a) |(a’’a) /ix ";nocase; sid:10140; rev:1;)

       3.8.  对OR利用的检测(删除此条sid:10172)
OR可以用于构造对脚本原有SQL语句的平稳规避,比如绕过登陆攻击、猜测表名字段名、和其他关键字联合使用等。考察攻击特征,如例串,
http://www.www.www/xxx.xxx?id=xxx
or 11‘#,发现,首先具有参数的URL,具有特征一个是脚本后的?号,另一个是=号,另一个是’号,另一个是OR,这是OR利用的基本特征和检测要点。

规则设计:
首先正则表达式为:/([=]+)\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
解释:
\w* - 零个或多个字符或者下划线。
(\%27)|\' - 单引号或它的hex等值。
(\%6 F)|o|(\%4 F))((\%72)|r|-(\%52) -‘or’的大小写以及它的hex等值。/([=]+)(1=1)|(1'='1)|(1=2)|(11)|(aa)/ix
由于在实际脚本程序中,有需要‘号引起SQL语句的闭合的情况,故规则中增加检测‘号和数字字母的组合。修正后的表达式为:/([=]+)(1=1)|(1'='1)|(1=2)|(11)|(aa) |(a=a) (1’=’2)|(1’’1)|(a’’a) |(a’’a) /ix
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?和=,即:
28)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /([=]+)\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix ";nocase; sid:10141; rev:1;)

3.9.  对扩展存储过程利用的检测
EXEC()调用系统存储过程,同样可以实现注入。

规则设计:
首先正则表达式为:  /exec(\s|\+)+(s|x)p\w+/ix
解释:
exec - 请求执行储存或扩展储存过程的关键字
(\s|\+)+ - 一个或多个的空白或它们的http等值编码
(s|x) p- ‘sp’或‘xp'字母用来辨认储存或扩展储存过程
\w+ - 一个或多个字符或下划线来匹配过程的名称解释:
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?,即:
29)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /exec(\s|\+)+(s|x)p\w+/ix ";nocase; sid:10142; rev:1;)

3.10.      对跨站脚本攻击的检测
当发动CSS攻击或检测一个网站漏洞的时候, 攻击者可能首先使简单的HTML标签如(粗体),(斜体)或(下划线),或者他可能尝试简单的 script标签如alert("OK"). 因为大多数出版物和网络传播的检测网站是否有css漏洞都拿这个作为例子。这些尝试都可以很简单的被检测出来。然而,高明点的攻击者可能用它的hex值替换整个字符串。这样标签会以%3C%73%63%72%69%70%74%3E出现。另一方面,攻击者可能使用web代理服务器像Achilles会自动转换一些特殊字符如换成%3C、>换成%3E.这样攻击发生时,URL 中通常以hex等值代替角括号。

下列正则表达式将检测任何文本中包含的html的、>。它将捉住试图使用、、或。这正则表达式应该忽略大小写。我们需要同时检测角括号和它的hex等值(% 3C|。检测hex进制转化的整个字符串,我们必须检测用户输入的数字和%号,即使用[a-z0-9%] 。这可能会导致一些错误出现,不是大部分会检测到真实攻击的。

规则设计:
一般 CSS 攻击的正则表达式:
/((\%3C)|2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix

解释:
((\%3C)|-检查和它hex等值
((\%2F)|\/)*-结束标签/或它的 hex等值
[a-z0-9\%]+ -检查标签里的字母或它hex等值
((\%3E)|>) -检查>或它的hex等值
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?,即:
30)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /((\%3C)|2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix ";nocase; sid:10143; rev:1;)

攻击正则表达式:
/((\%3C)|)/I
解释:
(\%3 C)|或它的hex等值
(\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47) -'img'字母或它的大小写hex等值的变化组合
[^\n]+ -除了换行符以外的任何跟随的字符
(\%3E)|>) ->或它的hex等值
在URL中参数提交一般为xxx.asp?a=xxx,为了提高效率和准确率,故而在规则中增加检测?,即:
31)    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"检测到SQL注入攻击特征字符"; flow:to_server,established;uricontent:"?"; pcre:" /((\%3C)|)/I";nocase; sid:10144; rev:1;)

4.规则设计试验环境
snort2.3.2(windows)+IE6.0+WEB服务器
pcre 6.4 for windows


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68043/showart_657863.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP