资料整理

 

SQL注入技术和跨站脚本攻击的检测

SQL 注入技术和跨站脚本攻击的检测

Posted on 2005-11-10 09:02 loop 阅读 (136) 评论(1)  编辑 收藏收藏至365Key 所属分类 : 网络安全 security

在最后   两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的 防火墙 规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循   安全代码进行开发,攻击者将通过 80 端口进入你的系统。广泛被使用的两个主要攻击技术是 SQL 注入 [ref1] CSS[ref2] 攻击。 SQL 注入是指:通过互联网的输入区域,插入 SQL meta-characters (特殊字符   代表一些数据)和指令,操纵执行后端的 SQL 查询的技术。这些攻击主要针对其他组织的 WEB 服务器。 CSS 攻击通过在 URL 里插入 script 标签,然后   诱导信任它们的用户点击它们,确保恶意 Javascript 代码在受害人的机器上运行。 这些攻击利用了用户和服务器之间的信任关系,事实上服务器没有对输入、输出进行检测,从而未拒绝 javascript 代码。

这篇文章讨论 SQL 注入和 CSS 攻击 漏洞 的检测技术。网上已经有很多关于这两种基于 WEB 攻击的讨论,比如如何实施攻击,他们的影响,怎样更好的编制和设计程序防止这些攻击。   然而 对如何检测这些攻击并没有足够的讨论。我们采用流行的开源的 IDS Snort[ref 3], 组建根据检测这些攻击的规则的正则表达式。附带, Snort 默认规则设定包含检测 CSS 的方法,但是这些容易被避开检测。比如大多通过 hex 进制编码 , %3C%73%63%72%69%70% 74%3E 代替 <script> 避开检测。

依赖 level of paranoia 组织的能力,我们已经编写了多种检测相同攻击的规则。如果你希望检测各种可能的 SQL 注入攻击,那么你需要简单的留意任何现行的 SQL meta-characters ,如单引号,分号和双重破折号 。同样的一个极端检测 CSS 攻击的方法,只要简单地提防 HTML 标记的角括号 。但这样会检测   出很多错误。为了避免这些,这些规则需要修改使它检测更精确些 当仍然不能避免错误。

Snort 规则中使用 pcre(Perl Compatible Regular Expressions)[ref4] 关键字,每个规则可以带或不带其他规则动作。这些规则也可以被公用软件如 grep( 文档搜索工具 ) 使用,来审阅网络服务器日志。   但是 , 需要警惕的是,用户的输入只有当以 GET 提交请求时, WEB 服务器才会记录日记 , 如果是以 POST 提交的请求在日记中是不会记录的。  

2. SQL
注入的正则表示式
  你为 SQL 注入攻击选择正则表示式的时候,重点要记住攻击者可以通过提交表单进行 SQL 注入,也可以通过 Cookie 区域。你的输入检测逻辑应该考虑用户   组织的各类型输入 ( 比如表单或 Cookie 信息 ) 。并且如果你发现许多警告来自一个规则,请留意单引号或者是分号,也许些字符是你的 Web 应用程序创造的   合法的在 CookieS 中的输入。因此 您需要根据你的特殊的 WEB 应用程序评估每个规则。

依照前面提到,一个琐细的检测 SQL 射入攻击的正则表达式要留意 SQL 特殊的 meta-characters  譬如单引号 ( ) 双重扩则号 (--), 为了查出这些字符和他们 hex 等值数 以下正则表达式适用

2.1 
检测 SQL meta-characters 的正则表达式
/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

解释 :
  们首先检查单引号等值的 hex ,单引号本身或者双重扩折号。这些是 MS SQL Server Oracle 的字符 表示后边的为评论 随后的都将被忽略。   另外,如果你使用 MySQL, 你需要留意   # ’和它等值的 hex 的出现。注意我们不需要检查双重破折号等值的 hex,  因为这不是 HTML meta-character,  浏览器不会进行编码。   并且 如果攻击者设法手工修改双重破折号为它的 hex %2D( 使用代理像 Achilles[ref 5]), SQL 注入将失败。  
加入上述正则表达式的新的 Snort 规则如下

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,established;uricontent:".pl";pcre:"/(\%27)|(\’)|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;) 

在本篇讨论中 , uricontent 关键字的值为 ".pl ",  因为在我们的测试环境里 , CGI  程序是用 Perl 写的。 uricontent 关键字的值取决于您的特殊应用 这个值也许是 ".php ",  " .asp ",  " .jsp ",  等。   从这点考虑 我们不显示对应的 Snort  规则 但是我们会给出创造这些规则的正则表达式。   通过这些正则表达式你可以很简单的创造很多的 Snort 规则 . 在前面的正则表达式里 我们检测双重破折号是因为:即便没有单引号的存在那里也可能是 SQL 射入点 [ref 6]   例如 , SQL 查询条目只包含数值,如下

select value1, value2, num_value3 from database 
where num_value3=some_user_supplied_number 

这种情况,攻击者可以执行额外的 SQL 查询 示范提交如下输入

3; insert values into some_other_table 

最后 , pcre 的修饰符’  i   和’  x    是用于分别匹配大小写和忽略空白处的。   上面的规则也可以另外扩展来检查分号的存在。然而,分号很可以是正常 HTTP 应答的一部分。为了减少这种错误,也是为了任何正常的单引号和双重扩折号的出

