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

简介: http://bbs.chinaunix.net/viewthread.php?tid=1211897修改错误的地方:load_file()这里应该是(/%3D|=)+(/S|/s)+((...

http://bbs.chinaunix.net/viewthread.php?tid=1211897

修改错误的地方:load_file()这里应该是

(/%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)|/()

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

  ";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<0,   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|<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)|<)+((/%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

目录
相关文章
|
2月前
|
SQL 安全 网络安全
SQL安装程序规则错误解决方案
在安装SQL Server时,遇到安装程序规则错误是一个比较常见的问题
|
2月前
|
SQL 安全 Windows
SQL安装程序规则错误解析与解决方案
在安装SQL Server时,用户可能会遇到安装程序规则错误的问题,这些错误通常与系统配置、权限设置、依赖项缺失或版本不兼容等因素有关
|
3月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
138 5
|
3月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
75 5
|
3月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
126 1
|
3月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
50 1
|
3月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
53 3
|
3月前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
94 6
|
3月前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
56 5
|
5月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
【7月更文挑战第27天】在 Web 开发中,Python 面临着如 SQL 注入、XSS 和 CSRF 等安全威胁。
72 0