快捷搜索:   nginx

撰写一组SNORT规则防御SQL注入

1 .文档概述  
本文档详细阐述了 SQL 注入规则集合的设计过程和理论依据,并对每一类规则的检测原理和修正过程进行了相关的分析。  
2 .规则部署要求  
     适用于包含 SNORT 2.3 及以上版本检测引擎 。  
  
3 .规则详细设计  
  3.1.   对 select+union+select 利用的检测  
SELECT+union 用于利用现有脚本的 SQL 语句,对数据库其他表进行窥探和暴表。攻击的原理是:首先利用歧义 SQL ( or 1<>1 之类)安全避过脚本中原有的 SQL ,然后利用 UNION+SQLECT 构造第二段 SQL 。构造的难度在于猜测需要窥探表的字段个数和类型。当个数和类型都符合的的时候,一般可以在正常页面实现暴表。因为系统表一般存有非常重要的信息,所以这种攻击一旦成功,基本可以认为系统安全已经崩溃。考察正常的探测情况,攻击者一般构造形如 http://127.0.0.1/rule_manage_system/code/edit_rule.php?sid=1430%20and%201<>1%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 1<>1 之类)安全避过脚本中原有的 SQL ,然后利用 UNION+LOADFILE() 构造第二段 SQL 。构造的难度在于猜测需要窥探表的字段个数和类型。当个数和类型都符合的的时候,一般可以在正常页面实现重要文件的暴露。这种攻击一旦成功,后果相当严重。考察正常的探测情况,攻击者一般构造形如 http://127.0.0.1/rule_manage_system/code/edit_rule.php?sid=1430%20and%201<>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 ,考察这种攻击利用,必不可少的特征,首先是 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  
顶(1)
踩(0)

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

最新评论