内容简介:
《web应用安全权威指南》系日本web安全第一人德丸浩所创,是作者从业多年的经验总结。作者首先简要介绍了web应用的安全隐患以及产生原因,然后详细介绍了web安全的基础,如http、会话管理、同源策略等。此外还重点介绍了web应用的各种安全隐患,对其产生原理及对策进行了详尽的讲解。最后对如何提高web网站的安全性和开发安全的web应用所需要的管理进行了深入的探讨。本书可操作性强,读者可以通过下载已搭建的虚拟机环境亲自体验书中的各种安全隐患。
《web应用安全权威指南》适合web相关的开发人员特别是安全及测试人员阅读。
八大章节全面剖析,深入浅出地讲解了sql注入、xss、csrf等web开发人员必知的web安全知识。通过在vmware player虚拟机上对php样本的攻击,详细介绍了安全隐患产生的原理及应对方法,助你打造安全无虞的web应用。
作者简介:
德丸 浩
2008年创立HASH咨询公司,任董事长。主要从事网络安全性的诊断与咨询工作,并在工作之余通过博客普及网络安全知识。兼任KYOCERA Communication Systems股份有限公司技术顾问、独立行政法人信息处理推进机构(IPA)兼职研究员。Twitter ID为@ockeghem。
赵文
程序员,Ruby 语言爱好者。图灵电子书《关于 mruby 的一切》译者。个人博客: http://zhaowen.me
刘斌
程序员,关注于后台开发,Java/Ruby爱好者。个人主页:http://liubin.org
目录:
第1章 什么是 web应用的安全隐患1
1-1 安全隐患即“能用于作恶的bug”2
1-2 为什么存在安全隐患会有问题3
经济损失3
法律要求3
对用户造成不可逆的伤害4
欺骗用户4
被用于构建僵尸网络4
1-3 产生安全隐患的原因6
1-4 安全性 bug与安全性功能7
1-5 本书的结构8
第2章 搭建试验环境 9
2-1试验环境概要10
2-2 安装 vmware player11
什么是 vmware player11
下载 vmware player11
安装 vmware player12
2-3 安装虚拟机及运行确认14
虚拟机启动确认14
虚拟机的使用方法15
编辑 hosts文件16
使用 ping确认连接16
apache 与php的运行确认17
设置并确认邮箱账号17
2-4 安装 fiddler18
什么是 fiddler18
安装 fiddler18
fiddler 的运行确认及简单用法18
参考:虚拟机的数据一览19
参考:如果无法连接试验环境的pop3服务器20
第3章 web 安全基础:http、会话管理、同源策略21
3-1 http 与会话管理22
为什么要学习 http22
最简单的 http22
使用 fiddler观察http消息23
请求消息24
响应消息24
状态行25
响应头信息25
如果将 http比喻为对话25
输入-确认-注册模式26
post 方法28
消息体28
百分号编码29
referer29
get 和post的使用区别29
hidden 参数能够被更改30
将 hidden参数的更改比作对话32
hidden 参数的优点32
无状态的 http认证33
体验 basic认证33
专栏 认证与授权36
cookie 与会话管理36
使用 cookie的会话管理39
会话管理的拟人化解说39
会话 id泄漏的原因42
cookie 的属性42
专栏 cookie monster bug44
总结45
3-2 被动攻击与同源策略46
主动攻击与被动攻击46
主动攻击46
被动攻击46
恶意利用正规网站进行的被动攻击47
跨站被动攻击48
浏览器如何防御被动攻击48
沙盒49
同源策略49
应用程序安全隐患与被动攻击52
专栏 第三方 javascript53
javascript 以外的跨域访问54
frame 元素与iframe元素54
专栏 x-frame-options54
img 元素54
script 元素54
css55
form 元素的action属性55
总结56
第4章 web应用的各种安全隐患 57
4-1 web 应用的功能与安全隐患的对应关系58
安全隐患产生于何处58
注入型隐患59
总结60
4-2 输入处理与安全性61
什么是 web应用的输入处理61
检验字符编码62
转换字符编码62
检验并转换字符编码的实例62
专栏 字符编码的自动转换与安全性64
输入校验64
输入校验的目的64
输入校验与安全性65
二进制安全与空字节攻击65
仅校验输入值并不是安全性策略66
输入校验的依据是应用程序的规格67
哪些参数需要校验67
php 的正则表达式库67
使用正则表达式检验输入值的实例(1) 1~5 个字符的字母数字68
使用正则表达式检验输入值的实例(2) 住址栏70
专栏 请注意 mb_ereg中的d与w70
范例70
专栏 输入校验与框架71
总结72
参考:表示“非控制字符的字符”的正则表达式73
4-3 页面显示的相关问题75
4.3.1 跨站脚本(基础篇)75
概要75
攻击手段与影响76
xss 窃取cookie值76
通过 javascript攻击79
篡改网页80
反射型 xss与存储型xss82
安全隐患的产生原因84
html 转义的概要84
元素内容的 xss85
没有用引号括起来的属性值的 xss85
用引号括起来的属性值的 xss85
对策86
xss 对策的基础86
指定响应的字符编码87
xss 的辅助性对策88
对策总结89
参考:使用perl的对策示例89
使用 perl进行html转义的方法89
指定响应的字符编码89
4.3.2 跨站脚本(进阶篇)90
href 属性与src属性的xss91
生成 url时的对策.92
校验链接网址92
javascript 的动态生成92
事件绑定函数的 xss92
script 元素的xss94
javascript 字符串字面量动态生成的对策95
dom based xss97
允许 html标签或css时的对策99
参考:perl中转义unicode的函数99
4.3.3 错误消息导致的信息泄漏100
总结100
继续深入学习100
4-4 sql 调用相关的安全隐患101
4.4.1 sql 注入101
概要101
攻击手段与影响102
示例脚本解说102
错误消息导致的信息泄漏103
union select 致使的信息泄漏104
使用 sql注入绕过认证104
通过 sql注入攻击篡改数据106
其他攻击107
专栏 数据库中表名与列名的调查方法108
安全隐患的产生原因109
字符串字面量的问题109
针对数值的 sql注入攻击110
对策110
使用占位符拼接 sql语句111
专栏 采用 mdb2的原因111
为什么使用占位符会安全111
参考:like语句与通配符113
使用占位符的各种处理114
sql 注入的辅助性对策116
总结117
继续深入学习117
参考:无法使用占位符时的对策117
参考:perl+mysql的安全连接方法118
参考:php+pdo+mysql的安全连接方法118
参考:java+mysql的安全连接方法118
4-5 关键处理中引入的安全隐患120
4.5.1 跨站请求伪造(csrf)120
概要120
攻击手段与影响121
输入-执行”模式的 csrf攻击121
csrf 攻击与xss攻击124
存在确认页面时的 csrf攻击125
专栏 针对内部网络的 csrf攻击127
安全隐患的产生原因128
对策129
筛选出需要防范 csrf攻击的页面129
确认是正规用户自愿发送的请求130
专栏 令牌与一次性令牌131
csrf 的辅助性对策133
对策总结133
4-6 不完善的会话管理134
4.6.1 会话劫持的原因及影响134
预测会话 id134
窃取会话 id134
挟持会话 id135
会话劫持的方法总结135
会话劫持的影响135
4.6.2 会话 id可预测136
概要136
攻击手段与影响136
常见的会话 id生成方法136
使用推测出的会话 id尝试伪装137
伪装造成的影响137
安全隐患的产生原因137
对策138
改善 php的会话id的随机性的方法138
参考:自制会话管理机制产生的其他隐患139
4.6.3 会话 id嵌入url139
概要139
攻击手段与影响140
会话 id嵌入url所需的条件140
范例脚本解说141
通过 referer泄漏会话id所需的条件142
攻击流程142
事故性的会话 id泄漏143
影响144
安全隐患的产生原因144
对策144
php144
java servlet(j2ee)145
asp.net145
4.6.4 固定会话 id145
概要145
攻击手段与影响146
示例脚本介绍146
会话固定攻击解说148
登录前的会话固定攻击148
会话采纳151
仅在 cookie中保存会话id的网站固定会话id151
会话固定攻击的影响151
安全隐患的产生原因152
对策152
无法更改会话 id时采用令牌153
登录前的会话固定攻击的对策154
总结154
4-7 重定向相关的安全隐患155
4.7.1 自由重定向漏洞155
概要155
攻击手段与影响156
安全隐患的产生原因159
允许自由重定向的情况159
对策160
固定重定向的目标 url160
使用编号指定重定向的目标 url160
校验重定向的目标域名160
专栏 警告页面162
4.7.2 http 消息头注入162
概要162
攻击手段与影响163
重定向至外部域名165
专栏 http 响应截断攻击166
生成任意 cookie166
显示伪造页面168
安全隐患的产生原因170
专栏 http 消息头与换行171
对策171
对策 1:不将外界参数作为http响应消息头输出171
对策 2:执行以下两项内容171
专栏 php 的header函数中进行的换行符校验173
4.7.3 重定向相关的安全隐患总结173
4-8 cookie 输出相关的安全隐患174
4.8.1 cookie 的用途不当174
不该保存在 cookie中的数据174
参考:最好不要在cookie中保存数据的原因174
专栏 padding oracle 攻击与ms10-070176
4.8.2 cookie 的安全属性设置不完善176
概要176
攻击手段与影响177
关于抓包方法的注意点180
安全隐患的产生原因181
什么样的应用程序不能在 cookie中设置安全属性181
对策181
给保存会话 id的cookie设置安全属性的方法182
使用令牌的对策182
使用令牌能确保安全性的原因184
除安全属性外其他属性值需要注意的地方184
domain 属性184
path 属性185
expires 属性185
httponly 属性185
总结185
4-9 发送邮件的问题186
4.9.1 发送邮件的问题概要186
邮件头注入漏洞186
使用 hidden参数保存收件人信息186
参考:邮件服务器的开放转发187
4.9.2 邮件头注入漏洞187
概要187
攻击手段与影响188
攻击方式 1:添加收件人190
攻击方式 2:篡改正文191
通过邮件头注入攻击添加附件192
安全隐患的产生原因193
对策194
使用专门的程序库来发送邮件194
不将外界传入的参数包含在邮件头中194
发送邮件时确保外界传入的参数中不包含换行符195
邮件头注入的辅助性对策195
总结196
继续深入学习196
10-4 文件处理相关的问题197
4.10.1 目录遍历漏洞197
概要197
攻击手段与影响198
专栏 从脚本源码开始的一连串的信息泄漏200
安全隐患的产生原因200
对策201
避免由外界指定文件名201
文件名中不允许包含目录名201
专栏 basename 函数与空字节202
限定文件名中仅包含字母和数字202
总结203
4.10.2 内部文件被公开203
概要203
攻击手段与影响203
安全隐患的产生原因204
对策205
参考:apache中隐藏特定文件的方法205
11-4 调用 os命令引起的安全隐患206
4.11.1 os 命令注入206
概要206
攻击手段与影响207
调用 sendmail命令发送邮件207
os 命令注入攻击与影响209
安全隐患的产生原因210
在 shell中执行多条命令210
使用了内部调用 shell的函数211
安全隐患的产生原因总结212
对策212
在设计阶段决定对策方针213
选择不调用 os命令的实现方法213
避免使用内部调用 shell的函数213
不将外界输入的字符串传递给命令行参数 216
使用安全的函数对传递给 os命令的参数进行转义216
os 命令注入攻击的辅助性对策217
参考:内部调用shell的函数218
12-4 文件上传相关的问题219
4.12.1 文件上传问题的概要219
针对上传功能的 dos攻击219
专栏 内存使用量与 cpu使用时间等其他需要关注的资源220
使上传的文件在服务器上作为脚本执行220
诱使用户下载恶意文件221
越权下载文件222
4.12.2 通过上传文件使服务器执行脚本 222
概要222
攻击手段与影响223
示例脚本解说223
专栏 警惕文件名中的 xss224
php 脚本的上传与执行224
安全隐患的产生原因225
对策225
专栏 校验扩展名时的注意点228
4.12.3 文件下载引起的跨站脚本228
概要228
攻击手段与影响229
图像文件引起的 xss229
pdf 下载引起的xss231
安全隐患的产生原因234
内容为图像时234
内容不为图像时235
对策236
文件上传时的对策236
专栏 bmp 格式的注意点与ms07-057 238
文件下载时的对策238
其他对策239
专栏 将图像托管在其他域名240
参考:用户pc中没有安装对应的应用程序时240
总结241
13-4 include 相关的问题242
4.13.1 文件包含攻击242
概要242
攻击手段与影响243
文件包含引发的信息泄漏244
执行脚本 1:远程文件包含攻击(rfi)244
专栏 rfi 攻击的变种245
执行脚本 2:恶意使用保存会话信息的文件246
安全隐患的产生原因248
对策248
总结248
14-4 eval 相关的问题249
4.14.1 eval 注入249
概要249
攻击手段与影响250
存在漏洞的应用250
攻击手段252
安全隐患的产生原因253
对策253
不使用 eval253
避免 eval的参数中包含外界传入的参数254
限制外界传入 eval的参数中只包含字母和数字254
参考:perl的eval代码块形式254
总结255
继续深入学习255
15-4 共享资源相关的问题256
4.15.1 竞态条件漏洞256
概要256
攻击手段与影响257
安全隐患的产生原因258
对策259
避免使用共享资源259
使用互斥锁259
总结260
参考:java servlet的其他注意点260
第5章 典型安全功能261
5-1 认证262
5.1.1 登录功能262
针对登录功能的攻击262
通过 sql注入攻击来跳过登录功能262
通过 sql注入攻击获取用户密码263
在登录页面进行暴力破解263
通过社会化攻击得到用户密码263
通过钓鱼方法获取密码264
登录功能被破解后的影响264
如何防止非法登录264
确保系统中不存在 sql注入等安全性bug264
设置难以猜测的密码265
密码的字符种类和长度要求265
密码的使用现状266
应用程序设计中关于密码的需求266
严格的密码检查原则267
5.1.2 针对暴力破解攻击的对策268
初步认识账号锁定268
暴力破解攻击的检测和对策268
字典攻击269
joe 账号检索269
逆向暴力破解269
针对变种暴力破解的对策269
5.1.3 密码保存方法271
保护密码的必要性271
利用加密方式进行密码保护及其注意事项271
专栏 数据库加密和密码保护272
利用信息摘要来进行密码保护及其注意事项 272
什么是信息摘要272
专栏 密码学级别的散列函数需要满足的要求273
利用信息摘要保护密码273
威胁 1: 离线暴力破解274
威胁 2:彩虹破解(rainbow crack)275
威胁 3:在用户数据库里创建密码字典276
如何防止散列值被破解277
对策 1: salt(加盐)277
对策 2:stretching(延展计算)278
实现示例278
专栏 密码泄露途径280
5.1.4 自动登录280
危险的实现方式示例281
安全的自动登录实现方式281
延长会话有效期282
使用令牌实现自动登录283
基于认证票的自动登录方式286
三种方法的比较286
如何降低自动登录带来的风险286
5.1.5 登录表单286
专栏 密码确实需要掩码显示吗287
5.1.6 如何显示错误消息288
5.1.7 退出登录功能289
5.1.8 认证功能总结290
参考:彩虹表原理290
5-2账号管理293
5.2.1 用户注册293
邮箱地址确认293
防止用户 id重复295
例子 1:id相同密码不同可以注册的网站295
例子 2:用户id没有添加唯一性约束的网站295
应对自动用户注册296
利用 captcha防止自动注册296
5.2.2 修改密码297
确认当前密码297
修改密码后向用户发送邮件通知298
密码修改功能容易发生的漏洞298
5.2.3 修改邮箱地址298
修改邮箱地址功能要考虑的安全对策299
5.2.4 密码找回299
面向管理员的密码找回功能300
面向用户的密码找回功能300
对用户进行身份确认301
如何发送密码通知301
5.2.5 账号冻结302
5.2.6 账号删除303
5.2.7 账号管理总结303
5 3 授权304
5.3.1 什么是授权304
5.3.2 典型的授权漏洞304
更改资源 id后可以查看没有权限查看的信息304
只控制菜单的显示或不显示305
使用 hidden参数或者cookie保存权限信息 306
授权漏洞总结307
专栏 将私密信息嵌入 url进行授权处理307
5.3.3 授权管理的需求设计307
专栏 什么是角色308
5.3.4 如何正确实现授权管理308
5.3.5 总结309
5 4 日志输出310
5.4.1 日志输出的目的310
5.4.2 日志种类310
错误日志311
访问日志311
调试日志311
5.4.3 有关日志输出的需求311
需要记录到日志里的所有事件312
日志里应包括的信息和格式312
日志文件保护312
日志文件保存位置313
日志文件保存期限313
服务器的时间调整313
5.4.4 实现日志输出313
5.4.5 总结314
第6章 字符编码和安全 315
6-1 字符编码和安全概要316
6-2 字符集317
什么是字符集317
ascii 和iso-8859-1317
jis 规定的字符集318
微软标准字符集318
unicode319
gb2312319
gbk319
gb18030320
不同字符相同编码的问题320
字符集的处理引起的漏洞320
6-3 字符编码方式321
什么是编码方式321
shift_jis321
euc-jp325
iso-2022-jp326
utf-16326
utf-8327
gb2312329
gbk330
gb18030331
6-4 由字符编码引起的漏洞总结332
字符编码方式中非法数据导致的漏洞332
对字符编码方式处理存在纰漏导致的漏洞 332
在不同字符集间变换导致的漏洞332
6-5 如何正确处理字符编码333
在应用内统一使用的字符集333
输入非法数据时报错并终止处理335
处理数据时使用正确的编码方式335
专栏 调用 htmlspecialchars函数时必须指定字符编码方式336
输出时设置正确的字符编码方式336
其他对策:尽量避免编码自动检测337
6-6 总结338
如何提高 web网站的安全性 第7章339
7-1 针对 web服务器的攻击途径和防范措施341
7.1.1 利用基础软件漏洞进行攻击341
7.1.2 非法登录341
7.1.3 对策341
停止运行不需要的软件342
定期实施漏洞防范措施342
选定软件时确认软件的升级状况342
确定打补丁方式343
关注各种漏洞相关信息344
确认漏洞后调查补丁状况以及防范对策、并制定对应计划344
执行漏洞对应计划345
对不需要对外公开的端口或服务加以访问限制346
通过端口扫描确认各端口服务状态347
提高认证强度348
7-2 防范伪装攻击的对策349
7.2.1 网络伪装的手段349
针对 dns服务器的攻击349
专栏 visa 域名问题350
arp 欺骗攻击350
7.2.2 钓鱼攻击350
7.2.3 web 网站的伪装攻击对策351
网络层的对策351
同一网段内不放置可能存在漏洞的服务器 351
强化 dns运维351
引入 ssl/tls352
专栏 免费的数字证书354
使用便于记忆的域名354
7-3 防范网络监听、篡改的对策355
7.3.1 网络监听、篡改的途径355
通过无线网进行监听、篡改355
利用交换机端口镜像355
利用代理服务器355
伪装成 dhcp服务器355
使用 arp欺骗攻击和dns缓存污染攻击(dns cache poisoning)355
7.3.2 中间人攻击356
使用 fiddler模拟中间人攻击356
专栏 请不要手动安装证书358
7.3.3 对策359
使用 ssl时的注意事项359
专栏 ssl 认证标签360
7-4 防范恶意软件的对策361
7.4.1 什么是 web网站的恶意软件对策361
7.4.2 恶意软件的感染途径361
7.4.3 web 网站恶意软件防范对策概要362
7.4.4 如何确保服务器不被恶意软件感染363
探讨是否需要制定针对恶意软件的防范措施 363
制定病毒防范政策并向用户公开363
使用防病毒软件364
专栏 web 网站的防病毒对策和gumblar的关系365
7-5 总结366
开发安全的 web应用所需要的管理 第8章367
8-1 开发管理中的安全对策概要368
8-2 开发体制369
开发标准的制定369
教育培训369
8-3 开发过程371
8.3.1 规划阶段的注意事项371
8.3.2 招标时的注意事项371
专栏 谁应该对安全漏洞负责372
8.3.3 需求分析时的注意事项372
8.3.4 概要设计的推进方法373
8.3.5 详细设计和编码阶段的注意事项 374
8.3.6 安全性测试的重要性及其方法374
8.3.7 web 健康诊断基准374
8.3.8 承包方测试376
8.3.9 发包方测试(验收)376
8.3.10 运维阶段的注意事项377
8-4 总结378
文章试读:为什么存在安全隐患会有问题,这是个越思考就越深入的课题。接下来,就让我们从几个方面来探讨一下必须杜绝安全隐患的原因。 ◆经济损失 应杜绝安全隐患的原因之一为,假如网站的安全隐患被恶意利用,网站的经营者将会蒙受经济损失。典型的损失为以下几项。 赔偿用户的经济损失 给用户寄送代金券作为补偿时的花销 网站暂停运营造成的机会损失 信誉度下降造成的营业额减少 ...
(查看全部试读)