快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

教你利用SNORT规则防御SQL注入(2)


/(\%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)|<)+((\%25)|(%)|(\?)|(\%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)|<)+((\%25)|(%)|(\?)|(\%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 1<>1  a=a a’=’a a<>a a’<>’a  
这些明显冗余或歧意的字符用于 SQL 注入攻击中的攻击串的构造,主要和 or/and/union 联合使用来造成恶意 SQL 语句等。在网页脚本中,这种字符串一般用于平稳避过正常 SQL 语句,从而使得恶意构造的 SQL 语句得以执行,此类敏感字符串在常用 SQL 注入攻击工具中也是常见手段,属于通用的普遍的攻击特征。  
   
检测要点:  
1)  过滤上述的危险字符;  
2)  由于该内容是使用表单提交或者 URL 提交,考察 HTTP 协议,故关联 TCP 流中的关键字 ? 和 = ;  
3)  降低误报和漏报,优化检测效率。 1 = 1 , 1 = 2 ,类似的也可一构造 1 = 3 , 1<>4 等其他串。但是前者具有普遍性,在攻击手法和实际工具中最这类写法最常见,这里综合考虑,考虑到普遍性,对这类问题检测 1 = 1 , 1<>1 , 1 = 2 , 1<>2,a=a, a<>a 。  
   
规则设计:  
正则表达式为: /([=]+)(1=1)|(1’=’1)|(1=2)|(1<>1)|(a<>a)/ix  
由于在实际脚本程序中,有需要‘号引起 SQL 语句的闭合的情况,故规则中增加检测‘号和数字字母的组合。修正后的表达式为: /([=]+)(1=1)|(1’=’1)|(1=2)|(1<>1)|(a<>a) |(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)|(1<>1)|(a<>a) |(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 1<>1 ‘#,发现,首先具有参数的 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)|(1<>1)|(a<>a)/ix  
由于在实际脚本程序中,有需要‘号引起 SQL 语句的闭合的情况,故规则中增加检测‘号和数字字母的组合。修正后的表达式为: /([=]+)(1=1)|(1’=’1)|(1=2)|(1<>1)|(a<>a) |(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 标签如 <b>( 粗体 ),<i>( 斜体 ) 或 <u>( 下划线 ) ,或者他可能尝试简单的 script 标签如 <script>alert("OK")</script>. 因为大多数出版物和网络传播的检测网站是否有 css 漏洞都拿这个作为例子。这些尝试都可以很简单的被检测出来。然而,高明点的攻击者可能用它的 hex 值替换整个字符串。这样 <script> 标签会以 %3C%73%63%72%69%70%74%3E 出现。另一方面,攻击者可能使用 web 代理服务器像 Achilles 会自动转换一些特殊字符如 < 换成 %3C 、 > 换成 %3E. 这样攻击发生时, URL 中通常以 hex 等值代替角括号。  
   
下列正则表达式将检测任何文本中包含的 html 的 < 、 > 。它将捉住试图使用 < b> 、 <u> 、或 <script> 。这正则表达式应该忽略大小写。我们需要同时检测角括号和它的 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;)  
   
<img src" CSS 攻击正则表达式 :  
/((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/I  
解释 :  
(\%3 C)|<) -< 或它的 hex 等值  
(\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47) -’img’ 字母或它的大小写 hex 等值的变化组合  
[^\n]+ - 除了换行符以外的任何跟随 <img 的字符  
(\%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)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/I ";nocase; sid:10144; rev:1;)  
   
4 .规则设计试验环境  
snort2.3.2(windows)+IE6.0 + WEB 服务器  
pcre 6.4 for windows

       www..com     (责任编辑   Teng)

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论