在2010年年中的时候,博文视点的张春雨先生找到我,希望我可以写一本关于云计算安全的书。当时云计算的概念正如日中天,但市面上关于云计算安全应该怎么做却缺乏足够的资料。我由于工作的关系接触这方面比较多,但考虑到云计算的未来尚未清晰,以及其他的种种原因,婉拒了张春雨先生的要求,转而决定写一本关于Web安全的书。
我的安全之路
我对安全的兴趣起源于中学时期。当时在盗版市场买到了一本没有书号的黑客手册,其中coolfire 的黑客教程令我印象深刻。此后在有限的能接触到互联网的机会里,我总会想方设法地寻找一些黑客教程,并以实践其中记载的方法为乐。
在2000年的时候,我进入了西安交通大学学习。在大学期间,最大的收获,是学校的计算机实验室平时会对学生开放。当时上网的资费仍然较贵,父母给我的生活费里,除了留下必要的生活所需费用之外,几乎全部投入在这里。也是在学校的计算机实验室里,让我迅速在这个领域中成长起来。
大学期间,在父母的资助下,我拥有了自己的第一台个人电脑,这加快了我成长的步伐。与此同时,我和一些互联网上志同道合的朋友,一起建立了一个技术型的安全组织,名字来源于我当时最喜爱的一部动漫:“幻影旅团”。历经十余载,“幻影”由于种种原因未能得以延续,但它却曾以论坛的形式培养出了当今安全行业中非常多的顶尖人才。这也是我在这短短二十余载人生中的最大成就与自豪。
得益于互联网的开放性,以及我亲手缔造的良好技术交流氛围,我几乎见证了全部互联网安全技术的发展过程。在前5年,我投入了大量精力研究渗透测试技术、缓冲区溢出技术、网络攻击技术等;而在后5年,出于工作需要,我把主要精力放在了对Web安全的研究上。
加入阿里巴巴
发生这种专业方向的转变,是因为在2005年,我在一位挚友的推荐下,加入了阿里巴巴。加入的过程颇具传奇色彩,在面试的过程中主管要求我展示自己的能力,于是我远程关闭了阿里巴巴内网上游运营商的一台路由设备,导致阿里巴巴内部网络中断。事后主管立即要求与运营商重新签订可用性协议。
大学时期的兴趣爱好,居然可以变成一份正经的职业(当时很多大学都尚未开设网络安全的课程与专业),这使得我的父母很震惊,同时也更坚定了我自己以此作为事业的想法。
在阿里巴巴我很快就崭露头角,曾经在内网中通过网络嗅探捕获到了开发总监的邮箱密码;也曾经在压力测试中一瞬间瘫痪了公司的网络;还有好几次,成功获取到了域控服务器的权限,从而可以以管理员的身份进入任何一位员工的电脑。
但这些工作成果,都远远比不上那厚厚的一摞网站安全评估报告让我更有成就感,因为我知道,网站上的每一个漏洞,都在影响着成千上万的用户。能够为百万、千万的互联网用户服务,让我倍感自豪。当时,Web正在逐渐成为互联网的核心,Web安全技术也正在兴起,于是我义无返顾地投入到对Web安全的研究中。
我于2007年以23岁之龄成为了阿里巴巴集团最年轻的技术专家。虽未有官方统计,但可能也是全集团里最年轻的高级技术专家,我于2010年获此殊荣。在阿里巴巴,我有幸见证了安全部门从无到有的建设过程。同时由于淘宝、支付宝草创,尚未建立自己的安全团队,因此我有幸参与了淘宝、支付宝的安全建设,为他们奠定了安全开发框架、安全开发流程的基础。
对互联网安全的思考
当时,我隐隐地感觉到了互联网公司安全,与传统的网络安全、信息安全技术的区别。就如同开发者会遇到的挑战一样,有很多问题,不放到一个海量用户的环境下,是难以暴露出来的。由于量变引起质变,所以管理10台服务器,和管理1万台服务器的方法肯定会有所区别;同样的,评估10名工程师的代码安全,和评估1000名工程师的代码安全,方法肯定也要有所不同。
互联网公司安全还有一些鲜明的特色,比如注重用户体验、注重性能、注重产品发布时间,因此传统的安全方案在这样的环境下可能完全行不通。这对安全工作提出了更高的要求和更大的挑战。
这些问题,使我感觉到,互联网公司安全可能会成为一门新的学科,或者说应该把安全技术变得更加工业化。可是我在书店中,却发现安全类目的书,要么是极为学术化的(一般人看不懂)教科书,要么就是极为娱乐化的(比如一些“黑客工具说明书”类型的书)说明书。极少数能够深入剖析安全技术原理的书,以我的经验看来,在工业化的环境中也会存在各种各样的问题。
这些问题,也就促使我萌发了一种写一本自己的书,分享多年来工作心得的想法。它将是一本阐述安全技术在企业级应用中实践的书,是一本大型互联网公司的工程师能够真正用得上的安全参考书。因此张春雨先生一提到邀请我写书的想法时,我没有做过多的思考,就答应了。
Web是互联网的核心,是未来云计算和移动互联网的最佳载体,因此Web安全也是互联网公司安全业务中最重要的组成部分。我近年来的研究重心也在于此,因此将选题范围定在了Web安全。但其实本书的很多思路并不局限于Web安全,而是可以放宽到整个互联网安全的方方面面之中。
掌握了以正确的思路去看待安全问题,在解决它们时,都将无往而不利。我在2007年的时候,意识到了掌握这种正确思维方式的重要性,因此我告知好友:安全工程师的核心竞争力不在于他能拥有多少个0day,掌握多少种安全技术,而是在于他对安全理解的深度,以及由此引申的看待安全问题的角度和高度。我是如此想的,也是如此做的。
因此在本书中,我认为最可贵的不是那一个个工业化的解决方案,而是在解决这些问题时,背后的思考过程。我们不是要做一个能够解决问题的方案,而是要做一个能够“漂亮地”解决问题的方案。这是每一名优秀的安全工程师所应有的追求。
安全启蒙运动
然而在当今的互联网行业中,对安全的重视程度普遍不高。有统计显示,互联网公司对安全的投入不足收入的百分之一。
在2011年岁末之际,中国互联网突然卷入了一场有史以来最大的安全危机。12月21日,国内最大的开发者社区CSDN被黑客在互联网上公布了600万注册用户的数据。更糟糕的是,CSDN在数据库中明文保存了用户的密码。接下来如同一场盛大的交响乐,黑客随后陆续公布了网易、人人、天涯、猫扑、多玩等多家大型网站的数据库,一时间风声鹤唳,草木皆兵。
这些数据其实在黑客的地下世界中已经辗转流传了多年,牵扯到了一条巨大的黑色产业链。这次的偶然事件使之浮出水面,公之于众,也让用户清醒地认识到中国互联网的安全现状有多么糟糕。
以往类似的事件我都会在博客上说点什么,但这次我保持了沉默。因为一来知道此种状况已经多年,网站只是在为以前的不作为而买单;二来要解决“拖库”的问题,其实是要解决整个互联网公司的安全问题,远非保证一个数据库的安全这么简单。这不是通过一段文字、一篇文章就能够讲清楚的。但我想最好的答案,可以在本书中找到。
经历这场危机之后,希望整个中国互联网,在安全问题的认识上,能够有一个新的高度。那这场危机也就物有所值,或许还能借此契机成就中国互联网的一场安全启蒙运动。
这是我的第一本书,也是我坚持自己一个人写完的书,因此可以在书中尽情地阐述自己的安全世界观,且对书中的任何错漏之处以及不成熟的观点都没有可以推卸责任的借口。
由于工作繁忙,写此书只能利用业余时间,交稿时间多次推迟,深感写书的不易。但最终能成书,则有赖于各位亲朋的支持,以及编辑的鼓励,在此深表感谢。本书中很多地方未能写得更为深入细致,实乃精力有限所致,尚请多多包涵。
关于白帽子
在安全圈子里,素有“白帽”、“黑帽”一说。
黑帽子是指那些造成破坏的黑客,而白帽子则是研究安全,但不造成破坏的黑客。白帽子均以建设更安全的互联网为己任。
我于2008年开始在国内互联网行业中倡导白帽子的理念,并联合了一些主要互联网公司的安全工程师,建立了白帽子社区,旨在交流工作中遇到的各种问题,以及经验心得。
本书名为《白帽子讲Web安全》,即是站在白帽子的视角,讲述Web安全的方方面面。虽然也剖析攻击原理,但更重要的是如何防范这些问题。同时也希望“白帽子”这一理念,能够更加的广为人知,为中国互联网所接受。
本书结构
全书分为4大篇共18章,读者可以通过浏览目录以进一步了解各篇章的内容。在有的章节末尾,还附上了笔者曾经写过的一些博客文章,可以作为延伸阅读以及本书正文的补充。
第一篇 我的安全世界观是全书的纲领。在此篇中先回顾了安全的历史,然后阐述了笔者对安全的看法与态度,并提出了一些思考问题的方式以及做事的方法。理解了本篇,就能明白全书中所涉及的解决方案在抉择时的取舍。
第二篇 客户端脚本安全就当前比较流行的客户端脚本攻击进行了深入阐述。当网站的安全做到一定程度后,黑客可能难以再找到类似注入攻击、脚本执行等高风险的漏洞,从而可能将注意力转移到客户端脚本攻击上。
客户端脚本安全与浏览器的特性息息相关,因此对浏览器的深入理解将有助于做好客户端脚本安全的解决方案。
如果读者所要解决的问题比较严峻,比如网站的安全是从零开始,则建议跳过此篇,先阅读下一篇“服务器端应用安全”,解决优先级更高的安全问题。
第三篇 服务器端应用安全就常见的服务器端应用安全问题进行了阐述。这些问题往往能引起非常严重的后果,在网站的安全建设之初需要优先解决这些问题,避免留下任何隐患。
第四篇 互联网公司安全运营提出了一个大安全运营的思想。安全是一个持续的过程,最终仍然要由安全工程师来保证结果。
在本篇中,首先就互联网业务安全问题进行了一些讨论,这些问题对于互联网公司来说有时候会比漏洞更为重要。
在接下来的两章中,首先阐述了安全开发流程的实施过程,以及笔者积累的一些经验。然后谈到了公司安全团队的职责,以及如何建立一个健康完善的安全体系。
本书也可以当做一本安全参考书,读者在遇到问题时,可以挑选任何所需要的章节进行阅读。
致谢
感谢我的妻子,她的支持是对我最大的鼓励。本书最后的成书时日,是陪伴在她的病床边完成的,我将铭记一生。
感谢我的父母,是他们养育了我,并一直在背后默默地支持我的事业,使我最终能有机会在这里写下这些话。
感谢我的公司阿里巴巴集团,它营造了良好的技术与实践氛围,使我能够有今天的积累。同时也感谢在工作中一直给予我帮助和鼓励的同事、上司,他们包括但不限于:魏兴国、汤城、刘志生、侯欣杰、林松英、聂万全、谢雄钦、徐敏、刘坤、李泽洋、肖力、叶怡恺。
感谢季昕华先生为本书作序,他一直是所有安全工作者的楷模与学习的对象。
也感谢博文视点的张春雨先生以及他的团队,是他们的努力使本书最终能与广大读者见面。他们的专业意见给了我很多的帮助。
最后特别感谢我的同事周拓,他对本书提出了很多有建设性的意见。
吴翰清
2012年1月于杭州
目录
《白帽子讲web安全》
第一篇 世界观安全
第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
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
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
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
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
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
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