第一遍阅读这本书是在今年春节,那时读得太匆忙,加上对Web上存在的威胁了解不多,那时并不觉这本书较同类书籍有什么特别之处。
时隔3个月第二次阅读,醍醐灌顶,特别是讲解原理的部分,深入浅出,很好的梳理了各个知识点。
毫无疑问,这本书不久我还会读第三遍,不愧为安全从业必读书籍。
这本书的地位: 这本书在安全界地位非常高。首先这本书出版时间是2012年,时间比较早,
对后面出版的同类书籍有启蒙的意义,其次,2011年csdn发生拖库,2012年出版此书,
正如作者说的,成就中国互联网的安全启蒙运动。
这本书的意义:2012年以前的安全类图书走两个极端,纯理论或纯黑帽戏法。对初学者学习意义不大,
作者说:安全工程师不在乎拥有多少个0day,掌握多少技术,关键是对安全理解的深度,
思考安全问题的高度。掌握正确的思路看待安全问题,将诸事顺利。这也是本书内容取舍的依据。
这本书的内容:第一部分:安全开发的基本常识。
第二部分:客户端的脚本安全。XSS/CSRF等
第三部分:服务段的应用安全。SQL Injection/web容器漏洞等
第四部分:互联网公司安全运营关键点。账号被盗原因分析。
● 豆瓣评分8.2
● 内容详实,深入浅出,为读者讲述新层面上的技术知识
● 大量举例,增加实用性,在动手中思考理解
● 作者是阿里巴巴安全架构师
目录详情如下:
第一篇 世界观安全
第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作者简介
吴翰清,国内知名安全组织Ph4nt0m的创始人,精通各种攻击与防御技术。2005年加入阿里巴巴(中国)有限公司,现任阿里巴巴安全架构师,先后完成阿里巴巴、淘宝、支付宝的安全评估与安全体系建设工作。主导了阿里巴巴的安全开发流程建设工作,在应用安全领域内有丰富的经验。负责全集团WEB安全工作以及云计算安全。
————————————————————————————
第一篇 安全世界观
第一章 我的安全世界观
1.Web安全简史
网络犯罪的主要是脚本小子,黑客发展三个时期:启蒙、黄金、黑暗。黑暗的原因是现在缺乏信任。
黑客攻击的目标,曾经以系统软件居多,随着网络设备的ACL控制等技术,攻击转向Web应用。
攻击的手段,曾经以可执行动态脚本居多,随着Web应用遍地开花,手段更加多样化,如XSS。
2.黑帽子,白帽子
黑帽利用漏洞组合实现入侵,白帽先对收集系统弱点,再各个解决。
3.安全的本质
程序员可能会关掉安全的配置,密码可能泄露,安全问题往往出现在意想不到的地方。
安全的问题本质是信任的问题,黑暗时代黑客们互不信任,致使漏洞不能及时公布,得不得人们重视。
4.没有银弹
安全是件麻烦的事情,一劳永逸的安全是不现实的,就如刻舟求剑一样荒唐,恰到好处的安全是门艺术。
敏捷开发是当今的主旋律,同时也要做到安全检查要贯穿于整个软件生命周期中,微软正是这样做的。
对安全理解的高度,体现在设计方案时,要有一定的思路和方法可循,优秀的解决方案从来都是有迹可循的。
5.安全三要素
设计安全方案时以CIA为基本的出发点,去全面地思考所面对的问题。
6.如何实施安全评估
安全评估的过程:资产等级划分、威胁分析、风险分析、确认解决方案。
资产等级划分着重于数据价值,威胁分析着重于损失风险,风险分析着重于DREAD模型。
安全是要为产品的发展与成长保驾护航的,明白业务都是安全的,不安全的是实现方式。
7.安全开发常识
默认设置就很安全,白名单往往比黑名单更安全,最小特权原则,纵深防御原则。
数据和代码分离原则,不可预测原则。
8.小结
定义一个功能是否沦为漏洞,只看后果,不看过程。
不要指望所有人接受这是一个漏洞的事实,这是黑暗时代。
漏洞不是完全否定一个功能,换个角度,漏洞仅说明该功能应该被修正。
解决漏洞很痛苦,或许想想谁该为漏洞买单,漏洞的源头在哪里,开发者会好受些。第二篇 客户端脚本安全
第二章 浏览器安全
浏览器要具备安全功能,保护用户上网,同时浏览器安全技术也是浏览器厂商宣传竞争的法宝。
1.同源策略
默认情况下,同源的页面JS语句才可以读改页面,同时注意,不同源不允许读改页面,但是可以加载新的页面,如iframe嵌套页面。
同源要求,协议,域名,ip,端口都要相同。
不同源不允许读取页面也有例外的情况,那就是XMLHttpRequest跨域访问标准,靠HTTP头来授权。因为HTTP头不可被js控制,还是比较安全的。
Flash插件对于跨域,有自己的看法,它通过网站提供的crossdomain.xml来做出判断。2.浏览器沙盒
执行挂马的操作发生在浏览器端
抵抗挂马使用沙盒技术,沙盒泛指资源隔离类模块,如果需要访问外界资源,要经封装的api完成。
3.恶意网址拦截
恶意网站拦截通过按时从服务器更新网址黑名单完成。
恶意网址识别工作体现了互联网公司的研发实力,比如阿里云可以2分钟内发现一个新发布的淘宝钓鱼网站。
4.高速发展的浏览器安全
主流浏览器都开始支持使用EVSSL证书来对抗钓鱼网站。
IE8浏览器使用XSS Filter功能对抗反射型XSS。
浏览器插件带来便利的同时,也存在盗取密码的风险。第三章 跨站脚本攻击(XSS)
跨站脚本攻击XSS是客户端脚本安全的头号大敌。学习XSS的原理,有助于我们正确地去防御它。
1.XSS简介
XSS叫跨站脚本攻击,但是随着Web应用的复杂化,是否跨域已经不再重要。
XSS越来越流行的原因是,Web应用越来越复杂,情景越来越复杂。不同的情景产生不同的XSS
XSS分为两类,反射型XSS、存储型XSS、DOM Based XSS
反射型只是把用户端输入反射给浏览器
存储型危害比较大,会把恶意的脚本保存在服务器端。
DOM型因为历史原因被单独列一个分类,从效果上说也是反射型XSS。
通过修改页面的DOM节点造成危害。关键是闭合标签。
2.XSS攻击进阶
1.初探XSS Payload
XSS Payload就是我们常说的恶意脚本,这些脚本通常提前写好,被黑客用以完成各种功能。
最常见的XSS Payload是Cookie 劫持,我们可以用代理,把cookie复制出来到另一个浏览器执行登录。
网站一般会绑定客户端信息来抵抗Cookie劫持。
2.强大的XSS Payload
非法删除博客文章的案例:
Get删除法:只需要让博客的作者执行一段恶意的JS代码即可完成删除。
Post删除法:构造一个form表单,自动提交表单,或者拼接字符串完成构造DOM节点。或者通过XMLHttpRequest完成请求。
非法读邮件的案例:
先从URL地址获得用户ID加密后的值SID
然后构造完整的URL
使用XMLHttpRequest请求此URL
最后把内容传送到远程黑客手中
钓鱼的案例:通过JS 画出一个伪造的登录框,此时的页面是正常的,除了登陆框是伪造的。
信息收集:
识别用户浏览器信息,比如使用UserAgent,精细化分辨可以用js语句。
识别用户安装的软件,IE浏览器可以使用ActiveX控件识别classid,选择合适的漏洞入侵。
识别用户硬件信息,Flash有一个System.capabilities对象,能够查询客户端电脑中的硬件信息。
识别浏览器的插件,Firefox的插件,存放在DOM对象中,遍历DOM即可获得相关信息。
识别浏览器的扩展,Firefox的扩展有图片,如果加载图片成功,则扩展存在。
获取用户的真实IP地址,借助JRE,使用Attack API中获得本地IP地址的API。
抓取用户的本地信息,使用强大的Metasploit引擎。
3.XSS 攻击平台
学习使用XSS攻击平台有助于深入理解XSS的原理和危害
Attack API总结了很多可以直接使用的XSS Payload
BeEF曾经是最好的XSS演示平台
XSS-Proxy是一个轻量级的XSS攻击平台
4.终极武器:XSS Worm
以往的蠕虫是利用服务器软件的漏洞传播的,比如冲击波蠕虫RPC远程溢出漏洞。
互联网社区有许多可以互动的页面,一旦爆发XSS蠕虫将会快速传播开来。
用户之间交互的界面,如果发生存储型XSS,则比较容易发起XSS蠕虫攻击。
XSS注入容易,一旦发展成XSS蠕虫,有恶意行为,比如收集密码的蠕虫,破坏力将非常惊人。
5.调试JavaScript
Firebug是最好用的JS调试工具。
Fiddler是一个带修改包功能的,本地代理服务器。
HTTPWatch是一个纯粹的嗅探器,嗅探数据包,以浏览器插件形式存在。
6.XSS构造技巧
利用字符编码:
转义后的标签通常很安全,但是如果采用GBK编码就不安全了,利用GBK下的宽字节注入,可以吃掉转义字符 \
构造 %c1";alert(/xss/);// , 其中%c1 会和\ 结合,成功绕过转义。
长度限制:
服务器端对变量作了长度限制,因为恶意脚本比较长,写不进变量,所以攻击会失败,破解方法是,
法1:把脚本写在别处,如location.hash中,读出时,去掉第一个#号即可。
法2:利用注释符号,绕过长度限制。比如,第二个文本框允许写入更多字节,
可以用注释打通两个标签,恶意脚本得以写入页面,执行反射型XSS。
使用标签:作用是定义页面上使用相对路径标签的主机地址,可以用来劫持当前页面的相对地址标签,伪造图片等,
标签可以出现在页面任何地方,并作用于位于该标签之后的所有标签。
window.name的妙用:利用这个对象可以实现跨域、跨页面传递数据、缩短脚本的长度,如eval(name)。
7.变废为宝:Mission Importsible
Apache Expect Header XSS,服务器出错时,Expect头的内容会写入到客户端页面中,可能造成XSS攻击。
对于XSS攻击来说,JS语句无法控制HTTP头部,显然传统思路是玩不转的,
我们Flash帮忙,使用Flash构造请求,写入或注入HTTP头。
回旋镖攻击:假如A站有XSS存储型,B站有XSS反射型。用户处于A站浏览页面,可能会把B站的第三方Cookie泄露了。
火狐中页面标签可以发送第三方Cookie,IE则要借助form表单,表单不会拦截第三方Cookie的发送。
8.容易被忽视的角落:Flash XSS
Flash不仅可以成为帮凶,还可以是主犯,通过嵌入ActionScript脚本可以达到XSS的效果,网站开发者需要通过
对Flash的配置参数进行限制,最重要的参数是“allowScriptAccess”,以及“allowNetWorking”.
Flash XSS往往会被忽略,这个位置一旦出现漏洞,扫描工具或者代码审计软件都难以检测出来,常常是漏网之鱼。
9.真的高枕无忧吗:JavaScript开发框架。
DOM Based XSS是绝对存在的,因为JS的重要功能就是修改页面标签,这带来便利的同时也会造成潜在的DOM Based XSS
3.XSS的防御
防御XSS不仅仅是浏览器的工作,也需要网站安全开发人员配合。使用一些主流的XSS解决方案很有必要。
1.四两拨千斤:HttpOnly,防止JS语句读取Cookie。
Apache如果使用TRACE调试命令,可能会把HttpOnly Cookie读出来
2.输入检查:通过检查是否有非法字符,缺点是UI显示可能有问题,比如 1+1<3 有可能不能显示
3.输出检查:通过安全编码或者转义,完成HTML显示,让xss无法执行。
使用HtmlEncode,它的作用是将字符转换成HTMLEntiites。
使用JavascriptEncode,注意变量输出一定要在引号内。
注意:编码后的数据长度会发生变化,可能会引起bug。
4.正确地防御XSS:
XSS的本质是HTML注入,在正确的地方干正确的事情,URL使用URL编码,JS语句使用JSEncode,页面使用HTMLEncode
5.处理富文本:使用白名单过滤标签,使用富文本检测工具,如Anti-Samy。
6.防御DOM Based XSS:在正确的地方干正确的事情,URL使用URL编码,JS语句使用JSEncode,页面使用HTMLEncode
7.换个角度看XSS的风险:
存储型的XSS因为不改变页面URL的原有结构,有时候还能逃过一些IDS的检测。
实际工作中,不能仅仅从漏洞形成原理看问题,还要从业务风险的角度来看。
修补XSS漏洞工作量很大,我们要结合业务分析来重新定位每个XSS漏洞。