用mod_security增强web安全性(下)

用mod_security增强web安全性
一孔之见
2003.07.11
行为
有以下几种行为:
l 首要行为(primary action)将要决定是否继续请求。只可以存在一种首要行为,如果你在参数中同时设置几种首要行为,最后的一个行为将被执行。首要行为有 
deny,pass和redirect
l 次要行为(secondary action)将独立于首要行为的决定来进行匹配。可以有任何数目的次要行为。其中的一个是 exec
l 流程行为(flow action)可以更改规则的流程,让mod_security跳到其他的规则,或者略过一条或多条规则。目前还没有流程行为存在。
l 参数(parameter)不是真正的行为,而是一种将参数捆绑到过滤器的一种方法。一些参数可以被真正的行为使用,例如 status 
,用于支持首要行为deny的响应代码。
指定行为
你可以将行为应用于三个地方。其一是SecFilterDefaultAction参数,这定义的是你想所有的过滤器都执行的行为。
SecFilterDefaultAction “deny,log,status:500”
以上例子定义了三个用逗号分隔的例子。前两个行为包含单一的词,第三个行为是一个参数。使用冒号来将其与行为的名字分开。
你也可以指定“预过滤”行为。两种过滤参数都接收一系列行为来作为可选参数。关于为何你这样做的例子将在以后的文字中找到。
内置行为
pass
当过滤器匹配时允许请求通过。这一行为当你想要记录过滤器匹配却不想采取行为是非常有用。
SecFilter KEYWORD “pass,log”

deny
当过滤器满足时中断请求进程。除非使用了status行为,mod_security会立即返回HTTP 
500错误的代码。如果请求被拒绝,”mod_security-action”将会加进请求的头部,包含有mod_security发送的状态代码。
status
用于请求被拒绝时返回的HTTP状态码
SecFilter KEYWORD “status:404”
这在触发后会返回”Page not found 
”。apache的ErrorDocument参数将在这里很好的工作。如果你之前定义过针对某一状态的自定义的错误页面,它们也能很好的显示。
redirect
将用户请求转到指定的URL,例如
SecFilter KEYWORD “redirect: http://www.modsecurity.org”
这一配置参数总是忽略HTTP状态码或是deny关键字。
exec
过滤器匹配时执行文件,需要给出文件的绝对路径
SecFilter KEYWORD “exec:/home/some/report-attack.pl”
这一参数不会影响到首要行为(allow 或 
deny)。这一行为会以无参数的形式调用脚本,但是可以通过在环境变量中提供所有的信息。所有通常的CGI环境变量都在这里。
你可以在每次过滤器匹配时执行二进制文件,执行将会添加一个”mod_security-executed” 头部进请求的头部。
log
纪录过滤器进apache的错误纪录。
nolog
不纪录过滤器进apache的错误纪录
mod_security所增加的请求头部
只要有可能,mod_security就会再请求头部中加入信息,允许你的脚本发现并使用它们。显然,为了你的脚本能够被执行,你需要配置mod_security不会拒绝请求。
以下是所增加的头部:
l mod_security-executed 带着被执行文件的路径为参数
l mod_security-action 带着返回的状态码
l mod_security-message 关于问题保护的消息,同加进错误纪录的消息
使mod_security与防火墙交流
在某些情况下,在监测到某一特殊的危险攻击或是一系列的你想阻止其进一步进行的来自同一源地址的攻击,你可以通过配置防火墙拒绝来自该IP的流量来达到你的目的。这一方法相当危险,因为这可能会引起拒绝服务攻击。例如,入侵者可以通过代理服务器来进行攻击。拒绝来自代理服务器的所有访问相当危险,因为这同时拒绝了合法的用户。

普通问题
作为一种现实mod_security的例子,我们将展示如何使用它来检测并保护大多数的普通安全问题。我们不会在这些问题上面进行深入讨论,但是在 http://www.owasp.org上面可以找到很好的描述。
目录跨越
如果你的脚本处理文件系统,那么你需要对特定的元字符和结构特别小心。比如,字符串 
“../”表示上一层目录。在普通的操作中没有必要组合使用这些字符串,你可以通过以下过滤器来禁用他们:
SecFilter “../”
跨站脚本攻击
当黑客插入HTML或(和)javascript代码进你的Web页面并且这些代码被其他用户执行时,便构成了跨站脚本攻击(XSS)。通常是在不希望的地方插入HTML代码。成功的XSS攻击会导致入侵者获得你的进程的cookie并且获得应用程序的完全访问!
对于这种攻击的防范是使用参数过滤器(因此可以去除HTML/Javasecript代码),但是通常你必须保护存在的应用程序而不改变他们,我们可以使用以下过滤器:
SecFilter “<{ | }*script”
SecFilter “<{.} }+>”
第一个过滤器通过阻止” <script type="text/javascript">”标签来阻止Javascript注入。第二个过滤器跟一般,将拒绝参数中所有的HTML代码。当你应用这种过滤器时要特别小心,因为很多应用程序想要在参数中使用HTML,如CMS应用程序,论坛等。你可以选择性的使用该过滤器。比如,你可以将第二个过滤器用于全站的普通规则,在对特殊的脚本使用以下代码来放松检查:

SecFilterInheritance Off
#other filters here…
SecFilterSelective “ARGS|!ARG_body” “<{.| }+>”

这段代码只允许参数名为”body”中的HTML。实际应用中,你可以增加一些更多的命名参数在列表中。
SQL/数据库攻击
现在大多数web应用程序严重依赖数据库来进行数据操作,除非对数据库的访问进行了特别细致的检查,入侵者能够直接注入任意的SQL命令进数据库。这能够导致黑客从数据库中读取,修改甚至删除敏感数据。过滤器
SecFilter “delete( | )+from”
SecFilter “insert( | )+into”
SecFilter “select( | )+from”
可以用来阻止大多数SQL相关的攻击。这只是一个例子,你需要根据你实际使用的数据库引擎细心定制你的过滤器。
系统命令执行
Web应用程序有时需要通过运行系统命令来完成一定的操作。顽固的黑客可以找到这种概念上的漏洞,允许他执行系统上的任意命令。
像以下的过滤器
SecFilter “bin/”
将监测到在类UNIX系统中执行命令的意图。
缓冲区溢出攻击
缓冲区溢出是一种溢出程序的堆栈并增加精心构造的可执行代码并使其运行的技术。有些情况下可以通过使用类似于以下的过滤器来阻止这种类型的攻击:
SecFilterByteRang 32 126
是否使用这种类型的保护取决于你的应用程序和使用的字符编码方式。

审计日志
当你需要回溯某一特定用户或入侵者时,标准的apache日志并不能提供多大帮助。问题是每一次请求只有相当小的一部分写进日志文件。可以使用mod_security的日志功能来解决,有两个参数:
SecAuditEngine On
SecAuditLog logs/audit_log
会让mod_security知道你想要一份完全的审计日志储存在指定的文件中。以下是一个请求如何被记录的例子
========================================
Request: 192.168.0.2 - - [[18/May/2003:11:20:43 +0100]] "GET /cgibin/
printenv?p1=666 HTTP/1.0" 406 822
Handler: cgi-script
----------------------------------------
GET /cgi-bin/printenv?p1=666 HTTP/1.0
Host: wkx.dyndns.org:8080
User-Agent: mod_security regression test utility
Connection: Close
mod_security-message: Access denied with code 406. Pattern match "666" at
ARGS_SELECTIVE.
mod_security-action: 406
HTTP/1.0 406 Not Acceptable
========================================
你可以在第一行看到你通常从apache日志中能够看到的东西。第二行包含有被用来处理请求的文件名,完整的请求(包含附加的mod_security头部)在分隔符之后单独给出,响应头部(架设只有一行)在一个空行之后给出。当POST过滤器被起用是,POST提交的有效载荷也被包含进审计日志中。实际的响应永远不会被包含(至少这个版本中不会)。
到现在,模块的审计日志部分会在”Handle”下面的一行纪录apache1.x的错误消息,这一行总是以”Error”开头。如果有可能,这一功能将会加进apache 
2.x版本的模块。

测试工具
有一个用于测试有效性的小工具作为 mod_security的一部分一起发布。它提供了一种简单方便的方法来发送精心构造的HTTP请求到服务器以监测攻击的成功与否。
不加任何参数使用这个程序将会打印出程序的用法
[ivanr@wkx tests]___FCKsi___0nbsp;./run-test.pl
Usage: ./run-test.pl host[:port] testfile1, testfile2, ...
为了减轻你的负担,这款小工具能产生特定的请求头部
l Host :(主机名)
l User-Agent : mod_security regression testing utility
l Connection: Close
如果你愿意,你可以将他们包含进请求中,如果已经设置了该参数,测试工具不会再添加。以下是HTTP的请求
# 01 Simple keyword filter
#
# mod_security is configured not to allow
# the "/cgi-bin/keyword" pattern
#
GET /cgi-bin/keyword HTTP/1.0
这一请求仅由第一行构成,没有附加头部。你可以随意构造复杂的请求,以下是使用POST方法的例子
# 10 Keyword in POST
#
POST /cgi-bin/printenv HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
p=333

附加的例子
文件上传
对全站禁止文件上传,但是允许子文件夹进行文件上传
# Reject requests with header "Content-Type" set to "multipart/form-data"
SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data
# Only for the script that performs upload

# Do not inherit filters from the parent folder
SecFilterInheritance Off


保护FormMail
早期版本的FormMail可以滥发邮件
# Only for the FormMail script

# Reject request where the value of parameter "recipient"
# does not end with "@webkreator.com"
SecFilterSelective "ARG_recipient" "!@webkreator.com$">


第1部分/共1部分     [1]
since 2003-12 版权所有(C) 2003 - 2007 一孔之见 All rights reserved      沪ICP备05053386号  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值