资料整理

 

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 谢玮 阅读(410) 评论(0)  编辑  收藏 所属分类: 应用服务器 、javascript 、Web 、操作系统与网络

导航

统计

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

最新评论