内容简介
第1章 什么是Web应用的安全隐患
1.1 安全隐患即“能用于作恶的Bug”
1.2 为什么存在安全隐患会有问题
经济损失
法律要求
对用户造成不可逆的伤害
欺骗用户
被用于构建僵尸网络
1.3 产生安全隐患的原因
1.4 安全性Bug与安全性功能
1.5 本书的结构
第2章 搭建试验环境
2.1 试验环境概要
2.2 安装VMware Player
什么是VMware Player
下载VMware Player
安装VMware Player
2.3 安装虚拟机及运行确认
虚拟机启动确认
虚拟机的使用方法
编辑hosts文件
使用ping确认连接
Apache与PHP的运行确认
设置并确认邮箱账号
2.4 安装Fiddler
什么是Fiddler
安装Fiddler
Fiddler的运行确认及简单用法
参考:虚拟机的数据一览
参考:如果无法连接试验环境的POP3服务器
第3章 Web安全基础:HTTP、会话管理、同源策略
3.1 HTTP与会话管理
为什么要学习HTTP
最简单的HTTP
使用Fiddler观察HTTP消息
请求消息
响应消息
状态行
响应头信息
如果将HTTP比喻为对话
输入-确认-注册模式
POST方法
消息体
百分号编码
Referer
GET和POST的使用区别
hidden参数能够被更改
将hidden参数的更改比作对话
hidden参数的优点
无状态的HTTP认证
体验Basic认证
专栏 认证与授权
Cookie与会话管理
使用Cookie的会话管理
会话管理的拟人化解说
会话ID泄漏的原因
Cookie的属性
专栏 Cookie Monster Bug
总结
3.2 被动攻击与同源策略
主动攻击与被动攻击
主动攻击
被动攻击
恶意利用正规网站进行的被动攻击
跨站被动攻击
浏览器如何防御被动攻击
沙盒
同源策略
应用程序安全隐患与被动攻击
专栏 第三方JavaScript
JavaScript以外的跨域访问
frame元素与iframe元素
专栏 X-FRAME-OPTIONS
img元素
script元素
CSS
form元素的action属性
总结
第4章 Web应用的各种安全隐患
4.1 Web应用的功能与安全隐患的对应关系
安全隐患产生于何处
注入型隐患
总结
4.2 输入处理与安全性
什么是Web应用的输入处理
检验字符编码
转换字符编码
检验并转换字符编码的实例
专栏 字符编码的自动转换与安全性
输入校验
输入校验的目的
输入校验与安全性
二进制安全与空字节攻击
仅校验输入值并不是安全性策略
输入校验的依据是应用程序的规格
哪些参数需要校验
PHP的正则表达式库
使用正则表达式检验输入值的实例(1)1~5个字符的字母数字
使用正则表达式检验输入值的实例(2)住址栏
专栏 请注意mb_ereg中的\d与\w
范例
专栏 输入校验与框架
总结
参考:表示“非控制字符的字符”的正则表达式
4.3 页面显示的相关问题
4.3.1 跨站脚本(基础篇)
概要
攻击手段与影响
XSS窃取Cookie值
通过JavaScript攻击
篡改网页
反射型XSS与存储型XSS
安全隐患的产生原因
HTML转义的概要
元素内容的XSS
没有用引号括起来的属性值的XSS
用引号括起来的属性值的XSS
对策
XSS对策的基础
指定响应的字符编码
XSS的辅助性对策
对策总结
参考:使用Perl的对策示例
使用Perl进行HTML转义的方法
指定响应的字符编码
4.3.2 跨站脚本(进阶篇)
href属性与src属性的XSS
生成URL时的对策
校验链接网址
JavaScript的动态生成
事件绑定函数的XSS
script元素的XSS
JavaScript字符串字面量动态生成的对策
DOM based XSS
允许HTML标签或CSS时的对策
参考:Perl中转义Unicode的函数
4.3.3 错误消息导致的信息泄漏
总结
继续深入学习
4.4 SQL调用相关的安全隐患
4.4.1 SQL注入
概要
攻击手段与影响
示例脚本解说
错误消息导致的信息泄漏
UNION SELECT致使的信息泄漏
使用SQL注入绕过认证
通过SQL注入攻击篡改数据
其他攻击
专栏 数据库中表名与列名的调查方法
安全隐患的产生原因
字符串字面量的问题
针对数值的SQL注入攻击
对策
使用占位符拼接SQL语句
专栏 采用MDB2的原因
为什么使用占位符会安全
参考:LIKE语句与通配符
使用占位符的各种处理
SQL注入的辅助性对策
总结
继续深入学习
参考:无法使用占位符时的对策
参考:Perl+MySQL的安全连接方法
参考:PHP+PDO+MySQL的安全连接方法
参考:Java+MySQL的安全连接方法
4.5 关键处理中引入的安全隐患
4.5.1 跨站请求伪造(CSRF)
概要
攻击手段与影响
“输入-执行”模式的CSRF攻击
CSRF攻击与XSS攻击
存在确认页面时的CSRF攻击
专栏 针对内部网络的CSRF攻击
安全隐患的产生原因
对策
筛选出需要防范CSRF攻击的页面
确认是正规用户自愿发送的请求
专栏 令牌与一次性令牌
CSRF的辅助性对策
对策总结
4.6 不完善的会话管理
4.6.1 会话劫持的原因及影响
预测会话ID
窃取会话ID
挟持会话ID
会话劫持的方法总结
会话劫持的影响
4.6.2 会话ID可预测
概要
攻击手段与影响
常见的会话ID生成方法
使用推测出的会话ID尝试伪装
伪装造成的影响
安全隐患的产生原因
对策
改善PHP的会话ID的随机性的方法
参考:自制会话管理机制产生的其他隐患
4.6.3 会话ID嵌入URL
概要
攻击手段与影响
会话ID嵌入URL所需的条件
范例脚本解说
通过Referer泄漏会话ID所需的条件
攻击流程
事故性的会话ID泄漏
影响
安全隐患的产生原因
对策
PHP
Java Servlet(J2EE)
ASP.NET
4.6.4 固定会话ID
概要
攻击手段与影响
示例脚本介绍
会话固定攻击解说
登录前的会话固定攻击
会话采纳
仅在Cookie中保存会话ID的网站固定会话ID
会话固定攻击的影响
安全隐患的产生原因
对策
无法更改会话ID时采用令牌
登录前的会话固定攻击的对策
总结
4.7 定向相关的安全隐患
4.7.1 自由重定向漏洞
概要
攻击手段与影响
安全隐患的产生原因
允许自由重定向的情况
对策
固定重定向的目标URL
使用编号指定重定向的目标URL
校验重定向的目标域名
专栏 警告页面
4.7.2 HTTP消息头注入
概要
攻击手段与影响
重定向至外部域名
专栏 HTTP响应截断攻击
生成任意Cookie
显示伪造页面
安全隐患的产生原因
专栏 HTTP消息头与换行
对策
对策1:不将外界参数作为HTTP响应消息头输出
对策2:执行以下两项内容
专栏 PHP的header函数中进行的换行符校验
4.7.3 重定向相关的安全隐患总结
4.8 Cookie输出相关的安全隐患
4.8.1 Cookie的用途不当
不该保存在Cookie中的数据
参考:最好不要在Cookie中保存数据的原因
专栏Padding Oracle攻击与MS10-070
4.8.2 Cookie的安全属性设置不完善
概要
攻击手段与影响
关于抓包方法的注意点
安全隐患的产生原因
什么样的应用程序不能在Cookie中设置安全属性
对策
给保存会话ID的Cookie设置安全属性的方法
使用令牌的对策
使用令牌能确保安全性的原因
除安全属性外其他属性值需要注意的地方
Domain属性
Path属性
Expires属性
HttpOnly属性
总结
4.9 发送邮件的问题
4.9.1 发送邮件的问题概要
邮件头注入漏洞
使用hidden参数保存收件人信息
参考:邮件服务器的开放转发
4.9.2 邮件头注入漏洞
概要
攻击手段与影响
攻击方式1:添加收件人
攻击方式2:篡改正文
通过邮件头注入攻击添加附件
安全隐患的产生原因
对策
使用专门的程序库来发送邮件
不将外界传入的参数包含在邮件头中
发送邮件时确保外界传入的参数中不包含换行符
邮件头注入的辅助性对策
总结
继续深入学习
4.10 文件处理相关的问题
4.10.1 目录遍历漏洞
概要
攻击手段与影响
专栏 从脚本源码开始的一连串的信息泄漏
安全隐患的产生原因
对策
避免由外界指定文件名
文件名中不允许包含目录名
专栏 basename函数与空字节
限定文件名中仅包含字母和数字
总结
4.10.2 内部文件被公开
概要
攻击手段与影响
安全隐患的产生原因
对策
参考:Apache中隐藏特定文件的方法
4.11 调用OS命令引起的安全隐患
4.11.1 OS命令注入
概要
攻击手段与影响
调用sendmail命令发送邮件
OS命令注入攻击与影响
安全隐患的产生原因
在Shell中执行多条命令
使用了内部调用Shell的函数
安全隐患的产生原因总结
对策
在设计阶段决定对策方针
选择不调用OS命令的实现方法
避免使用内部调用Shell的函数
不将外界输入的字符串传递给命令行参数
使用安全的函数对传递给OS命令的参数进行转义
OS命令注入攻击的辅助性对策
参考:内部调用Shell的函数
4.12 文件上传相关的问题
4.12.1 文件上传问题的概要
针对上传功能的DoS攻击
专栏 内存使用量与CPU使用时间等其他需要关注的资源
使上传的文件在服务器上作为脚本执行
诱使用户下载恶意文件
越权下载文件
4.12.2 通过上传文件使服务器执行脚本
概要
攻击手段与影响
示例脚本解说
专栏 警惕文件名中的XSS
PHP脚本的上传与执行
安全隐患的产生原因
对策
专栏 校验扩展名时的注意点
4.12.3 文件下载引起的跨站脚本
概要
攻击手段与影响
图像文件引起的XSS
PDF下载引起的XSS
安全隐患的产生原因
内容为图像时
内容不为图像时
对策
文件上传时的对策
专栏 BMP格式的注意点与MS07-057
文件下载时的对策
其他对策
专栏 将图像托管在其他域名
参考:用户PC中没有安装对应的应用程序时
总结
4.13 include相关的问题
4.13.1 文件包含攻击
概要
攻击手段与影响
文件包含引发的信息泄漏
执行脚本1:远程文件包含攻击(RFI)
专栏 RFI攻击的变种
执行脚本2:恶意使用保存会话信息的文件
安全隐患的产生原因
对策
总结
4.14 eval相关的问题
4.14.1 eval注入
概要
攻击手段与影响
存在漏洞的应用
攻击手段
安全隐患的产生原因
对策
不使用eval
避免eval的参数中包含外界传入的参数
限制外界传入eval的参数中只包含字母和数字
参考:Perl的eval代码块形式
总结
继续深入学习
4.15 共享资源相关的问题
4.15.1 竞态条件漏洞
概要
攻击手段与影响
安全隐患的产生原因
对策
避免使用共享资源
使用互斥锁
总结
参考:Java Servlet的其他注意点
第5章 典型安全功能
5.1 认证
5.1.1 登录功能
针对登录功能的攻击
通过SQL注入攻击来跳过登录功能
通过SQL注入攻击获取用户密码
在登录页面进行暴力破解
通过社会化攻击得到用户密码
通过钓鱼方法获取密码
登录功能被破解后的影响
如何防止非法登录
确保系统中不存在SQL注入等安全性Bug
设置难以猜测的密码
密码的字符种类和长度要求
密码的使用现状
应用程序设计中关于密码的需求
严格的密码检查原则
5.1.2 针对暴力破解攻击的对策
初步认识账号锁定
暴力破解攻击的检测和对策
字典攻击
Joe账号检索
逆向暴力破解
针对变种暴力破解的对策
5.1.3 密码保存方法
保护密码的必要性
利用加密方式进行密码保护及其注意事项
专栏 数据库加密和密码保护
利用信息摘要来进行密码保护及其注意事项
什么是信息摘要
专栏 密码学级别的散列函数需要满足的要求
利用信息摘要保护密码
威胁1:离线暴力破解
威胁2:彩虹破解(Rainbow Crack)
威胁3:在用户数据库里创建密码字典
如何防止散列值被破解
对策1:salt(加盐)
对策2:stretching(延展计算)
实现示例
专栏 密码泄露途径
5.1.4 自动登录
危险的实现方式示例
安全的自动登录实现方式
延长会话有效期
使用令牌实现自动登录
基于认证票的自动登录方式
三种方法的比较
如何降低自动登录带来的风险
5.1.5 登录表单
专栏 密码确实需要掩码显示吗
5.1.6 如何显示错误消息
5.1.7 退出登录功能
5.1.8 认证功能总结
参考:彩虹表原理
5.2 账号管理
5.2.1 用户注册
邮箱地址确认
防止用户ID重复
例子1:ID相同密码不同可以注册的网站
例子2:用户ID没有添加唯一性约束的网站
应对自动用户注册
利用CAPTCHA防止自动注册
5.2.2 修改密码
确认当前密码
修改密码后向用户发送邮件通知
密码修改功能容易发生的漏洞
5.2.3 修改邮箱地址
修改邮箱地址功能要考虑的安全对策
5.2.4 密码找回
面向管理员的密码找回功能
面向用户的密码找回功能
对用户进行身份确认
如何发送密码通知
5.2.5 账号冻结
5.2.6 账号删除
5.2.7 账号管理总结
5.3 授权
5.3.1 什么是授权
5.3.2 典型的授权漏洞
更改资源ID后可以查看没有权限查看的信息
只控制菜单的显示或不显示
使用hidden参数或者Cookie保存权限信息
授权漏洞总结
专栏 将私密信息嵌入URL进行授权处理
5.3.3 授权管理的需求设计
专栏 什么是角色
5.3.4 如何正确实现授权管理
5.3.5 总结
5.4 日志输出
5.4.1 日志输出的目的
5.4.2 日志种类
错误日志
访问日志
调试日志
5.4.3 有关日志输出的需求
需要记录到日志里的所有事件
日志里应包括的信息和格式
日志文件保护
日志文件保存位置
日志文件保存期限
服务器的时间调整
5.4.4 实现日志输出
5.4.5 总结
第6章 字符编码和安全
6.1 字符编码和安全概要
6.2 字符集
什么是字符集
ASCII和ISO-8859-1
JIS规定的字符集
微软标准字符集
Unicode
GB2312
GBK
GB18030
不同字符相同编码的问题
字符集的处理引起的漏洞
6.3 字符编码方式
什么是编码方式
Shift_JIS
EUC-JP
ISO-2022-JP
UTF-16
UTF-8
GB2312
GBK
GB18030
6.4 由字符编码引起的漏洞总结
字符编码方式中非法数据导致的漏洞
对字符编码方式处理存在纰漏导致的漏洞
在不同字符集间变换导致的漏洞
6.5 如何正确处理字符编码
在应用内统一使用的字符集
输入非法数据时报错并终止处理
处理数据时使用正确的编码方式
专栏 调用htmlspecialchars函数时必须指定字符编码方式
输出时设置正确的字符编码方式
其他对策:尽量避免编码自动检测
6.6 总结
第7章 如何提高Web网站的安全性
7.1 针对Web服务器的攻击途径和防范措施
7.1.1 利用基础软件漏洞进行攻击
7.1.2 非法登录
7.1.3 对策
停止运行不需要的软件
定期实施漏洞防范措施
选定软件时确认软件的升级状况
确定打补丁方式
关注各种漏洞相关信息
确认漏洞后调查补丁状况以及防范对策、并制定对应计划
执行漏洞对应计划
对不需要对外公开的端口或服务加以访问限制
通过端口扫描确认各端口服务状态
提高认证强度
7.2 防范伪装攻击的对策
7.2.1 网络伪装的手段
针对DNS服务器的攻击
专栏 VISA域名问题
ARP欺骗攻击
7.2.2 钓鱼攻击
7.2.3 Web网站的伪装攻击对策
网络层的对策
同一网段内不放置可能存在漏洞的服务器
强化DNS运维
引入SSL/TLS
专栏 免费的数字证书
使用便于记忆的域名
7.3 防范网络监听、篡改的对策
7.3.1 网络监听、篡改的途径
通过无线网进行监听、篡改
利用交换机端口镜像
利用代理服务器
伪装成DHCP服务器
使用ARP欺骗攻击和DNS缓存污染攻击(DNS cache poisoning)
7.3.2 中间人攻击
使用Fiddler模拟中间人攻击
专栏 请不要手动安装证书
7.3.3 对策
使用SSL时的注意事项
专栏 SSL认证标签
7.4 防范恶意软件的对策
7.4.1 什么是Web网站的恶意软件对策
7.4.2 恶意软件的感染途径
7.4.3 Web网站恶意软件防范对策概要
7.4.4 如何确保服务器不被恶意软件感染
探讨是否需要制定针对恶意软件的防范措施
制定病毒防范政策并向用户公开
使用防病毒软件
专栏 Web网站的防病毒对策和Gumblar的关系
7.5 总结
第8章 开发安全的Web应用所需要的管理
8.1 开发管理中的安全对策概要
8.2 开发体制
开发标准的制定
教育培训
8.3 开发过程
8.3.1 规划阶段的注意事项
8.3.2 招标时的注意事项
专栏 谁应该对安全漏洞负责
8.3.3 需求分析时的注意事项
8.3.4概要设计的推进方法
8.3.5 详细设计和编码阶段的注意事项
8.3.6 安全性测试的重要性及其方法
8.3.7 Web健康诊断基准
8.3.8 承包方测试
8.3.9 发包方测试(验收)
8.3.10 运维阶段的注意事项
8.4 总结