内容简介
在网络技术和电子商务飞速发展的今天,Web应用安全面临着的挑战。本书凝聚了作者们超过30年的Web安全从业经验,详细剖析了Web应用的安全漏洞,攻击手法和对抗措施,一步步的教授如何防御邪恶的攻击,并协助读者理解黑客的思考过程。 本书分为13章,书后带有附录和详细的英汉对照索引。本书是网络管理员、系统管理员的必备宝典,也是电子商务从业者、网络爱好者和企业管理者的参考书籍。
目录
第1章 Web应用攻击的基础知识
1.1 什么是Web应用攻击
1.1.1 GUI Web攻击
1.1.2 URI攻击
1.1.3 请求方法、请求头和数据体
1.1.4 资源
1.1.5 认证,会话和授权
1.1.6 Web客户端和HTML
1.1.7 其他协议
1.2 为什么攻击Web应用
1.3 何人、何时、何地攻击Web应用
1.3.1 安全薄弱点
1.4 如何攻击Web应用程序
1.4.1 Web浏览器
1.4.2 浏览器扩展
1.4.3 HTTP代理
1.4.4 命令行工具
1.4.5 一些老工具
1.5 小结
1.6 参考和进一步阅读
第2章 剖析
2.1 架构剖析
2.1.1 踩点和扫描:定义范围
2.1.2 Banner抓取
2.1.3 HTTP指纹
2.1.4 中间件架构
2.2 应用剖析
2.2.1 手工检测
2.2.2 使用搜索工具进行剖析
2.2.3 自动Web爬行工具
2.2.4 常见Web应用剖析
2.3 常用对抗措施
2.3.1 一条警示
2.3.2 保护目录
2.3.3 保护包含文件
2.3.4 一些其他技巧
2.4 小结
2.5 参考和进一步阅读
第3章 攻击Web平台
3.1 使用metasploit进行点击式的漏洞利用
3.2 手工漏洞利用
3.3 检测绕过技术
3.4 Web平台安全实践
3.4.1 通用实践
3.4.2 IIS加固
3.4.3 加固Apache
3.4.4 PHP实践
3.5 小结
3.6 参考和进一步阅读
第4章 攻击Web认证
4.1 认证威胁
4.1.1 用户名/密码威胁
4.1.2 更强的Web认证
4.1.3 Web认证服务
4.2 绕过认证
4.2.1 令牌重放
4.2.2 身份管理
4.2.3 利用客户端
4.2.4 一些思考:身份窃取
4.3 小结
4.4 参考和进一步阅读
第5章 攻击Web授权
5.1 授权实现的指纹识别
5.1.1 爬行ACL
5.1.2 识别访问/会话令牌
5.1.3 分析会话令牌
5.1.4 差异分析
5.1.5 角色矩阵
5.2 攻击ACL
5.3 攻击令牌
5.3.1 手动预测
5.3.2 自动预测
5.3.3 捕获/重放
5.3.4 会话定置
5.4 授权攻击案例分析
5.4.1 水平权限提升
5.4.2 垂直权限提升
5.4.3 差异分析
5.4.4 使用Curl映射许可
5.5 授权实践
5.5.1 Web ACL实践
5.5.2 Web授权/会话令牌安全
5.5.3 安全日志
5.6 小结
5.7 参考和进一步阅读
第6章 输入验证攻击
6.1 预料意外的情况
6.2 在哪里寻找攻击载体
6.3 绕过客户端验证
6.4 常见的输入验证攻击
6.4.1 缓冲区溢出
6.4.2 转义攻击
6.4.3 脚本攻击
6.4.4 边界检查
6.4.5 操纵应用程序行为
6.4.6 SQL注入和数据存储攻击
6.4.7 执行命令
6.4.8 编码滥用
6.4.9 PHP全局变量
6.4.10 常见的后果
6.5 小结
6.6 参考和进一步阅读
第7章 攻击Web数据存储
7.1 SQL入门
7.1.1 语法
7.1.2 SELECT,INSERT和UPDA
7.2 发现SQL注入
7.2.1 语法和错误
7.2.2 语义和行为
7.2.3 替换字符编码
7.3 利用SQL注入漏洞
7.3.1 改变流程
7.3.2 查询替换数据
7.3.3 平台
7.4 其他数据存储攻击
7.4.1 输入验证
7.4.2 把查询数据从查询逻辑分离出来
7.4.3 数据库加密
7.4.4 数据库配置
7.5 小结
第8章 攻击XML Web服务
8.1 什么是Web服务
8.1.1 传输:HTTP(S)上的SOAP
8.1.2 WSDL
8.1.3 目录服务:UDDI和DISCO
8.1.4 与Web应用程序安全的相似性
8.2 攻击Web服务
8.3 Web服务安全基础
摘要与插图
第6章 输入验证攻击输入验证是Web应用程序安全防范的道防线。许多攻击,如SQL注入,脚本攻击(包括了跨站脚本),以及详细错误信息的泄漏,都是由于攻击者向程序提交了未曾预料到的输入类型而造成的。
输入验证就是为了确保输入数据的格式和类型都是程序所需的。如果不进行严格的检查以减少误操作,程序的完整性和它的信息就有可能会受到损害。
想象一个应用程序中的购物车,我们考虑其信用卡字段。先,信用卡号码只包含数字;其次,大多数信用卡号码都是16位的数字,但也有一些是小于16位的。因此,如果进行输入验证,第一项应该是长度检查:输入的数据是否为14~16位的字符;第二项检查应该是内容检查:输入的数据是否含非数字的字符。我们可以在系统中加上另一项检查:输入的数据是否是一个合法的信用卡号码。“0000111122223333”显然不是一个信用卡号码,但“4435786912639983”呢?我们写一个简单的校验和程序就可以判断一个16位数字是否符合合法的信用卡号码要求。另外,一些常识性知识也可以用来验证,比如,一个15位的信用卡号码应该以3开头,第二位应该为4或者7。这个信用卡的例子演示了如何测试输入为一串数字的合法性。但请注意,这个例子没有尝试判断信用卡号码是否匹配用户名或用户地址,而只是尝试验证号码本身的合法性。本章内容着重于两点:一是信任用户提供的数据会带来的危险;二是如果没有恰当的限制期望的数据类型,攻击者攻击应用程序各种的方法。
数据验证可能会的复杂,但它却是应用程序安全基础中的基础。应用程序的开发者应该事先预料到用户在表单字段中所有可能的输入值。刚才我们提到了验证信用卡号码的三种简单方法:长度、内容和校验和。这样的验证过程可以放在HTML页面中,以Javascript实现,并运行在SSL之上。基于Javascript的解决方案简单,也的确是开发人员使用的方法之一。但在接下来的几节里,我们将会看到,客户端的输入验证可以被绕过,而SSL只是起到保护Web传输的保密性。换句话说,我们不能信任Web浏览器所做的安全检查工作,通过SSL加密连接不会对提交到应用程序的数据内容造成任何的影响。
6.1 预料意外的情况
输入验证的一个安全漏洞就是将验证流程用Javascript实现并放在浏览器中。使用客户端的脚本语言实现验证流程似乎是合情合理的,原因先是验证流程不必在服务端实现;其次是,客户端验证容易实现且被大多数Web浏览器支持(虽然也有很个别的浏览器不支持);更重要的是,这样就把服务端所要做的大量工作移到了客户端,是应用程序的一种成功。但Web浏览器是不可信、不可控的环境,所有传入传出的数据都可在传输途中被修改,不管是否存在输入验证流程。因此,用于购买新的Web服务器来处理服务端输入验证的支出,远远小于恶意用户使用%0a的小手段来损害到应用程序安全带来的代价。
输入验证的攻击可能针对应用程序的不同方面。理解黑客如何攻击不完整的验证流程是重要的,因为他们带来的危险远不只“垃圾数据”错误那么简单。
数据存储:包括SQL注入攻击中使用的字符。这些字符可以改写数据库查询语句,导致执行攻击者定制的行为。产生的错误能泄漏出各种信息,比如应用程序采用的编程语言,甚至是应用程序发送到数据库的具体SQL查询语句。
冒充其他用户:包括跨站脚本以及与“钓鱼”相关的攻击。攻击者可以通过提交数据改写HTML,从而窃取其他用户的信息,或者引诱用户泄露他们的敏感信息。
控制Web服务器:此类攻击因操作系统不同而不同。比如插入分号,能在UNIX的Web服务器上执行任意指令。应用程序本来要在Web服