白帽子讲Web安全

fhp0917

贡献于2014-07-22

字数:0 关键词: 安全相关框架

白帽子讲 Web 安全 吴翰清 著 北京·BEIJING Publishing House of Electronics Industry 内 容 简 介 在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如 何才能更好地保护我们的数据?本书将带你走进 Web 安全的世界,让你了解 Web 安全的方方面面。黑 客不再变得神秘,攻击技术原来我也可以会,小网站主自己也能找到正确的安全道路。大公司是怎么 做安全的,为什么要选择这样的方案呢?你能在本书中找到答案。详细的剖析,让你不仅能“知其然”, 更能“知其所以然”。 本书是根据作者若干年实际工作中积累下来的丰富经验而写成的,在解决方案上具有极强的可操 作性,深入分析了各种错误的解决方案与误区,对安全工作者有很好的参考价值。安全开发流程与运 营的介绍,对同行业的工作具有指导意义。 未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。 版权所有,侵权必究。 图书在版编目(CIP)数据 白帽子讲 Web 安全/吴翰清著. —北京:电子工业出版社,2012.3 ISBN 978-7-121-16072-1 Ⅰ. ①白… Ⅱ. ①吴… Ⅲ. ①计算机网络-安全技术 Ⅳ. ①TP393.08 中国版本图书馆 CIP 数据核字(2012)第 025998 号 策划编辑:张春雨 责任编辑:葛 娜 印 刷:北京东光印刷厂 装 订:三河市皇庄路通装订厂 出版发行:电子工业出版社 北京市海淀区万寿路 173 信箱 邮编 100036 开 本:787×1092 1/16 印张:28 字数:716 千字 印 次:2012 年 3 月第 1 次印刷 印 数:4000 册 定价:69.00 元(含 DVD 光盘 1 张) 凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系, 联系及邮购电话:(010)88254888。 质量投诉请发邮件至 zlts@phei.com.cn,盗版侵权举报请发邮件至 dbqq@phei.com.cn。 服务热线:(010)88258888。 前言 在 2010 年年中的时候,博文视点的张春雨先生找到我,希望我可以写一本关于云计算安 全的书。当时云计算的概念正如日中天,但市面上关于云计算安全应该怎么做却缺乏足够的资 料。我由于工作的关系接触这方面比较多,但考虑到云计算的未来尚未清晰,以及其他的种种 原因,婉拒了张春雨先生的要求,转而决定写一本关于 Web 安全的书。 我的安全之路 我对安全的兴趣起源于中学时期。当时在盗版市场买到了一本没有书号的黑客手册,其中 coolfire1 加入阿里巴巴 的黑客教程令我印象深刻。此后在有限的能接触到互联网的机会里,我总会想方设法 地寻找一些黑客教程,并以实践其中记载的方法为乐。 在 2000 年的时候,我进入了西安交通大学学习。在大学期间,最大的收获,是学校的计 算机实验室平时会对学生开放。当时上网的资费仍然较贵,父母给我的生活费里,除了留下必 要的生活所需费用之外,几乎全部投入在这里。也是在学校的计算机实验室里,让我迅速在这 个领域中成长起来。 大学期间,在父母的资助下,我拥有了自己的第一台个人电脑,这加快了我成长的步伐。 与此同时,我和一些互联网上志同道合的朋友,一起建立了一个技术型的安全组织,名字来源 于我当时最喜爱的一部动漫:“幻影旅团”(ph4nt0m.org)。历经十余载,“幻影”由于种种原因 未能得以延续,但它却曾以论坛的形式培养出了当今安全行业中非常多的顶尖人才。这也是我 在这短短二十余载人生中的最大成就与自豪。 得益于互联网的开放性,以及我亲手缔造的良好技术交流氛围,我几乎见证了全部互联网 安全技术的发展过程。在前 5 年,我投入了大量精力研究渗透测试技术、缓冲区溢出技术、网 络攻击技术等;而在后 5 年,出于工作需要,我把主要精力放在了对 Web 安全的研究上。 发生这种专业方向的转变,是因为在 2005 年,我在一位挚友的推荐下,加入了阿里巴巴。 加入的过程颇具传奇色彩,在面试的过程中主管要求我展示自己的能力,于是我远程关闭了阿 1 Coolfire,真名林正隆,台湾著名黑客,中国黑客文化的先驱者。  V  里巴巴内网上游运营商的一台路由设备,导致阿里巴巴内部网络中断。事后主管立即要求与运 营商重新签订可用性协议。 大学时期的兴趣爱好,居然可以变成一份正经的职业(当时很多大学都尚未开设网络安全 的课程与专业),这使得我的父母很震惊,同时也更坚定了我自己以此作为事业的想法。 在阿里巴巴我很快就崭露头角,曾经在内网中通过网络嗅探捕获到了开发总监的邮箱密 码;也曾经在压力测试中一瞬间瘫痪了公司的网络;还有好几次,成功获取到了域控服务器的 权限,从而可以以管理员的身份进入任何一位员工的电脑。 但这些工作成果,都远远比不上那厚厚的一摞网站安全评估报告让我更有成就感,因为我 知道,网站上的每一个漏洞,都在影响着成千上万的用户。能够为百万、千万的互联网用户服 务,让我倍感自豪。当时,Web 正在逐渐成为互联网的核心,Web 安全技术也正在兴起,于是 我义无返顾地投入到对 Web 安全的研究中。 我于 2007 年以 23 岁之龄成为了阿里巴巴集团最年轻的技术专家。虽未有官方统计,但可 能也是全集团里最年轻的高级技术专家,我于 2010 年获此殊荣。在阿里巴巴,我有幸见证了 安全部门从无到有的建设过程。同时由于淘宝、支付宝草创,尚未建立自己的安全团队,因此 我有幸参与了淘宝、支付宝的安全建设,为他们奠定了安全开发框架、安全开发流程的基础。 对互联网安全的思考 当时,我隐隐地感觉到了互联网公司安全,与传统的网络安全、信息安全技术的区别。就 如同开发者会遇到的挑战一样,有很多问题,不放到一个海量用户的环境下,是难以暴露出来 的。由于量变引起质变,所以管理 10 台服务器,和管理 1 万台服务器的方法肯定会有所区别; 同样的,评估 10 名工程师的代码安全,和评估 1000 名工程师的代码安全,方法肯定也要有所 不同。 互联网公司安全还有一些鲜明的特色,比如注重用户体验、注重性能、注重产品发布时间, 因此传统的安全方案在这样的环境下可能完全行不通。这对安全工作提出了更高的要求和更大 的挑战。 这些问题,使我感觉到,互联网公司安全可能会成为一门新的学科,或者说应该把安全技 术变得更加工业化。可是我在书店中,却发现安全类目的书,要么是极为学术化的(一般人看 不懂)教科书,要么就是极为娱乐化的(比如一些“黑客工具说明书”类型的书)说明书。极 少数能够深入剖析安全技术原理的书,以我的经验看来,在工业化的环境中也会存在各种各样 的问题。 这些问题,也就促使我萌发了一种写一本自己的书,分享多年来工作心得的想法。它将是 一本阐述安全技术在企业级应用中实践的书,是一本大型互联网公司的工程师能够真正用得上 的安全参考书。因此张春雨先生一提到邀请我写书的想法时,我没有做过多的思考,就答应了。  VI  Web 是互联网的核心,是未来云计算和移动互联网的最佳载体,因此 Web 安全也是互联 网公司安全业务中最重要的组成部分。我近年来的研究重心也在于此,因此将选题范围定在了 Web 安全。但其实本书的很多思路并不局限于 Web 安全,而是可以放宽到整个互联网安全的 方方面面之中。 掌握了以正确的思路去看待安全问题,在解决它们时,都将无往而不利。我在 2007 年的 时候,意识到了掌握这种正确思维方式的重要性,因此我告知好友:安全工程师的核心竞争力 不在于他能拥有多少个 0day,掌握多少种安全技术,而是在于他对安全理解的深度,以及由 此引申的看待安全问题的角度和高度。我是如此想的,也是如此做的。 因此在本书中,我认为最可贵的不是那一个个工业化的解决方案,而是在解决这些问题时, 背后的思考过程。我们不是要做一个能够解决问题的方案,而是要做一个能够“漂亮地”解决 问题的方案。这是每一名优秀的安全工程师所应有的追求。 安全启蒙运动 然而在当今的互联网行业中,对安全的重视程度普遍不高。有统计显示,互联网公司对安 全的投入不足收入的百分之一。 在 2011 年岁末之际,中国互联网突然卷入了一场有史以来最大的安全危机。12 月 21 日, 国内最大的开发者社区 CSDN 被黑客在互联网上公布了 600 万注册用户的数据。更糟糕的是, CSDN 在数据库中明文保存了用户的密码。接下来如同一场盛大的交响乐,黑客随后陆续公布 了网易、人人、天涯、猫扑、多玩等多家大型网站的数据库,一时间风声鹤唳,草木皆兵。 这些数据其实在黑客的地下世界中已经辗转流传了多年,牵扯到了一条巨大的黑色产业 链。这次的偶然事件使之浮出水面,公之于众,也让用户清醒地认识到中国互联网的安全现状 有多么糟糕。 以往类似的事件我都会在博客上说点什么,但这次我保持了沉默。因为一来知道此种状况 已经多年,网站只是在为以前的不作为而买单;二来要解决“拖库”的问题,其实是要解决整 个互联网公司的安全问题,远非保证一个数据库的安全这么简单。这不是通过一段文字、一篇 文章就能够讲清楚的。但我想最好的答案,可以在本书中找到。 经历这场危机之后,希望整个中国互联网,在安全问题的认识上,能够有一个新的高度。 那这场危机也就物有所值,或许还能借此契机成就中国互联网的一场安全启蒙运动。 这是我的第一本书,也是我坚持自己一个人写完的书,因此可以在书中尽情地阐述自己的 安全世界观,且对书中的任何错漏之处以及不成熟的观点都没有可以推卸责任的借口。 由于工作繁忙,写此书只能利用业余时间,交稿时间多次推迟,深感写书的不易。但最终 能成书,则有赖于各位亲朋的支持,以及编辑的鼓励,在此深表感谢。本书中很多地方未能写  VII  得更为深入细致,实乃精力有限所致,尚请多多包涵。 关于白帽子 在安全圈子里,素有“白帽”、“黑帽”一说。 黑帽子是指那些造成破坏的黑客,而白帽子则是研究安全,但不造成破坏的黑客。白帽子 均以建设更安全的互联网为己任。 我于 2008 年开始在国内互联网行业中倡导白帽子的理念,并联合了一些主要互联网公司 的安全工程师,建立了白帽子社区,旨在交流工作中遇到的各种问题,以及经验心得。 本书名为《白帽子讲 Web 安全》,即是站在白帽子的视角,讲述 Web 安全的方方面面。虽 然也剖析攻击原理,但更重要的是如何防范这些问题。同时也希望“白帽子”这一理念,能够 更加的广为人知,为中国互联网所接受。 本书结构 全书分为 4 大篇共 18 章,读者可以通过浏览目录以进一步了解各篇章的内容。在有的章 节末尾,还附上了笔者曾经写过的一些博客文章,可以作为延伸阅读以及本书正文的补充。 第一篇 我的安全世界观是全书的纲领。在此篇中先回顾了安全的历史,然后阐述了笔者 对安全的看法与态度,并提出了一些思考问题的方式以及做事的方法。理解了本篇,就能明白 全书中所涉及的解决方案在抉择时的取舍。 第二篇 客户端脚本安全就当前比较流行的客户端脚本攻击进行了深入阐述。当网站的安 全做到一定程度后,黑客可能难以再找到类似注入攻击、脚本执行等高风险的漏洞,从而可能 将注意力转移到客户端脚本攻击上。 客户端脚本安全与浏览器的特性息息相关,因此对浏览器的深入理解将有助于做好客户端 脚本安全的解决方案。 如果读者所要解决的问题比较严峻,比如网站的安全是从零开始,则建议跳过此篇,先阅 读下一篇“服务器端应用安全”,解决优先级更高的安全问题。 第三篇 服务器端应用安全就常见的服务器端应用安全问题进行了阐述。这些问题往往能 引起非常严重的后果,在网站的安全建设之初需要优先解决这些问题,避免留下任何隐患。 第四篇 互联网公司安全运营提出了一个大安全运营的思想。安全是一个持续的过程,最 终仍然要由安全工程师来保证结果。 在本篇中,首先就互联网业务安全问题进行了一些讨论,这些问题对于互联网公司来说有 时候会比漏洞更为重要。  VIII  在接下来的两章中,首先阐述了安全开发流程的实施过程,以及笔者积累的一些经验。然 后谈到了公司安全团队的职责,以及如何建立一个健康完善的安全体系。 本书也可以当做一本安全参考书,读者在遇到问题时,可以挑选任何所需要的章节进行 阅读。 致谢 感谢我的妻子,她的支持是对我最大的鼓励。本书最后的成书时日,是陪伴在她的病床边 完成的,我将铭记一生。 感谢我的父母,是他们养育了我,并一直在背后默默地支持我的事业,使我最终能有机会 在这里写下这些话。 感谢我的公司阿里巴巴集团,它营造了良好的技术与实践氛围,使我能够有今天的积累。 同时也感谢在工作中一直给予我帮助和鼓励的同事、上司,他们包括但不限于:魏兴国、汤城、 刘志生、侯欣杰、林松英、聂万全、谢雄钦、徐敏、刘坤、李泽洋、肖力、叶怡恺。 感谢季昕华先生为本书作序,他一直是所有安全工作者的楷模与学习的对象。 也感谢博文视点的张春雨先生以及他的团队,是他们的努力使本书最终能与广大读者见 面。他们的专业意见给了我很多的帮助。 最后特别感谢我的同事周拓,他对本书提出了很多有建设性的意见。 联系方式: 邮箱:opensystem@gmail.com 博客:http://hi.baidu.com/aullik5 微博:http://t.qq.com/aullik5 微博:http://weibo.com/n/aullik5 吴翰清 2012 年 1 月于杭州 序言 2012 年农历春节,我回到了浙西的老家,外面白雪皑皑。在这与网络隔离的小乡村里,在 这可以夜不闭户的小乡村里,过着与网络无关、与安全无关的生活,而我终于可以有时间安安 静静拜读吴翰清先生的这本大作了。 认识吴翰清先生源于网络、源于安全,并从网络走向生活,成为朋友。他对于安全技术孜 孜不倦的研究,使得他年纪轻轻便成为系统、网络、Web 等多方面安全的专家;他对于安全技 术的分享,创建了“幻影旅团”(ph4nt0m.org)组织,培养了一批安全方面的技术人才,并带 动了整个行业的交流氛围;他和同事在大型互联网公司对安全方面的不断实践,全面保护着阿 里巴巴集团的安全;他对于安全的反思和总结并发布在他的博客上,使得我们能够更为深入地 理解安全的意义,处理安全问题的方法论。而今天,很幸运,我们能系统的地看到吴翰清先生 多年在大型互联网公司工作实践、总结反思所积累的安全观和 Web 安全技术。 中国人自己编写的安全专著不多,而在这为数不多的书中,绝大部分也都是“黑客攻击” 速成手册。这些书除了在技术上仅立足于零碎的技术点、工具使用手册、攻击过程演示,不系 统之外,更为关键的是,它们不是以建设者的角度去解决安全问题。吴翰清先生是我非常佩服 的“白帽子”,他和一群志同道合的朋友,一直以建设更安全的互联网为己任,系统地研究安 全,积极分享知识,为中国的互联网安全添砖加瓦。而这本书也正是站在白帽子的视角,讲述 Web 安全的方方面面,它剖析攻击原理,目的是让互联网开发者、技术人员了解原理,并通过 自身的实践,告诉大家分析这些问题的方法论、思想以及对应的防范方案。 最让我共鸣的是“安全运营”的思路,我相信这也是吴翰清先生这么多年在互联网公司工 作的最大收获之一,因为运营是互联网公司的最大特色和法宝。安全是一个动态的过程,因为 敌方攻击手段在变,攻击方法在变,漏洞不断出现;我方业务在变,软件在变,人员在变,妄 图通过一个系统、一个方案解决所有的问题是不现实的,也是不可能的,安全需要不断地运营、 持续地优化。 瑞雪兆丰年,一直在下的雪预示着今年的丰收。我想在经历了 2011 年中国互联网最大安 全危机之后,如白雪一样纯洁的《白帽子讲 Web 安全》应该会给广大的从事互联网技术人员带 来更多的帮助,保障中国互联网的安全,迎来互联网的又一个春天。 季昕华 Benjurry  IX  目录 第一篇 世界观安全 第 1 章 我的安全世界观 ................................................................................................ 2 1.1 Web 安全简史 ............................................................................................. 2 1.1.1 中国黑客简史 ..................................................................................... 2 1.1.2 黑客技术的发展历程 ........................................................................... 3 1.1.3 Web 安全的兴起 .................................................................................. 5 1.2 黑帽子,白帽子 .......................................................................................... 6 1.3 返璞归真,揭秘安全的本质........................................................................ 7 1.4 破除迷信,没有银弹 ................................................................................... 9 1.5 安全三要素 ................................................................................................ 10 1.6 如何实施安全评估 ..................................................................................... 11 1.6.1 资产等级划分 .................................................................................... 12 1.6.2 威胁分析 ........................................................................................... 13 1.6.3 风险分析 ........................................................................................... 14 1.6.4 设计安全方案 .................................................................................... 15 1.7 白帽子兵法 ................................................................................................ 16 1.7.1 Secure By Default 原则 ........................................................................ 16 1.7.2 纵深防御原则 .................................................................................... 18 1.7.3 数据与代码分离原则 .......................................................................... 19 1.7.4 不可预测性原则 ................................................................................. 21 1.8 小结 ........................................................................................................... 22 (附)谁来为漏洞买单? ................................................................................ 23 第二篇 客户端脚本安全 第 2 章 浏览器安全 ....................................................................................................... 26 2.1 同源策略 .................................................................................................... 26 2.2 浏览器沙箱 ................................................................................................ 30 2.3 恶意网址拦截 ............................................................................................. 33  X  2.4 高速发展的浏览器安全 .............................................................................. 36 2.5 小结 ........................................................................................................... 39 第 3 章 跨站脚本攻击(XSS) ................................................................................... 40 3.1 XSS 简介 .................................................................................................... 40 3.2 XSS 攻击进阶 ............................................................................................ 43 3.2.1 初探 XSS Payload ............................................................................... 43 3.2.2 强大的 XSS Payload ............................................................................ 46 3.2.3 XSS 攻击平台 ................................................................................... 62 3.2.4 终极武器:XSS Worm ........................................................................ 64 3.2.5 调试 JavaScript ................................................................................... 73 3.2.6 XSS 构造技巧 .................................................................................... 76 3.2.7 变废为宝:Mission Impossible ............................................................. 82 3.2.8 容易被忽视的角落:Flash XSS ............................................................ 85 3.2.9 真的高枕无忧吗:JavaScript 开发框架 ................................................. 87 3.3 XSS 的防御 ................................................................................................ 89 3.3.1 四两拨千斤:HttpOnly ........................................................................ 89 3.3.2 输入检查 ........................................................................................... 93 3.3.3 输出检查 ........................................................................................... 95 3.3.4 正确地防御 XSS ................................................................................. 99 3.3.5 处理富文本 ...................................................................................... 102 3.3.6 防御 DOM Based XSS ....................................................................... 103 3.3.7 换个角度看 XSS 的风险 .................................................................... 107 3.4 小结 ......................................................................................................... 107 第 4 章 跨站点请求伪造(CSRF) ........................................................................... 109 4.1 CSRF 简介 ............................................................................................... 109 4.2 CSRF 进阶 ............................................................................................... 111 4.2.1 浏览器的 Cookie 策略 ....................................................................... 111 4.2.2 P3P 头的副作用 ............................................................................... 113 4.2.3 GET? POST? .................................................................................... 116 4.2.4 Flash CSRF ...................................................................................... 118 4.2.5 CSRF Worm ..................................................................................... 119 4.3 CSRF 的防御 ............................................................................................ 120 4.3.1 验证码 ............................................................................................ 120 4.3.2 Referer Check ................................................................................... 120 4.3.3 Anti CSRF Token .............................................................................. 121 4.4 小结 ......................................................................................................... 124 第 5 章 点击劫持(ClickJacking) ........................................................................... 125  XI  5.1 什么是点击劫持 ....................................................................................... 125 5.2 Flash 点击劫持 ......................................................................................... 127 5.3 图片覆盖攻击 ........................................................................................... 129 5.4 拖拽劫持与数据窃取 ................................................................................ 131 5.5 ClickJacking 3.0:触屏劫持 ..................................................................... 134 5.6 防御 ClickJacking ..................................................................................... 136 5.6.1 frame busting .................................................................................... 136 5.6.2 X-Frame-Options ............................................................................... 137 5.7 小结 ......................................................................................................... 138 第 6 章 HTML 5 安全 ................................................................................................. 139 6.1 HTML 5 新标签 ........................................................................................ 139 6.1.1 新标签的 XSS .................................................................................. 139 6.1.2 iframe 的 sandbox ............................................................................. 140 6.1.3 Link Types: noreferrer ........................................................................ 141 6.1.4 Canvas 的妙用 .................................................................................. 141 6.2 其他安全问题 ........................................................................................... 144 6.2.1 Cross-Origin Resource Sharing ............................................................ 144 6.2.2 postMessage——跨窗口传递消息 ........................................................ 146 6.2.3 Web Storage ..................................................................................... 147 6.3 小结 ......................................................................................................... 150 第三篇 服务器端应用安全 第 7 章 注入攻击 ........................................................................................................ 152 7.1 SQL 注入.................................................................................................. 152 7.1.1 盲注(Blind Injection) ..................................................................... 153 7.1.2 Timing Attack ................................................................................... 155 7.2 数据库攻击技巧 ....................................................................................... 157 7.2.1 常见的攻击技巧 ............................................................................... 157 7.2.2 命令执行 ......................................................................................... 158 7.2.3 攻击存储过程 .................................................................................. 164 7.2.4 编码问题 ......................................................................................... 165 7.2.5 SQL Column Truncation ..................................................................... 167 7.3 正确地防御 SQL 注入 .............................................................................. 170 7.3.1 使用预编译语句 ............................................................................... 171 7.3.2 使用存储过程 .................................................................................. 172 7.3.3 检查数据类型 .................................................................................. 172 7.3.4 使用安全函数 .................................................................................. 172  XII  7.4 其他注入攻击 ........................................................................................... 173 7.4.1 XML 注入 ........................................................................................ 173 7.4.2 代码注入 ......................................................................................... 174 7.4.3 CRLF 注入 ....................................................................................... 176 7.5 小结 ......................................................................................................... 179 第 8 章 文件上传漏洞 ................................................................................................. 180 8.1 文件上传漏洞概述 ................................................................................... 180 8.1.1 从 FCKEditor 文件上传漏洞谈起 ........................................................ 181 8.1.2 绕过文件上传检查功能 ..................................................................... 182 8.2 功能还是漏洞 ........................................................................................... 183 8.2.1 Apache 文件解析问题 ....................................................................... 184 8.2.2 IIS 文件解析问题 ............................................................................. 185 8.2.3 PHP CGI 路径解析问题 ..................................................................... 187 8.2.4 利用上传文件钓鱼 ............................................................................ 189 8.3 设计安全的文件上传功能 ........................................................................ 190 8.4 小结 ......................................................................................................... 191 第 9 章 认证与会话管理 ............................................................................................. 192 9.1 Who am I? ................................................................................................ 192 9.2 密码的那些事儿 ....................................................................................... 193 9.3 多因素认证 .............................................................................................. 195 9.4 Session 与认证 ......................................................................................... 196 9.5 Session Fixation 攻击 ................................................................................ 198 9.6 Session 保持攻击 ...................................................................................... 199 9.7 单点登录( SSO) .................................................................................... 201 9.8 小结 ......................................................................................................... 203 第 10 章 访问控制 ...................................................................................................... 205 10.1 What Can I Do? ....................................................................................... 205 10.2 垂直权限管理 ......................................................................................... 208 10.3 水平权限管理 ......................................................................................... 211 10.4 OAuth 简介 ............................................................................................. 213 10.5 小结 ....................................................................................................... 219 第 11 章 加密算法与随机 数 ....................................................................................... 220 11.1 概述 ........................................................................................................ 220 11.2 Stream Cipher Attack ............................................................................... 222 11.2.1 Reused Key Attack ........................................................................... 222 11.2.2 Bit-flipping Attack ........................................................................... 228  XIII  11.2.3 弱随机 IV 问题 ............................................................................... 230 11.3 WEP 破解 ............................................................................................... 232 11.4 ECB 模式的缺陷 ..................................................................................... 236 11.5 Padding Oracle Attack ............................................................................. 239 11.6 密钥管理 ................................................................................................ 251 11.7 伪随机数问题 ......................................................................................... 253 11.7.1 弱伪随机数的麻烦 .......................................................................... 253 11.7.2 时间真的随机吗 ............................................................................. 256 11.7.3 破解伪随机数算法的种子 ................................................................ 257 11.7.4 使用安全的随机数 .......................................................................... 265 11.8 小结 ........................................................................................................ 265 (附)Understanding MD5 Length Extension Attack .................................... 267 第 12 章 Web 框架安全.............................................................................................. 280 12.1 MVC 框架安全 ....................................................................................... 280 12.2 模板引擎与 XSS 防御 ............................................................................. 282 12.3 Web 框架与 CSRF 防御 .......................................................................... 285 12.4 HTTP Headers 管理................................................................................. 287 12.5 数据持久层与 SQL 注入 ......................................................................... 288 12.6 还能想到什么 ......................................................................................... 289 12.7 Web 框架自身安全 ................................................................................. 289 12.7.1 Struts 2 命令执行漏洞 ..................................................................... 290 12.7.2 Struts 2 的问题补丁 ......................................................................... 291 12.7.3 Spring MVC 命令执行漏洞 ............................................................... 292 12.7.4 Django 命令执行漏洞 ...................................................................... 293 12.8 小结 ....................................................................................................... 294 第 13 章 应用层拒绝服务攻击 ................................................................................... 295 13.1 DDOS 简介 ............................................................................................. 295 13.2 应用层 DDOS ......................................................................................... 297 13.2.1 CC 攻击 ......................................................................................... 297 13.2.2 限制请求频率 ................................................................................. 298 13.2.3 道高一尺,魔高一丈 ....................................................................... 300 13.3 验证码的那些事儿 ................................................................................. 301 13.4 防御应用层 DDOS .................................................................................. 304 13.5 资源耗尽攻击 ......................................................................................... 306 13.5.1 Slowloris 攻击 ................................................................................ 306 13.5.2 HTTP POST DOS ............................................................................ 309  XIV  13.5.3 Server Limit DOS ............................................................................ 310 13.6 一个正则引发的血案:ReDOS ............................................................... 311 13.7 小结 ....................................................................................................... 315 第 14 章 PHP 安全 ..................................................................................................... 317 14.1 文件包含漏洞 ......................................................................................... 317 14.1.1 本地文件包含 ................................................................................. 319 14.1.2 远程文件包含 ................................................................................. 323 14.1.3 本地文件包含的利用技巧 ................................................................ 323 14.2 变量覆盖漏洞 ......................................................................................... 331 14.2.1 全局变量覆盖 ................................................................................. 331 14.2.2 extract()变量覆盖 ............................................................................ 334 14.2.3 遍历初始化变量 ............................................................................. 334 14.2.4 import_request_variables 变量覆盖 .................................................... 335 14.2.5 parse_str()变量覆盖 ......................................................................... 335 14.3 代码执行漏洞 ......................................................................................... 336 14.3.1 “危险函数”执行代码 ..................................................................... 336 14.3.2 “文件写入”执行代码 ..................................................................... 343 14.3.3 其他执行代码方式 .......................................................................... 344 14.4 定制安全的 PHP 环境 ............................................................................. 348 14.5 小结 ....................................................................................................... 352 第 15 章 Web Server 配置安全 ................................................................................. 353 15.1 Apache 安全 ........................................................................................... 353 15.2 Nginx 安全 ............................................................................................. 354 15.3 jBoss 远程命令执行 ................................................................................ 356 15.4 Tomcat 远程命令执行 ............................................................................. 360 15.5 HTTP Parameter Pollution ....................................................................... 363 15.6 小结 ....................................................................................................... 364 第四篇 互联网公司安全运营 第 16 章 互联网业务安全 ........................................................................................... 366 16.1 产品需要什么样的安全 .......................................................................... 366 16.1.1 互联网产品对安全的需求 ................................................................ 367 16.1.2 什么是好的安全方案 ....................................................................... 368 16.2 业务逻辑安全 ......................................................................................... 370 16.2.1 永远改不掉的密码 .......................................................................... 370 16.2.2 谁是大赢家 .................................................................................... 371 16.2.3 瞒天过海 ....................................................................................... 372  XV  16.2.4 关于密码取回流程 .......................................................................... 373 16.3 账户是如何被盗的 ................................................................................. 374 16.3.1 账户被盗的途径 ............................................................................. 374 16.3.2 分析账户被盗的原因 ....................................................................... 376 16.4 互联网的垃圾 ......................................................................................... 377 16.4.1 垃圾的危害 .................................................................................... 377 16.4.2 垃圾处理 ....................................................................................... 379 16.5 关于网络钓鱼 ......................................................................................... 380 16.5.1 钓鱼网站简介 ................................................................................. 381 16.5.2 邮件钓鱼 ....................................................................................... 383 16.5.3 钓鱼网站的防控 ............................................................................. 385 16.5.4 网购流程钓鱼 ................................................................................. 388 16.6 用户隐私保护 ......................................................................................... 393 16.6.1 互联网的用户隐私挑战 ................................................................... 393 16.6.2 如何保护用户隐私 .......................................................................... 394 16.6.3 Do-Not-Track.................................................................................. 396 16.7 小结 ....................................................................................................... 397 (附)麻烦的终结者 ...................................................................................... 398 第 17 章 安全开发流程( SDL) ............................................................................... 402 17.1 SDL 简介 ................................................................................................ 402 17.2 敏捷 SDL ................................................................................................ 406 17.3 SDL 实战经验 ........................................................................................ 407 17.4 需求分析与设计阶段 .............................................................................. 409 17.5 开发阶段 ................................................................................................ 415 17.5.1 提供安全的函数 ............................................................................. 415 17.5.2 代码安全审计工具 .......................................................................... 417 17.6 测试阶段 ................................................................................................ 418 17.7 小结 ....................................................................................................... 420 第 18 章 安全运营 ...................................................................................................... 422 18.1 把安全运营起来 ..................................................................................... 422 18.2 漏洞修补流程 ......................................................................................... 423 18.3 安全监控 ................................................................................................ 424 18.4 入侵检测 ................................................................................................ 425 18.5 紧急响应流程 ......................................................................................... 428 18.6 小结 ....................................................................................................... 430 (附)谈谈互联网企业安全的发展方向 ...................................................... 431  XVI  第 1 章 我的安全世界观 互联网本来是安全的,自从有了研究安全的人之后,互联网就变得不安全了。 1.1 Web 安全简史 起初,研究计算机系统和网络的人,被称为“Hacker”,他们对计算机系统有着深入的理 解,因此往往能够发现其中的问题。“Hacker”在中国按照音译,被称为“黑客”。在计算机安 全领域,黑客是一群破坏规则、不喜欢被拘束的人,因此总想着能够找到系统的漏洞,以获得 一些规则之外的权力。 对于现代计算机系统来说,在用户态的最高权限是 root(administrator),也是黑客们最渴望 能够获取的系统最高权限。“root”对黑客的吸引,就像大米对老鼠的吸引,美女对色狼的吸引。 不想拿到“root”的黑客,不是好黑客。漏洞利用代码能够帮助黑客们达成这一目标。黑 客们使用的漏洞利用代码,被称为“exploit”。在黑客的世界里,有的黑客,精通计算机技术, 能自己挖掘漏洞,并编写 exploit;而有的黑客,则只对攻击本身感兴趣,对计算机原理和各种 编程技术的了解比较粗浅,因此只懂得编译别人的代码,自己并没有动手能力,这种黑客被称 为“Script Kids”,即“脚本小子”。在现实世界里,真正造成破坏的,往往并非那些挖掘并研 究漏洞的“黑客”们,而是这些脚本小子。而在今天已经形成产业的计算机犯罪、网络犯罪中, 造成主要破坏的,也是这些“脚本小子”。 1.1.1 中国黑客简史 中国黑客的发展分为几个阶段,到今天已经形成了一条黑色产业链。 笔者把中国黑客的发展分为了:启蒙时代、黄金时代、黑暗时代。 首先是启蒙时代,这个时期大概处在 20 世纪 90 年代,此时中国的互联网也刚刚处于起步 阶段,一些热爱新兴技术的青年受到国外黑客技术的影响,开始研究安全漏洞。启蒙时代的黑 客们大多是由于个人爱好而走上这条道路,好奇心与求知欲是驱使他们前进的动力,没有任何 利益的瓜葛。这个时期的中国黑客们通过互联网,看到了世界,因此与西方发达国家同期诞生 第 1 章 我的安全世界观 3 的黑客精神是一脉相传的,他们崇尚分享、自由、免费的互联网精神,并热衷于分享自己的最 新研究成果。 接下来是黄金时代,这个时期以中美黑客大战为标志。在这个历史背景下,黑客这个特殊 的群体一下子几乎吸引了社会的所有眼球,而此时黑客圈子所宣扬的黑客文化以及黑客技术的 独特魅力也吸引了无数的青少年走上这条道路。自此事件后,各种黑客组织如雨后春笋般冒出。 此阶段的中国黑客,其普遍的特点是年轻,有活力,充满激情,但在技术上也许还不够成熟。 此时期黑客圈子里贩卖漏洞、恶意软件的现象开始升温,同时因为黑客群体的良莠不齐,也开 始出现以赢利为目的的攻击行为,黑色产业链逐渐成型。 最后是黑暗时代,这个阶段从几年前开始一直延续到今天,也许还将继续下去。在这个时 期黑客组织也遵循着社会发展规律,优胜劣汰,大多数的黑客组织没有坚持下来。在上一个时 期非常流行的黑客技术论坛越来越缺乏人气,最终走向没落。所有门户型的漏洞披露站点,也 不再公布任何漏洞相关的技术细节。 伴随着安全产业的发展,黑客的功利性越来越强。黑色产业链开始成熟,这个地下产业每 年都会给互联网造成数十亿的损失。而在上一个时期技术还不成熟的黑客们,凡是坚持下来的, 都已经成长为安全领域的高级人才,有的在安全公司贡献着自己的专业技能,有的则带着非常 强的技术进入了黑色产业。此时期的黑客群体因为互相之间缺失信任已经不再具有开放和分享 的精神,最为纯粹的黑客精神实质上已经死亡。 整个互联网笼罩在黑色产业链的阴影之下,每年数十亿的经济损失和数千万的网民受害, 以及黑客精神的死亡,使得我们没有理由不把此时称为黑暗时代。也许黑客精神所代表的 Open、 Free、Share,真的一去不复返了! 1.1.2 黑客技术的发展历程 从黑客技术发展的角度看,在早期,黑客攻击的目标以系统软件居多。一方面,是由于这 个时期的 Web 技术发展还远远不成熟;另一方面,则是因为通过攻击系统软件,黑客们往往能 够直接获取 root 权限。这段时期,涌现出了非常多的经典漏洞以及“exploit”。比如著名的黑 客组织 TESO,就曾经编写过一个攻击 SSH 的 exploit,并公然在 exploit 的 banner 中宣称曾经 利用这个 exploit 入侵过 cia.gov(美国中央情报局)。 下面是这个exploit1 1 的一些信息。 root@plac /bin >> ./ssh linux/x86 sshd1 exploit by zip/TESO (zip@james.kalifornia.com) - ripped from openssh 2.2.0 src http://staff.washington.edu/dittrich/misc/ssh-analysis.txt 白帽子讲 Web 安全 4 greets: mray, random, big t, sh1fty, scut, dvorak ps. this sploit already owned cia.gov :/ **please pick a type** Usage: ./ssh host [options] Options: -p port -b base Base address to start bruteforcing distance, by default 0x1800, goes as high as 0x10000 -t type -d debug mode -o Add this to delta_min types: 0: linux/x86 ssh.com 1.2.26-1.2.31 rhl 1: linux/x86 openssh 1.2.3 (maybe others) 2: linux/x86 openssh 2.2.0p1 (maybe others) 3: freebsd 4.x, ssh.com 1.2.26-1.2.31 rhl 有趣的是,这个 exploit 还曾经出现在著名电影《黑客帝国 2》中: 电影《黑客帝国 2》 放大屏幕上的文字可以看到: 电影《黑客帝国 2》中使用的著名 exploit 第 1 章 我的安全世界观 5 在早期互联网中,Web 并非互联网的主流应用,相对来说,基于 SMTP、POP3、FTP、IRC 等协议的服务拥有着绝大多数的用户。因此黑客们主要的攻击目标是网络、操作系统以及软件 等领域,Web 安全领域的攻击与防御技术均处于非常原始的阶段。 相对于那些攻击系统软件的 exploit 而言,基于 Web 的攻击,一般只能让黑客获得一个较 低权限的账户,对黑客的吸引力远远不如直接攻击系统软件。 但是时代在发展,防火墙技术的兴起改变了互联网安全的格局。尤其是以 Cisco、华为等 为代表的网络设备厂商,开始在网络产品中更加重视网络安全,最终改变了互联网安全的走向。 防火墙、ACL 技术的兴起,使得直接暴露在互联网上的系统得到了保护。 比如一个网站的数据库,在没有保护的情况下,数据库服务端口是允许任何人随意连接的; 在有了防火墙的保护后,通过 ACL 可以控制只允许信任来源的访问。这些措施在很大程度上 保证了系统软件处于信任边界之内,从而杜绝了大部分的攻击来源。 2003 年的冲击波蠕虫是一个里程碑式的事件,这个针对 Windows 操作系统 RPC 服务(运 行在 445 端口)的蠕虫,在很短的时间内席卷了全球,造成了数百万台机器被感染,损失难以 估量。在此次事件后,网络运营商们很坚决地在骨干网络上屏蔽了 135、445 等端口的连接请 求。此次事件之后,整个互联网对于安全的重视达到了一个空前的高度。 运营商、防火墙对于网络的封锁,使得暴露在互联网上的非 Web 服务越来越少,且 Web 技术的成熟使得 Web 应用的功能越来越强大,最终成为了互联网的主流。黑客们的目光,也渐 渐转移到了 Web 这块大蛋糕上。 实际上,在互联网安全领域所经历的这个阶段,还有另外一个重要的分支,即桌面软 件安全,或者叫客户端软件安全。其代表是浏览器攻击。一个典型的攻击场景是,黑客构 造一个恶意网页,诱使用户使用浏览器访问该网页,利用浏览器中存在的某些漏洞,比如 一个缓冲区溢出漏洞,执行 shellcode,通常是下载一个木马并在用户机器里执行。常见的 针对桌面软件的攻击目标,还包括微软的 Office 系列软件、Adobe Acrobat Reader、多媒体 播放软件、压缩软件等装机量大的流行软件,都曾经成为黑客们的最爱。但是这种攻击, 和本书要讨论的 Web 安全还是有着本质的区别,所以即使浏览器安全是 Web 安全的重要 组成部分,但在本书中,也只会讨论浏览器和 Web 安全有关的部分。 白帽子讲 Web 安全 6 1.1.3 Web 安全的兴起 Web 攻击技术的发展也可以分为几个阶段。在 Web 1.0 时代,人们更多的是关注服务器端 动态脚本的安全问题,比如将一个可执行脚本(俗称 webshell)上传到服务器上,从而获得权 限。动态脚本语言的普及,以及 Web 技术发展初期对安全问题认知的不足导致很多“血案”的 发生,同时也遗留下很多历史问题,比如 PHP 语言至今仍然只能靠较好的代码规范来保证没 有文件包含漏洞,而无法从语言本身杜绝此类安全问题的发生。 SQL 注入的出现是 Web 安全史上的一个里程碑,它最早出现大概是在 1999 年,并很快就 成为 Web 安全的头号大敌。就如同缓冲区溢出出现时一样,程序员们不得不日以继夜地去修改 程序中存在的漏洞。黑客们发现通过 SQL 注入攻击,可以获取很多重要的、敏感的数据,甚 至能够通过数据库获取系统访问权限,这种效果并不比直接攻击系统软件差,Web 攻击一下子 就流行起来。SQL 注入漏洞至今仍然是 Web 安全领域中的一个重要组成部分。 XSS(跨站脚本攻击)的出现则是 Web 安全史上的另一个里程碑。实际上,XSS 的出现时 间和 SQL 注入差不多,但是真正引起人们重视则是在大概 2003 年以后。在经历了 MySpace 的 XSS 蠕虫事件后,安全界对 XSS 的重视程度提高了很多,OWASP 2007 TOP 10 威胁甚至把 XSS 排在榜首。 伴随着 Web 2.0 的兴起,XSS、CSRF 等攻击已经变得更为强大。Web 攻击的思路也从服 务器端转向了客户端,转向了浏览器和用户。黑客们天马行空的思路,覆盖了 Web 的每一个环 节,变得更加的多样化,这些安全问题,在本书后续的章节中会深入地探讨。 Web 技术发展到今天,构建出了丰富多彩的互联网。互联网业务的蓬勃发展,也催生出了 许多新兴的脚本语言,比如 Python、Ruby、NodeJS 等,敏捷开发成为互联网的主旋律。而手 机技术、移动互联网的兴起,也给 HTML 5 带来了新的机遇和挑战。与此同时,Web 安全技术, 也将紧跟着互联网发展的脚步,不断地演化出新的变化。 1.2 黑帽子,白帽子 正如一个硬币有两面一样,“黑客”也有好坏之分。在黑客的世界中,往往用帽子的颜色 来比喻黑客的好坏。白帽子,则是指那些精通安全技术,但是工作在反黑客领域的专家们;而 黑帽子,则是指利用黑客技术造成破坏,甚至进行网络犯罪的群体。 同样是研究安全,白帽子和黑帽子在工作时的心态是完全不同的。 对于黑帽子来说,只要能够找到系统的一个弱点,就可以达到入侵系统的目的;而对于白 帽子来说,必须找到系统的所有弱点,不能有遗漏,才能保证系统不会出现问题。这种差异是 由于工作环境与工作目标的不同所导致的。白帽子一般为企业或安全公司服务,工作的出发点 就是要解决所有的安全问题,因此所看所想必然要求更加的全面、宏观;黑帽子的主要目的是 第 1 章 我的安全世界观 7 要入侵系统,找到对他们有价值的数据,因此黑帽子只需要以点突破,找到对他们最有用的一 点,以此渗透,因此思考问题的出发点必然是有选择性的、微观的。 从对待问题的角度来看,黑帽子为了完成一次入侵,需要利用各种不同漏洞的组合来达到 目的,是在不断地组合问题;而白帽子在设计解决方案时,如果只看到各种问题组合后产生的 效果,就会把事情变复杂,难以细致入微地解决根本问题,所以白帽子必然是在不断地分解问 题,再对分解后的问题逐个予以解决。 这种定位的不对称,也导致了白帽子的安全工作比较难做。“破坏永远比建设容易”,但凡 事都不是绝对的。要如何扭转这种局面呢?一般来说,白帽子选择的方法,是克服某种攻击方 法,而并非抵御单次的攻击。比如设计一个解决方案,在特定环境下能够抵御所有已知的和未 知的 SQL Injection 问题。假设这个方案的实施周期是 3 个月,那么执行 3 个月后,所有的 SQL Injection 问题都得到了解决,也就意味着黑客再也无法利用 SQL Injection 这一可能存在的弱点 入侵网站了。如果做到了这一点,那么白帽子们就在 SQL Injection 的局部对抗中化被动为主 动了。 但这一切都是理想状态,在现实世界中,存在着各种各样不可回避的问题。工程师们很喜 欢一句话:“No Patch For Stupid!”,在安全领域也普遍认为:“最大的漏洞就是人!”。写得再好 的程序,在有人参与的情况下,就可能会出现各种各样不可预知的情况,比如管理员的密码有 可能泄露,程序员有可能关掉了安全的配置参数,等等。安全问题往往发生在一些意想不到的 地方。 另一方面,防御技术在不断完善的同时,攻击技术也在不断地发展。这就像一场军备竞赛, 看谁跑在前面。白帽子们刚把某一种漏洞全部堵上,黑帽子们转眼又会玩出新花样。谁能在技 术上领先,谁就能占据主动。互联网技术日新月异,在新技术领域的发展中,也存在着同样的 博弈过程。可现状是,如果新技术不在一开始就考虑安全设计的话,防御技术就必然会落后于 攻击技术,导致历史不断地重复。 1.3 返璞归真,揭秘安全的本质 讲了很多题外话,最终回到正题上。这是一本讲 Web 安全的书,在本书中除了讲解必要的 攻击技术原理之外,最终重心还是要放在防御的思路和实现的技术上。 在进行具体技术的讲解之前,我们需要先清楚地认识到“安全的本质”,或者说,“安全问 题的本质 ”。 安全是什么?什么样的情况下会产生安全问题?我们要如何看待安全问题?只有搞明白 了这些最基本的问题,才能明白一切防御技术的出发点,才能明白为什么我们要这样做,要那 样做。 白帽子讲 Web 安全 8 在武侠小说中,一个真正的高手,对武功有着最透彻、最本质的理解,达到了返璞归真的 境界。在安全领域,笔者认为搞明白了安全的本质,就好比学会了“独孤九剑”,天下武功万 变不离其宗,遇到任何复杂的情况都可以轻松应对,设计任何的安全方案也都可以信手拈来了。 那么,一个安全问题是如何产生的呢?我们不妨先从现实世界入手。火车站、机场里,在 乘客们开始正式旅程之前,都有一个必要的程序:安全检查。机场的安全检查,会扫描乘客的 行李箱,检查乘客身上是否携带了打火机、可燃液体等危险物品。抽象地说,这种安全检查, 就是过滤掉有害的、危险的东西。因为在飞行的过程中,飞机远离地面,如果发生危险,将会 直接危害到乘客们的生命安全。因此,飞机是一个高度敏感和重要的区域,任何有危害的物品 都不应该进入这一区域。为达到这一目标,登机前的安全检查就是一个非常有必要的步骤。 从安全的角度来看,我们将不同重要程度的区域划分出来: 安全检查的过程按照需要进行过滤 通过一个安全检查(过滤、净化)的过程,可以梳理未知的人或物,使其变得可信任。被 划分出来的具有不同信任级别的区域,我们称为信任域,划分两个不同信任域之间的边界,我 们称为信任边界。 数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的 信任域流向高等级的信任域,则需要经过信任边界的安全检查。 我们在机场通过安检后,想要从候机厅出来,是不需要做检查的;但是想要再回到候机厅, 则需要再做一次安全检查,就是这个道理。 笔者认为,安全问题的本质是信任的问题。 一切的安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须有 一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水, 无根之木,无法设计,也无法完成。 举例来说,假设我们有份很重要的文件要好好保管起来,能想到的一个方案是把文件“锁” 到抽屉里。这里就包含了几个基本的假设,首先,制作这把锁的工匠是可以信任的,他没有私 第 1 章 我的安全世界观 9 自藏一把钥匙;其次,制作抽屉的工匠没有私自给抽屉装一个后门;最后,钥匙还必须要保管 在一个不会出问题的地方,或者交给值得信任的人保管。反之,如果我们一切都不信任,那么 也就不可能认为文件放在抽屉里是安全的。 当制锁的工匠无法打开锁时,文件才是安全的,这是我们的假设前提之一。但是如果那个 工匠私自藏有一把钥匙,那么这份文件也就不再安全了。这个威胁存在的可能性,依赖于对工 匠的信任程度。如果我们信任工匠,那么在这个假设前提下,我们就能确定文件的安全性。这 种对条件的信任程度,是确定对象是否安全的基础。 在现实生活中,我们很少设想最极端的前提条件,因为极端的条件往往意味者小概率以及 高成本,因此在成本有限的情况下,我们往往会根据成本来设计安全方案,并将一些可能性较 大的条件作为决策的主要依据。 比如在设计物理安全时,根据不同的地理位置、不同的政治环境等,需要考虑台风、地震、 战争等因素。但在考虑、设计这些安全方案时,根据其发生的可能性,需要有不同的侧重点。 比如在大陆深处,考虑台风的因素则显得不太实际;同样的道理,在大陆板块稳定的地区,考 虑地震的因素也会带来较高的成本。而极端的情况比如“彗星撞击地球后如何保证机房不受影 响”的问题,一般都不在考虑之中,因为发生的可能性太小。 从另一个角度来说,一旦我们作为决策依据的条件被打破、被绕过,那么就会导致安全假 设的前提条件不再可靠,变成一个伪命题。因此,把握住信任条件的度,使其恰到好处,正是 设计安全方案的难点所在,也是安全这门学问的艺术魅力所在。 1.4 破除迷信,没有银弹 在解决安全问题的过程中,不可能一劳永逸,也就是说“没有银弹”。 一般来说,人们都会讨厌麻烦的事情,在潜意识里希望能够让麻烦越远越好。而安全,正 是一件麻烦的事情,而且是无法逃避的麻烦。任何人想要一劳永逸地解决安全问题,都属于一 相情愿,是“自己骗自己”,是不现实的。 安全是一个持续的过程。 自从互联网有了安全问题以来,攻击和防御技术就在不断碰撞和对抗的过程中得到发展。 从微观上来说,在某一时期可能某一方占了上风;但是从宏观上来看,某一时期的攻击或防御 技术,都不可能永远有效,永远用下去。这是因为防御技术在发展的同时,攻击技术也在不断 发展,两者是互相促进的辩证关系。以不变的防御手段对抗不断发展的攻击技术,就犯了刻舟 求剑的错误。在安全的领域中,没有银弹。 很多安全厂商在推销自己产品时,会向用户展示一些很美好的蓝图,似乎他们的产品无所 不能,购买之后用户就可以睡得安稳了。但实际上,安全产品本身也需要不断地升级,也需要 白帽子讲 Web 安全 10 有人来运营。产品本身也需要一个新陈代谢的过程,否则就会被淘汰。在现代的互联网产品中, 自动升级功能已经成为一个标准配置,一个有活力的产品总是会不断地改进自身。 微软在发布 Vista 时,曾信誓旦旦地保证这是有史以来最安全的操作系统。我们看到了微 软的努力,在 Vista 下的安全问题确实比它的前辈们(Windows XP、Windows 2000、Windows 2003 等)少了许多,尤其是高危的漏洞。但即便如此,在 2008 年的 Pwn2own 竞赛上,Vista 也被黑 客们攻击成功。Pwn2own 竞赛是每年举行的让黑客们任意攻击操作系统的一次盛会,一般黑客 们都会提前准备好 0day 漏洞的攻击程序,以求在 Pwn2own 上一举夺魁。 黑客们在不断地研究和寻找新的攻击技术,作为防御的一方,没有理由不持续跟进。微软 近几年在产品的安全中做得越来越好,其所推崇的安全开发流程,将安全检查贯穿于整个软件 生命周期中,经过实践检验,证明这是一条可行的道路。对每一个产品,都要持续地实施严格 的安全检查,这是微软通过自身的教训传授给业界的宝贵经验。而安全检查本身也需要不断更 新,增加针对新型攻击方式的检测与防御方案。 1.5 安全三要素 既然安全方案的设计与实施过程中没有银弹,注定是一个持续进行的过程,那么我们该如 何开始呢?其实安全方案的设计也有着一定的思路与方法可循,借助这些方法,能够理清我们 的思路,帮助我们设计出合理、优秀的解决方案。 因为信任关系被破坏,从而产生了安全问题。我们可以通过信任域的划分、信任边界的确 定,来发现问题是在何处产生的。这个过程可以让我们明确目标,那接下来该怎么做呢? 在设计安全方案之前,要正确、全面地看待安全问题。 要全面地认识一个安全问题,我们有很多种办法,但首先要理解安全问题的组成属性。前 人通过无数实践,最后将安全的属性总结为安全三要素,简称 CIA 安全三要素是安全的基本组成元素,分别是机密性(Confidentiality)、完整 性( Integrity)、 可用性(Availability)。 机密性要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。 比如在前文的例子中,如果文件不是放在抽屉里,而是放在一个透明的玻璃盒子里,那么 虽然外人无法直接取得文件,但因为玻璃盒子是透明的,文件内容可能还是会被人看到,所以 不符合机密性要求。但是如果给文件增加一个封面,掩盖了文件内容,那么也就起到了隐藏的 效果,从而满足了机密性要求。可见,我们在选择安全方案时,需要灵活变通,因地制宜,没 有一成不变的方案。 完整性则要求保护数据内容是完整、没有被篡改的。常见的保证一致性的技术手段是数字 第 1 章 我的安全世界观 11 签名。 传说清朝康熙皇帝的遗诏,写的是“传位十四子”,被当时还是四阿哥的胤禛篡改了遗诏, 变成了“传位于四子”。姑且不论传说的真实性,在故事中,对这份遗诏的保护显然没有达到 完整性要求。如果在当时有数字签名等技术,遗诏就很难被篡改。从这个故事中也可以看出数 据的完整性、一致性的重要意义。 可用性要求保护资源是“随需而得”。 假设一个停车场里有 100 个车位,在正常情况下,可以停 100 辆车。但是在某一天,有个 坏人搬了 100 块大石头,把每个车位都占用了,停车场无法再提供正常服务。在安全领域中 这种攻击叫做拒绝服务攻击,简称 DoS(Denial of Service)。拒绝服务攻击破坏的是安全的 可用性。 在安全领域中,最基本的要素就是这三个,后来还有人想扩充这些要素,增加了诸如可审 计性、不可抵赖性等,但最最重要的还是以上三个要素。在设计安全方案时,也要以这三个要 素为基本的出发点,去全面地思考所面对的问题。 1.6 如何实施安全评估 有了前面的基础,我们就可以正式开始分析并解决安全问题了。一个安全评估的过程,可 以简单地分为 4 个阶段:资产等级划分、威胁分析、风险分析、确认解决方案。 安全评估的过程 资产等级划分 威胁分析 确认解决方案 风险分析 白帽子讲 Web 安全 12 一般来说,按照这个过程来实施安全评估,在结果上不会出现较大的问题。这个实施的过 程是层层递进的,前后之间有因果关系。 如果面对的是一个尚未评估的系统,那么应该从第一个阶段开始实施;如果是由专职的安 全团队长期维护的系统,那么有些阶段可以只实施一次。在这几个阶段中,上一个阶段将决定 下一个阶段的目标,需要实施到什么程度。 1.6.1 资产等级划分 资产等级划分是所有工作的基础,这项工作能够帮助我们明确目标是什么,要保护什么。 我们前面提到安全三要素时,机密性和完整性都是与数据相关的,在可用性的定义里,笔 者则用到了“资源”一词。“资源”这个概念描述的范围比数据要更加广阔,但很多时候,资 源的可用性也可以理解为数据的可用性。 在互联网的基础设施已经比较完善的今天,互联网的核心其实是由用户数据驱动的——用 户产生业务,业务产生数据。互联网公司除了拥有一些固定资产,如服务器等死物外,最核心 的价值就是其拥有的用户数据,所以—— 互联网安全的核心问题,是数据安全的问题。 这与我们做资产评估又有什么关系呢?有,因为对互联网公司拥有的资产进行等级划分, 就是对数据做等级划分。有的公司最关心的是客户数据,有的公司最关心的是员工资料信息, 根据各自业务的不同,侧重点也不同。做资产等级划分的过程,需要与各个业务部门的负责人 一一沟通,了解公司最重要的资产是什么,他们最看重的数据是什么。通过访谈的形式,安全 部门才能熟悉、了解公司的业务,公司所拥有的数据,以及不同数据的重要程度,为后续的安 全评估过程指明方向。 当完成资产等级划分后,对要保护的目标已经有了一个大概的了解,接下来就是要划分信 任域和信任边界了。通常我们用一种最简单的划分方式,就是从网络逻辑上来划分。比如最重 要的数据放在数据库里,那么把数据库的服务器圈起来;Web 应用可以从数据库中读/写数据, 并对外提供服务,那再把 Web 服务器圈起来;最外面是不可信任的 Internet。 第 1 章 我的安全世界观 13 简单网站信任模型 这是最简单的例子,在实际中会遇到比这复杂许多的情况。比如同样是两个应用,互相之 间存在数据交互业务,那么就要考虑这里的数据交互对于各自应用来说是否是可信的,是否应 该在两个应用之间划一个边界,然后对流经边界的数据做安全检查。 1.6.2 威胁分析 信任域划好之后,我们如何才能确定危险来自哪里呢?在安全领域里,我们把可能造成危 害的来源称为威胁(Threat),而把可能会出现的损失称为风险(Risk)。风险一定是和损失联 系在一起的,很多专业的安全工程师也经常把这两个概念弄混,在写文档时张冠李戴。现在把 这两个概念区分好,有助于我们接下来要提到的“威胁建模”和“风险分析”两个阶段,这两 个阶段的联系是很紧密的。 什么是威胁分析?威胁分析就是把所有的威胁都找出来。怎么找?一般是采用头脑风暴 法。当然,也有一些比较科学的方法,比如使用一个模型,帮助我们去想,在哪些方面有可能 会存在威胁,这个过程能够避免遗漏,这就是威胁建模。 在本书中介绍一种威胁建模的方法,它最早是由微软提出的,叫做 STRIDE 模型。 STRIDE 是 6 个单词的首字母缩写,我们在分析威胁时,可以从以下 6 个方面去考虑。 威 胁 定 义 对应的安全属性 Spoofing(伪装) 冒充他人身份 认证 Tampering(篡改) 修改数据或代码 完整性 Repudiation(抵赖) 否认做过的事情 不可抵赖性 InformationDisclosure(信息泄露) 机密信息泄露 机密性 Denial of Service(拒绝服务) 拒绝服务 可用性 Elevation of Privilege(提升权限) 未经授权获得许可 授权 在进行威胁分析时,要尽可能地不遗漏威胁,头脑风暴的过程可以确定攻击面(Attack Surface)。 白帽子讲 Web 安全 14 在维护系统安全时,最让安全工程师沮丧的事情就是花费很多的时间与精力实施安全方 案,但是攻击者却利用了事先完全没有想到的漏洞(漏洞的定义:系统中可能被威胁利用以造 成危害的地方。)完成入侵。这往往就是由于在确定攻击面时,想的不够全面而导致的。 以前有部老电影叫做《智取华山》,是根据真实事件改编的。1949 年 5 月中旬,打响了“陕 中战役”,国民党保安第 6 旅旅长兼第 8 区专员韩子佩率残部 400 余人逃上华山,企图凭借“自 古华山一条道”的天险负隅顽抗。路东总队决定派参谋刘吉尧带侦察小分队前往侦察,刘吉尧率 领小分队,在当地村民的带领下,找到了第二条路:爬悬崖!克服种种困难,最终顺利地完成了 任务。战后,刘吉尧光荣地出席了全国英模代表大会,并被授予“全国特等战斗英雄”荣誉称号。 我们用安全眼光来看这次战斗。国民党部队在进行“威胁分析”时,只考虑到“自古华山 一条道”,所以在正路上布重兵,而完全忽略了其他的可能。他们“相信”其他道路是不存在 的,这是他们实施安全方案的基础,而一旦这个信任基础不存在了,所有的安全方案都将化作 浮云,从而被共产党的部队击败。 所以威胁分析是非常重要的一件事情,很多时候还需要经常回顾和更新现有的模型。可能 存在很多威胁,但并非每个威胁都会造成难以承受的损失。一个威胁到底能够造成多大的危害, 如何去衡量它?这就要考虑到风险了。我们判断风险高低的过程,就是风险分析的过程。在“风 险分析”这个阶段,也有模型可以帮助我们进行科学的思考。 1.6.3 风险分析 风险由以下因素组成: Risk = Probability * Damage Potential 影响风险高低的因素,除了造成损失的大小外,还需要考虑到发生的可能性。地震的危害 很大,但是地震、火山活动一般是在大陆板块边缘频繁出现,比如日本、印尼就处于这些地理 位置,因此地震频发;而在大陆板块中心,若是地质结构以整块的岩石为主,则不太容易发生 地震,因此地震的风险就要小很多。我们在考虑安全问题时,要结合具体情况,权衡事件发生 的可能性,才能正确地判断出风险。 如何更科学地衡量风险呢?这里再介绍一个 DREAD 模型,它 也是由微软提出的。DREAD 也是几个单词的首字母缩写,它指导我们应该从哪些方面去判断一个威胁的风险程度。 等 级 高(3) 中(2) 低(1) Damage Potential 获取完全验证权限;执行管理员操 作;非法上传文件 泄露敏感信息 泄露其他信息 Reproducibility 攻击者可以随意再次攻击 攻击者可以重复攻击,但有时间 限制 攻击者很难重复攻击 过程 Exploitability 初学者在短期内能掌握攻击方法 熟练的攻击者才能完成这次攻击 漏洞利用条件非常苛刻 Affected users 所有用户,默认配置,关键用户 部分用户,非默认配置 极少数用户,匿名用户 第 1 章 我的安全世界观 15 Discoverability 漏洞很显眼,攻击条件很容易获得 在私有区域,部分人能看到,需 要深入挖掘漏洞 发现该漏洞极其困难 在 DREAD 模型里,每一个因素都可以分为高、中、低三个等级。在上表中,高、中、低 三个等级分别以 3、2、1 的分数代表其权重值,因此,我们可以具体计算出某一个威胁的风险值。 以《智取华山》为例,如果国民党在威胁建模后发现存在两个主要威胁:第一个威胁是从 正面入口强攻,第二个威胁是从后山小路爬悬崖上来。那么,这两个威胁对应的风险分别计算 如下: 走正面的入口: Risk = D(3) + R(3) + E(3) + A(3) + D(3) = 3+3+3+3+3=15 走后山小路: Risk = D(3) + R(1) + E(1) + A(3) + D(1) = 3+1+1+3+1=9 如果我们把风险高低定义如下: 高危:12~15分 中危:8~11分 低危:0~7分 那么,正面入口是最高危的,必然要派重兵把守;而后山小路竟然是中危的,因此也不能 忽视。之所以会被这个模型判断为中危的原因,就在于一旦被突破,造成的损失太大,失败不 起,所以会相应地提高该风险值。 介绍完威胁建模和风险分析的模型后,我们对安全评估的整体过程应该有了一个大致的了 解。在任何时候都应该记住——模型是死的,人是活的,再好的模型也是需要人来使用的,在 确定攻击面,以及判断风险高低时,都需要有一定的经验,这也是安全工程师的价值所在。类 似 STRIDE 和 DREAD 的模型可能还有很多,不同的标准会对应不同的模型,只要我们觉得这 些模型是科学的,能够帮到我们,就可以使用。但模型只能起到一个辅助的作用,最终做出决 策的还是人。 1.6.4 设计安全方案 安全评估的产出物,就是安全解决方案。解决方案一定要有针对性,这种针对性是由资产 等级划分、威胁分析、风险分析等阶段的结果给出的。 设计解决方案不难,难的是如何设计一个好的解决方案。设计一个好的解决方案,是真正 考验安全工程师水平的时候。 很多人认为,安全和业务是冲突的,因为往往为了安全,要牺牲业务的一些易用性或者性 能,笔者不太赞同这种观点。从产品的角度来说,安全也应该是产品的一种属性。一个从未考 虑过安全的产品,至少是不完整的。 比如,我们要评价一个杯子是否好用,除了它能装水,能装多少水外,还要思考这个杯子 白帽子讲 Web 安全 16 内壁的材料是否会溶解在水里,是否会有毒,在高温时会不会熔化,在低温时是否易碎,这些 问题都直接影响用户使用杯子的安全性。 对于互联网来说,安全是要为产品的发展与成长保驾护航的。我们不能使用“粗暴”的安 全方案去阻碍产品的正常发展,所以应该形成这样一种观点:没有不安全的业务,只有不安全 的实现方式。产品需求,尤其是商业需求,是用户真正想要的东西,是业务的意义所在,在设 计安全方案时应该尽可能地不要改变商业需求的初衷。 作为安全工程师,要想的就是如何通过简单而有效的方案,解决遇到的安全问题。安全方 案必须能够有效抵抗威胁,但同时不能过多干涉正常的业务流程,在性能上也不能拖后腿。 好的安全方案对用户应该是透明的,尽可能地不要改变用户的使用习惯。 微软在推出 Windows Vista 时,有一个新增的功能叫 UAC,每当系统里的软件有什么敏感 动作时,UAC 就会弹出来询问用户是否允许该行为。这个功能在 Vista 众多失败的原因中是被 人诟病最多的一个。如果用户能够分辨什么样的行为是安全的,那么还要安全软件做什么?同 样的问题出现在很多主动防御的桌面安全保护软件中,它们动辄弹出个对话框询问用户是否允 许目标的行为,这是非常荒谬的用户体验。 好的安全产品或模块除了要兼顾用户体验外,还要易于持续改进。一个好的安全模块,同 时也应该是一个优秀的程序,从设计上也需要做到高聚合、低耦合、易于扩展。比如 Nmap 的 用户就可以自己根据需要写插件,实现一些更为复杂的功能,满足个性化需求。 最终,一个优秀的安全方案应该具备以下特点:  能够有效解决问题;  用户体验好;  高性能;  低耦合;  易于扩展与升级。 关于产品安全性的问题,在本书的“互联网业务安全”一章中还会继续深入阐述。 1.7 白帽子兵法 在上节讲述了实施安全评估的基本过程,安全评估最后的产出物就是安全方案,但在具体 设计安全方案时有什么样的技巧呢?本节将讲述在实战中可能用到的方法。 第 1 章 我的安全世界观 17 1.7.1 Secure By Default 原则 在设计安全方案时,最基本也最重要的原则就是“Secure by Default”。在做任何安全设计 时,都要牢牢记住这个原则。一个方案设计得是否足够安全,与有没有应用这个原则有很大的 关系。实际上,“Secure by Default”原则,也可以归纳为白名单、黑名单的思想。如果更多地 使用白名单,那么系统就会变得更安全。 1.7.1.1 黑名单、白名单 比如,在制定防火墙的网络访问控制策略时,如果网站只提供 Web 服务,那么正确的做法 是只允许网站服务器的 80 和 443 端口对外提供服务,屏蔽除此之外的其他端口。这是一种“白 名单”的做法;如果使用“黑名单”,则可能会出现问题。假设黑名单的策略是:不允许 SSH 端口对 Internet 开放,那么就要审计 SSH 的默认端口:22 端口是否开放了 Internet。但在实际 工作过程中,经常会发现有的工程师为了偷懒或图方便,私自改变了 SSH 的监听端口,比如 把 SSH 的端口从 22 改到了 2222,从而绕过了安全策略。 又比如,在网站的生产环境服务器上,应该限制随意安装软件,而需要制定统一的软件版 本规范。这个规范的制定,也可以选择白名单的思想来实现。按照白名单的思想,应该根据业 务需求,列出一个允许使用的软件以及软件版本的清单,在此清单外的软件则禁止使用。如果 允许工程师在服务器上随意安装软件的话,则可能会因为安全部门不知道、不熟悉这些软件而 导致一些漏洞,从而扩大攻击面。 在 Web 安全中,对白名单思想的运用也比比皆是。比如应用处理用户提交的富文本时,考 虑到 XSS 的问题,需要做安全检查。常见的 XSS Filter 一般是先对用户输入的 HTML 原文作 HTML Parse,解析成标签对象后,再针对标签匹配 XSS 的规则。这个规则列表就是一个黑白 名单。如果选择黑名单的思想,则这套规则里可能是禁用诸如 时,用户数据就被注入到代码片段中。解析这段脚本并执行的过程,是由浏览器来完成的—— 浏览器将用户数据里的 在这种情况下,

