web应用安全防御100技

如何进行web应用安全防御,是每个web安全从业者都会被问到的问题,非常不好回答,容易过于肤浅或流于理论,要阐明清楚,答案就是一本书的长度。而本文要介绍一本能很好回答这个问题的优秀书籍——《web application defender’s cookbook》,这 是一本被低估的“干货”书籍,虽然是为ModSecurity量身定制,但里面提到的防御技巧对web安全从业者均有启发,是WAF版的孙子兵法(有趣的 是,这本书的每个章节均以孙子兵法作为开篇语)。
这本书提出了使用ModSecurity进行web应用安全防御的100个技巧,每个技巧都用真实的案例来说明,非常容易掌握,下文介绍这100技及个人点评(已经准备好被喷了:))。
第1技 实时分析HTTP请求特征
例如请求方法,参数名,参数个数,参数长度,参数取值类型(数字,字母,email, URL或文件路径)
脑洞:给HTTP请求做白名单,或为了准确度给出现过漏洞的URI做白名单
2015-12-11:  http请求分析,从长远来看,有些基本信息库必须建立,URL库就是其中一个,来跟进每个站点的URL变化(包括首次访问时间,最后访问时间,建站指纹,漏洞列表)
e.g.

系统    DeDeCMS一句话写马漏洞   xxxxxxx首次访问    xxxxx最后访问 …

(p.s. 基本信息库基本很难建立起来,建立了也很难维持更新,原因嘛,都知道的)
第2技  验证hash token预防数据篡改

例如:

rv_token的验证
第3技 安装OWASP ModSecurity CRS
该规则集有两种模式,一种独立检测模式,一种协同检测模式(规则评分制)
第4技 将IDS Snort规则转换为ModSecurity规则
使用 snort2modsec2.pl脚本将Snort规则转换为ModSecurity规则
脑洞:安全防御是个整体,将各个关卡有效地联动起来形成壁垒
2015-12-11: 规则一直被歧视(貌似不表示下歧视就low),但我们用事实说话,看看主要安全产品的主要防御方式吧,其中规则被诟病的主要原因:
(1)心理原因,觉得人人都能写,不高端
(2)实际效果,总被绕过, 规则需要持续维护的成本
静态规则如果有一套自动化的运维系统来支撑就能持续发挥作用
(1)自动化规则漏报/误报检测:基于异常检测来支撑漏报,基于统计阈值来支撑误报(已实践,效果不错)
(2)规则自动化提取生成:上一步的结果自动生成规则,未实践
(3)静态规则的分级防御:结合漏洞库,对出现过漏洞的path调整防御级别
(4)规则的通用性转换:漏洞扫描报告转化为防御规则,
第5技 使用贝叶斯分类算法区分恶意请求
第6技 开启HTTP日志审计,设置粒度为全部记录
第7技 开启HTTP日志审计,设置粒度为部分记录
例如只记录响应码为4xx的HTTP请求
第8技 开启HTTP日志审计,不记录静态资源访问请求
第9技 将HTTP日志中的敏感信息****化
脑洞:出发点是尊重用户隐私,但是不少CDN厂商并不会这样做
第10技 使用syslog将server警告信息转发给中心日志平台
作用于分布式/协同防御系统中的日志收集阶段,例如递交给SIEM系统进行分析
2015-12-11: 日志分析技术并不是新鲜的概念,发展的只是分析的支撑平台(存储计算),提高的是处理量级与效率,(机器学习算法暂不评价,因为并未深入),分析的核心还 是分析者的专业知识与经验(特别是经验,安全防御是特别需要经验的,处理的case多了,大多数事情就能hold住了)。
第11技 使用更为友好的ModSecurity 的审计控制平台AuditConsole
第12技 被动的漏洞识别方案-通过读取漏洞库(例如OSVDB)来识别漏洞从而进行防御
2015-12-11: 安全防御总体说是漏洞驱动的,瞧瞧有多少做漏洞平台的,无论官方的还是地下的
小小的感慨下,安全从业人员的增多并没有使得网络安全环境变好反而是恶化,赏金制度的挖洞,催发出多少未授权的渗透行为,对漏洞平台人员所说的漏洞平台会引导黑帽子持质疑的态度。
抛开个人情绪,漏洞库在防御上非常有用。第4技有说明
第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被拖库时,响应体的大小会发生明显的变化
2015-12-11:  挂马并不会发生大的变化,常见拖库行为是否会引发明显变化,需要试验后给出结论(也是继webshell检测后计划试验的)
第45技 检测网页篡改-响应体动态内容篡改

例如在表单注入一段

,检查响应体中会出现新的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技 检测一个会话期,请求者IP的GEO信息的变化

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

该技术一般用于反欺诈系统用于识别用户身份,包括访问者屏幕大小,时区,语言设置,浏览器插件
第63技 检测请求者中的非ASCII字符
例如NULL字符%00
脑洞:看过naxsi基础规则文件的会发现,90%的规则都是检测非ASCII字符
第64技 检测目录遍历攻击
2015-12-11:  猜后台目录/漏洞path是比较有效的渗透方法
第65技  检测非正常流程的网站资源访问
控制URL进行横向权限提升,纵向权限提升操作
可以使用加密token(例如url hash)来防御任意资源访问,如下所示
第66技 检测SQL注入攻击
SQL注入的防御方法一般有三种
(1)SQL关键字过滤器 (2)SQL语义分析 (3)朴素贝叶斯异常分类(使用机器学习算法的异常检测)
2015-12-11:
第67技 检测远程文件包含漏洞
当URI包含以下情况时,极可能是一次攻击请求

IP地址,例如

PHP函数,例如

多个?号,例如

包含的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攻击

例 如

受害者访问图片标签的同时就发送了一个GET请求,两个请求的间隔时间非常短

第83技 检测异常的HTTP请求次序
自动化攻击往往会最小化操作步骤,我们可以参照第2技,第65技,增加token来预防自动化攻击
2015-12-11:  基于图的异常检测方式比较有效,比如检测孤立点来发现webshell(注意不能只有这个特征),比如监测非常规路径来发现越权访问
第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,反之亦然,同时在解决某个安全问题时,如果找不到完善的单独解决方案,不妨同时使用不同的有缺陷的防御方案,三个臭皮匠顶个诸葛亮。
2015-12-11:
现在出来了不少新概念的安全产品,仔细研究下来基本属于以下两种
(1)通用型安全产品:安全组件大礼包,比如说集成web漏洞检测、恶意软件检测、恶意网址检测、DNS/DDoS检测、情报信息(包括漏洞/攻击事件feed,信息泄漏集成),将网络层面的流量信息/系统层面的进程日志信息 定向到安全组件中进行检测,将结果聚合后展示在控制面板上(目前还没有看到什么产品做到强聚合)
这种产品的特性是对误报容忍性差,静态检测规则为主
(2)垂直型安全产品:这种客户都有着高端或更直接的安全需求,例如欺诈识别为主的业务安全、金融产品安全(比如说支付终端漏洞,支付木马),金融企业安全(针对金融行业的专业黑客攻击)
这种产品的特性是对漏报容忍性差,个人感觉是研发代价比较大的数据安全分析技术更能发挥作用的地方
[via@ 碳基体]