waf知识的积累
一、背景
在web应用越来越丰富的背景下,web安全得到了重视。因此,waf(Web Application Firewall)代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。与传统防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。
其功能主要有几点:
1.异常检测协议
Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。并且,它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
2.增强的输入验证
增强输入验证,可以有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为。从而减少Web服务器被攻击的可能性。
3.基于规则的保护和基于异常的保护
基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。
4.状态管理
WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登录失败),并且在达到极限值时进行处理。
二、介绍
参考链接:http://http://www.freebuf.com/articles/web/18084.html
2.1 WAF分类
2.1.1 硬件WAF
2.1.2 软件WAF
2.1.3 代码级WAF(使用脚本语言实现的过滤器模式)
2.1.3.1 一些开源的web框架如CodeIgniter会采用一些Global Routing全局路由机制来改变原本的HTTP交互流程,从而使程序猿有机会hook住一些关键的处理逻辑,在进入核心代码前对用户发送的数据进行处理。
链接:http://codeigniter.org.cn/user_guide/general/routing.html
2.1.3.2 还可以使用web应用的编程语言来实现过滤器。 模块代码可以在请求和响应阶段之间进行执行。
ASP.NET的System.Web.IHttpModule接口:
http://msdn.microsoft.com/zh-cn/library/system.web.ihttpmodule(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/ms227673(v=vs.90).aspx
2.1.3.3 javax.servlet.Filter接口:
http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html
public class SqlInjDetectionFilter implements Filter{ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //check request data for maliious characters deDetectSqlI(rep, res); //call next filter in the chain chain.doFilter(servletRequest, servletResponse); } }
将这个接口代码添加到应用中,并在应用配置文件(web.xml)中显示地激活它们。之后每个请求/响应就会"自动"地去对J2EE web源(.jsp,servlet)文件的请求而调用该方法。这就是接口编程的好处,因为J2EE原本就实现了这个Filter机制,并提供了一个接口规范,我们只要在我们的代码中去继承实现这个接口,就可以把代码具现化,从而自定义我们自己的安全处理逻辑。
OWASP Stinger https://www.owasp.org/index.php/Category:OWASP_Stinger_Project 一款开源的J2EE过滤器
Security Parameter Filter(SPF) http://spf.codeplex.com/ 一款ASP.NET HttpModule
2.2 WAF的特性
2.2.1 异常检测协议
Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。RFC对HTTP的数据包格式有明确的定义:http://www.rfc-editor.org/rfc/rfc2068.txt。正常情况下,应用收到的HTTP数据包应该符合这个规定的范畴内,除此之外,在具体的应用中对HTTP Headers中的字段的数据类型以及参数长度都有明确的规定,如果超过了这个范畴,也会造成安全问题。
应用场景:
2.2.2.1 HTTP Split攻击(CRLF攻击的一种) http://http://resources.infosecinstitute.com/http-response-splitting-attack
2.2.2.2 利用cookie信息超过一定的长度限制来绕过Cookie中的HttpOnly(XSS攻击) http://http://hi.baidu.com/aullik5/item/938f60fb7747b16e3c1485ca
2.2.2.3 基于Content-Length的DOS攻击 http://http://ha.ckers.org/slowloris/
2.2.2.4 X-Forward- For注入http://http://sebug.net/vuldb/ssvid-8427
2.2.2.5 本地变量覆盖攻击 http://http://sebug.net/vuldb/ssvid-15146
2.2.2.6 变量类型导致目标应用程序运行报错信息泄漏攻击 http://http://sebug.net/vuldb/ssvid-1080
2.2.2.7 HTTP Parameter Pollution
http://http://www.80sec.com/%E6%B5%85%E8%B0%88%E7%BB%95%E8%BF%87waf%E7%9A%84%E6%95%B0%E7%A7%8D%E6%96%B9%E6%B3%95.html
http://http://www.freebuf.com/articles/web/5908.html
http://http://hi.baidu.com/aullik5/item/860da508a90709843c42e2ca
注意:我们应该考虑一种输入验证策略就是将应用输入分为可编辑的和不可编辑的两类来区别对待。并且锁定不可编辑的输入以便无法操作它们。不可编辑输入是指最终用户不需要直接修改的输入,比如隐藏表单字段、URI和查询字符串参数、cookie等(或者说如果你是正常的用户,你是不会去修改的变量,这样可以对攻击者进行针对性的防御,体现了用户平衡的安全的原则)。
实现这种策略的技术范例是HDIV(HTTP Data Integrity Validator HTTP数据完整性验证器)和SPF(Security Parameter Filter)。可以使用HDIV保护大多数遵循MVC模式的J2EE web应用。 http://www.hdiv.org/
2.2.2 增强的输入验证
输入验证是一种在保证应用安全上很有用的工具。可以把它作为纵深防御的一部分来看待。
3.2.1 在应用输入层使用白名单输入验证以便验证所有用户输入都符合应用要接收的内容。应用只允许接受符合期望格式的输入
3.2.2 在客户端浏览器上同样执行白名单过滤策略(节省往返流量)
3.2.3 在web应用防火墙(WAF)层使用黑名单和白名单输入验证(以漏洞"签名"和"有经验"行为的形式)以便提供入侵检测/阻止功能和监视应用攻击
3.2.4 在应用中自始至终地使用参数化语句以保证执行安全的SQL执行
3.2.5 在数据库查询中使用转义技术(要注意跨系统间的编码问题,防御基于字符编码位宽的绕过:宽字节注入)
3.2.6 在向UI发送之前对数据进行编码。 http://code.google.com/p/owasp-esapi-php/ http://www.oschina.net/p/owasp-esapi-java
而在WAF中这些规则被抽象成了积极模型和消极模型。也就是白名单和黑名单的互补使用。
http://www.nsfocus.com/waf/jishu/js_01.html
2.2.3 及时补丁
任何时候,遵循安全编码规范http://www.php.net/manual/zh/security.php,并进行严格的代码审计。
http://code.google.com/p/pasc2at/wiki/SimplifiedChinese都是最好的办法。解决漏洞的源头也是对源代码进行修补。但是,在面对突发事件的0DAY攻击的时候,代码防御往往不能适应快速响应的需求,所以就需要一种快速的运行时保护机制。WAF在这种场景下可以充当虚拟补丁或补缀解决方案的作用。通过针对具体的漏洞场景编写紧急响应防御规则,来进行hotpatch。 http://security.zdnet.com.cn/security_zone/2012/0208/2077704.shtml
2.2.4 基于规则的保护和基于异常的保护
基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。
ModSecurity https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#wiki-Configuration_Directives
和PHPIDS都是使用规则的保护模式 http://phpids.org/docs/
还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。但这需要对用户企业的应用具有十分透彻的了解才可能做到。自学习思想,前期使用大量的样本对分析器进行学习,以此来建立一种概率统计下的识别模式,更多的来说是行为模式,比如正常用户的URL跳转流程,每分钟发送HTTP请求数量,HTTP包平均大小等。
2.2.5 状态管理
WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登录失败),并且在达到极限值时进行处理。这对暴力攻击的识别和响应时十分有利的。
2.2.6 URL策略/页面层策略
WAF可以不在修改源代码的情况下,为易受攻击的URL或页面打虚拟补丁。
2.2.6.1 页面覆写
2.2.6.2 URL重写
2.3 ModSecurity配置和分析 https://github.com/SpiderLabs/Mod
事实上,WAF的标准就是开源的ModSecurity。ModSecurity被开发成了Apache的一个模块。
2.3.1 安装 https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#wiki-Windows_MS_VC_8
linux下可以通过数据源直接安装:
$ sudo yum install mod_security
$ sudo /etc/init.d/httpd restart
windows下需要下载.dll文件 http://www.apachelounge.com/download/
放到指定目录下,修改httpd.conf中模块加载的加载项即可。
LoadModule security2_module modules/mod_security2.so
2.3.2 配置
ModSecurity配置指令可以直接被添加到你的配置文件中(典型配置是在httpd.conf文件中)。但是他不一定确信这个模块被激活或者是禁止在web服务器启动的时候启动它(分布式配置文件机制.htaccess)。它通常是将配置信息放在
Include conf/security2/security2.conf
自从Apache允许将一组配置数据保存在一个(例如modsecurity.conf)配置文件中,然后被httpd.conf使用Include方法调用。保存后,重启apache。
2.3.3 规则编写学习:
我们接下来从WAF在检测和防御SQL注入上使用到的技术来学习ModSecurity规则的编写。
2.3.3.1 可配置规则集
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#wiki-Configuration_Directives
web应用的环境是惟一的。WAF必须高度可配置才能使用各种不同的情况。ModSecurity的威力在于规则语言上,这种语言是配置指令和应用到HTTP请求和响应上的一种简单编程语言的组合。ModSecurity的结果通常是一个具体的动作,比如允许请求通过、把请求记录到日志或阻塞该请求。
::: 出现"匹配"时做哪些操作(可选,它可以定义默认的全局动作)
处理HTTP请求时,可以对ModSecurity的规则进行配置以实现否定(黑名单)或肯定(白名单)的安全模型。
ModSecurity采用链式的规则模式(类似iptables中的路由链),把整个HTTP交互检测过程分为5个阶段:
1.HTTP头部
2.HTTP内容
3.服务器的回复HTTP包头部
4.服务器的回复HTTP包内容
5.日志记录
2.3.3.2 规则编写(请求)
modsecurity_crs_40_generic_attacks.conf
# SQL injection SecRule REQUEST_FILENAME|ARGS|ARGS_NAME
"(?:\b(?:(?:elect\b(?:.{1,100)?\b(?:(?:length|count|top)\b.{1,100}?\bfrom|from\b.{1,100}\bwhere)|.*?\b(?:d(?:ump\b.*\bfrom|ata_type)|(?:to_(?:numbe|char)|inst)r))|p_(?:(?:addextendedpro|sqlexe)c|(?:oacreat|prepar)e|execute(?:sql)?|makewebtask)|q1 (?:longvarchar|variant))xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|e(?:xecresultset|numdsn)|(?:terminat|dirtre)e|availablemedia|loginconfig|cmdshell|filelist|makecab|ntsec)|u(?:nion\b.{1,100}?\bselect|tl_(?:file|http))|group\b.*\bby\b.{1,100}?\bhaving|d(?:elete\b\w*?\bfrom|bms_java)|load\b\w*?\bdata\b.*\binfile|(?:n?varcha|tbcreato)r)\b|i(?:n(?:to\b\w*?\b(?:dump|out)file|sert\b\w*?\binto|ner\b\w*?\bjoin)\b|(?:f(?:\b\w*?\(\w*?\bbenchmark|null\b)|snull\b)w*?\()|a(?:nd\b ?(?:\d{1,10}|[\'\"][^=]{1,10}[\'\"]) ?[=<>]+|utonomous_transaction\b)|o(?:r\b ?(?:d[1,10}|[\'\"[[^=]{1,10}[\'\"])?[=<>]+|pen(?:rowset|query)\b)|having\b ?(?:\d{1,10}|[\'\"][^=]{1,10}[\'\"])?[=<>]+print\b\w*>\@\@|case\b\w*?\()|(?:;\w*?\b(?:shutdown|drop)|\@\@version)\b|'(?:s(?:qloledb|a)|msdasql|dbo)')" \"phase:2,capture,t:none,t:htmlEntityDecode,t:replaceComments,t:compressWhit-eSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:'SQL injection Attach;, id:'950001',tag:'WEB_ATTACK/SQL_INJECTION',logdata:'%{TX.0}',severity:'CRITICAL'"
a) SecRule REQUEST_FILENAME|ARGS|ARGS_NAME
该规则是一个安全规则(SecRule),用户分析数据并根据结果执行动作,并且我们在结尾处看到phase:2。代表这是链式检测中的第二阶段,就HTTP Body的检查。检查的范围(参数)是REQUEST_FILENAME(请求路径)|ARGS(POST数据)|ARGS_NAME(参数名)
b) "(?:\b(?........msdasq|dbo)')"\
由于正则表达式较长,这里推荐一个正则工具来做辅助
RegexBuddy:http://www.regexbuddy.com/
可以看到,规则对用户发送的数据中包含的敏感关键字进行了不区分大小写地匹配:包括select,from,where等。对字符型的split and balance绕过(使用+,||等连字符来拼接字符串,以及chr,char的使用)进行了防御。对sqlserver的存储过程,xp_cmdshell,oracle的PL/SQL代码dbms_*进行了防御。对Timing Attack的时间延迟性盲注benchmark进行了防御。
c) 规范化(canonicalization)
在前端安全技术中常见的编码绕过技术利用的就是不同系统间的编码位宽,不同编码的解码顺序(htmlParserjavascriptParser的解码顺序),不同的解码规则(unicode->ascii转换中非可见字符的占位符问题)的这些"不一致"导致的漏洞。
WAF为了解决这个"非规范化"带来的问题,在进行实际的检查前会对数据进行一次规范化处理。把所有输入转换成可预见和可控范围内的数据。让我们的规则能100%地匹配到目标对象。
t:none,t:htmlEntityDecode(html解码,HTML编码绕过思路),t:replaceComments(删除注释,防御注释绕过/*!sql_code*/这种漏洞利用),t:compressWhiteSpace(/**/,空格/*&id=*/等绕过思路),t:lowercase(绕过基于黑名单的大小写畸形绕过思路;SelCt FroM ..)
d) auditLogParts=+E,log,auditlog,msg:'SQL injection Attack;,
id:'950001&@#039;,tag:'WEB_ATTACK/SQL_INJECTION',logdata:'%{TX.0}',severity:'CRITICAL'"
借助之前的正则捕获分组特性将抓到的攻击参数记录进数据库,方便审计人员后续的跟进以及0DAY的捕获。注意在这之前要进行转移处理以避免日志伪造攻击(success/r admin failed...伪造换行符的攻击)。
总体来说,ModSecurity的这个规则集是基于消极模型的黑名单规则,它们可以根据应用产生错误肯定。因而,这些动作action的最好的动作就是log。因为黑名单是一种经验的产物,只要被黑名单匹配到就"一定(相对)"是一种攻击模式。而要实现白名单,感觉就难很多,首先要解决的第一个问题就是:什么样的行为是正确的,不同的应用(银行系统,CMS,B2C)的业务差别很大,用户在浏览和使用过程中产生的点击行为也差别很大,例如对于银行业务来说,用户的操作一般是遵循一条线性的轨迹,不会差太多。而对于B2C网站来说,往往各个链接之间的关联不是很大,用户经常会产生跳跃性URL。这个行为模式很难去界定。
举个白名单的例子,假如在script.php的请求中必须包含一个id参数,它的值必须是1~3位长度的数字。我们可以这样编写正则表达式:
SecRule &ARGS "!@eq 1"SecRule ARGS_NAMES "!^id$" SecRule ARGS:id "!^d{1,3}$"
2.3.3.3 规则编写(响应)
WAF在减轻SQL注入的影响方面还有另外一个关键特性---抑制关键信息泄露。
modsecurity_crs_50_outbound.conf
# SQL Errors leakage SecRule RESPONSE_BODY
"(?:\b(?:?:s(?:elect list because it is not contained in (?:an aggregate function and there is no|either an aggregate function or the GROUP BY clause|upplied argument is not a valid (?:(?:M(?:s |y)|Postgre)SQL|O(?:racle|DEC)))|S(?:yntax error converting the \w+ value .*? to a column of data type|QL Server does not exist or access denied)|Either BOF is True , or the current record has been deleted(?:; the operation|\. Requested)|The column prefix .{0,50}? does not match with a table name or alias name used in the query|Could not find server '\w+' in sysservers\. execute sp_addlinkedserver)\b|Un(?:closed quotation mark before the character string\b|able to connect to PostgreSQL server:)|(?:Microsoft OLE DB Provider for .{0,30} [eE]rror |error '800a01b8)'|(?:Warning: mysql_connect\(\)|PostgreSQL query failed):|you have an error in your SQL syntax(?: near '|;)|cannot take a \w+ data type as an argument\*.|incorrect syntax near (?:\'|the\b|@@error\b)|microsoft jet database engine error'8|ORA-\d(5)}: ) |\[Microsoft\]\[ODBC\"\"Phase:4,t:none,ctl:auditLogParts=+E,deny,log,auditlog,status:500,msg:'SQLInformation Leakate'970003',tag:'LEAKAGE/ERRORS', severity:'4'"
一般来说,泄露与应用行为有关的不必要的信息会明显帮助攻击者发现应用中的弱点。这些信息包括软件版本(攻击者可以针对性的进行NDAY攻击)和与应用失败有关的错误明细(sqlserver的错误回显尤其严重,例如利用强制类型转换的错误回显注入),比如发生在数据库服务器上的sql语法错误,有时候,不仅错误本身,攻击者还可以利用sql的逻辑推理来实施盲注。
2.3.4 总结
可以使用传统的基于网络的IDS(Intrusion Detection Systems)来检测SQL注入攻击。但这些IDS距离应用和Web服务器非常远,通常不是最理想的选择。如果已经在网络中运行了这样一种IDS,则可以修改它并将其作为防御的起始线。可以将WAF作为一种非常好的IDS,因为它运行在应用层并且可针对受保护的应用进行微调。
备注:
SQL Injection Pocket Reference链接:
https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1#
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