现,上面的规则应该被修改成先检测=号的存。用户输入会响应一个 GET POST 请求,一般输入提交如下:

username=some_user_supplied_value&password=some_user_supplied_value 

因此 , SQL  注入尝试将导致用户的输入出现在 a =  号或它等效的 hex 值之后。

2.2 
修正检测 SQL meta-characters 的正则表达式  

/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

解释 :
这个规则首先留意  =  号或它的 hex (%3D) ,然后考虑零个或多个除换行符以外的任意字符,最后检测单引号,双重破折号或分号。

  型的 SQL 注入会尝试围绕单引号的用途操作原来的查询,以便得到有用的价值。讨论这个攻击一般使用 1 or 1 = 1 字符串 但是 这个串的侦查很容易被逃避,譬如用 1 or2>1 --.  然而唯一恒定的部分是最初的字符的值,跟随一单引号,再加’ or ’。随后的布尔逻辑可能在一定范围上变化,可以是普通样式也可能是非常复杂的。这些攻击可   以相当精确被侦测,通过以下的正则表达式。 2.3 章节讲解。

2.3 
典型的  SQL  注入攻击的正则表达式

/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 

解释 :
\w* - 
零个或多个字符或者下划线。
(\%27)|\
 -  单引号或它的 hex 等值。
(\%6 F)|o|(\%4 F))((\%72)|r|-(\%52) 
-‘ or ’的大小写以及它的 hex 等值。

union SQL  查询在 SQL 注入各种数据库中攻击中同样是很常见的。如果前面的正则表达式仅仅检测单引号或则其他的 SQL meta characters  ,会造成很多的错误存在。你应该进一步修改查询,检测单引号和关键字‘ union ’。这同样可以进一步扩展其他的 SQL 关键字,像’ select insert update delete 等等。

2.4 
检测 SQL 注入, UNION 查询关键字的正则表达式

/((\%27)|(\’))union/ix

(\%27)|(\
) -  单引号和它的 hex 等值
union - union
关键字

可以同样为其他 SQL 查询定制表达式,如  >select, insert, update, delete, drop,  等等

  果,到这个阶段,攻击者已经发现 web 应用程序存在 SQL 注入 漏洞 ,他将尝试利用它。如果他认识到后端服务器式 MS SQL server ,他一般会尝试运行一些危险的储存和扩展储存过程。这些过程一般以‘ sp ’或‘ xp ’字母开头。典型的,他可能尝试运行   xp_cmdshell ’扩展储存过程(通过 SQL Server 执行 Windows  命令)。 SQL 服务器的 SA 权限有执行这些命令的权限。同样他们可以通过 xp_regread, xp_regwrite 等储存过程修改注册表。

2.5 
检测 MS SQL Server SQL 注入攻击的正则表达式

/exec(\s|\+)+(s|x)p\w+/ix

解释 :
exec - 
请求执行储存或扩展储存过程的关键字
(\s|\+)+ - 
一个或多个的空白或它们的 http 等值编码
(s|x) p- 
sp ’或‘ xp ’字母用来辨认储存或扩展储存过程
\w+ - 
一个或多个字符或下划线来匹配过程的名称

3. 
跨站脚本 (CSS) 的正则表达式

  发动 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%]  。这可能会导致一些错误出现,不是大部分会检测到真实攻击的。  

3.1 
一般  CSS  攻击的正则表达式

/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix 

解释 :
((\%3C)|<) 
-检查 < 和它 hex 等值
((\%2F)|\/)*
-结束标签 / 或它的  hex 等值
[a-z0-9\%]+ 
-检查标签里的字母或它 hex 等值
((\%3E)|>) 
-检查 > 或它的 hex 等值

Snort 
规则
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII Cross-site scripting attempt"; flow:to_server,established; pcre:"/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/i"; classtype:Web-application-attack; sid:9000; rev:5;) 

跨站脚本同样可以使用 <img src=> 技术。现行默认的 snort 规则可以被轻易避开。

3.2
章节提供了防止这种技术的方法。

3.2 "<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 等值

3.3 CSS 
攻击的极端的正则表达式

/((\%3C)|<)[^\n]+((\%3E)|>)/I 

解释 :
这个规则简单寻找 <+ 除换行符外的任何字符 +> 。由于你的 web 服务器和 web 应用程序的构架,这个规则可能产生一些错误。但它能保证捉住任何 CCS 或者类似 CSS 的攻击。

一个不错避开过滤的 CSS 方法请参考 Bugtraq 投稿的
http://www.securityfocus.com/archive/1/272...rchive/1/272037. 
但是请注意最后一种极端的规则将能检测这所有的攻击。

总结 :

  这篇文章中,我们提出了不同种类的正则表达式规则来检测 SQL 注入和跨站脚本攻击。有些规则简单而极端,一个潜在的攻击都将提高警惕。但这些极端的规则可   能导致一些主动的错误。考虑到这点,我们修改了这些简单的规则,利用了另外的样式,他们可以检查的更准确些。在这些网络应用成的攻击检测中,我们推荐将这   些作为调试你 IDS 或日志分析方法的起点。再经过几次修改后,在你对正常网交易部分的非恶意应答进行评估以后,你应该可以准备的检测那些攻击了。

              

posted on 2006-07-18 14:02 谢玮 阅读(365) 评论(0)  编辑  收藏 所属分类: 应用服务器javascriptWeb操作系统与网络


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

最新评论