Gmail Clickjacking with drag and drop Attack

白帽子讲 Web 安全 134 Note: Clicking "ctrl + a" to select the ball, then drag it to the
mouth of the dolphin with the mouse.Make sure you have logged into GMAIL.


| |


Design by xisigr
这是一个非常精彩的案例。 5.5 ClickJacking 3.0:触屏劫持 到了 2010 年 9 月,智能手机上的“触屏劫持”攻击被斯坦福的安全研究者3  touchstart,手指触摸屏幕时发生; 公布,这意味 着ClickJacking的攻击方式更进一步。安全研究者将这种触屏劫持称为TapJacking。 以苹果公司的 iPhone 为代表,智能手机为人们提供了更先进的操控方式:触屏。从手机 OS 的角度来看,触屏实际上就是一个事件,手机 OS 捕捉这些事件,并执行相应的动作。 比如一次触屏操作,可能会对应以下几个事件: 3 http://seclab.stanford.edu/websec/framebusting/tapjacking.pdf 第 5 章 点击劫持(ClickJacking) 135  touchend,手指离开屏幕时发生;  touchmove,手指滑动时发生;  touchcancel,系统可取消 touch 事件。 通过将一个不可见的 iframe 覆盖到当前网页上,可以劫持用户的触屏操作。 触屏劫持原理示电图 而手机上的屏幕范围有限,手机浏览器为了节约空间,甚至隐藏了地址栏,因此手机上的 视觉欺骗可能会变得更加容易实施。比如下面这个例子: 手机屏幕的视觉欺骗 左边的图片,最上方显示了浏览器地址栏,同时攻击者在页面中画出了一个假的地址栏; 白帽子讲 Web 安全 136 中间的图片,真实的浏览器地址栏已经自动隐藏了,此时页面中只剩下假的地址栏; 右边的图片,是浏览器地址栏被正常隐藏的情况。 这种针对视觉效果的攻击可以被利用进行钓鱼和欺诈。 2010 年 12 月4,研究者发现在Android系统中实施TapJacking甚至可以修改系统的安全设置, 并同时给出了演示5 5.6 防御 ClickJacking 。 在未来,随着移动设备中浏览器功能的丰富,也许我们会看到更多 TapJacking 的攻击方式。 ClickJacking 是一种视觉上的欺骗,那么如何防御它呢?针对传统的 ClickJacking,一般是 通过禁止跨域的 iframe 来防范。 5.6.1 frame busting 通常可以写一段 JavaScript 代码,以禁止 iframe 的嵌套。这种方法叫 frame busting。比如 下面这段代码: if ( top.location != location ) { top.location = self.location; } 常见的 frame busting 有以下这些方式: if (top != self) if (top.location != self.location) if (top.location != location) if (parent.frames.length > 0) if (window != top) if (window.top !== window.self) if (window.self != window.top) if (parent && parent != window) if (parent && parent.frames && parent.frames.length>0) if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)) top.location = self.location top.location.href = document.location.href top.location.href = self.location.href top.location.replace(self.location) top.location.href = window.location.href top.location.replace(document.location) top.location.href = window.location.href top.location.href = "URL" document.write('') top.location = location 4 http://blog.mylookout.com/look-10-007-tapjacking/ 5 http://vimeo.com/17648348 第 5 章 点击劫持(ClickJacking) 137 top.location.replace(document.location) top.location.replace('URL') top.location.href = document.location top.location.replace(window.location.href) top.location.href = location.href self.parent.location = document.location parent.location.href = self.document.location top.location.href = self.location top.location = window.location top.location.replace(window.location.pathname) window.top.location = window.self.location setTimeout(function(){document.body.innerHTML='';},1); window.self.onload = function(evt){document.body.innerHTML='';} var url = window.location.href; top.location.replace(url) 但是 frame busting 也存在一些缺陷。由于它是用 JavaScript 写的,控制能力并不是特别强, 因此有许多方法可以绕过它。 比如针对 parent.location 的 frame busting,就可以采用嵌套多个 iframe 的方法绕过。假设 frame busting 代码如下: if ( top.location != self.location) { parent.location = self.location ; } 那么通过以下方式即可绕过上面的保护代码: Attacker top frame: