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
或日志分析方法的起点。再经过几次修改后,在你对正常网交易部分的非恶意应答进行评估以后,你应该可以准备的检测那些攻击了。