第11章 攻击应用程序逻辑
11.1 逻辑缺陷的本质
用编程语言编写代码就是把一个复杂的进程分解成一些简单而又互相独立的逻辑步骤。
Web应用程序中的逻辑缺陷各不相同,它们包括代码中简单的错误,以及几种应用程序核心组件互操作方面的及其复杂的漏洞。
逻辑缺陷表现为设计者或开发者在思考过程中做出的特殊假设存在明显或隐含的错误。
11.2 现实中的逻辑缺陷
- 征求提示——将应用程序作为“加密提示”,以加密任意值
- 欺骗密码修改——不需填写现有密码即可进行修改
- 直接结算——为按应用逻辑进行访问
- 修改保险单——提交额外参数
- 入侵银行——代码组件复用导致信息泄露
- 规避交易规则——未对负数进行检测
- 获得大幅折扣——程序逻辑错误
- 避免转义——未对转义符号本身进行转义
- 避开输入确认——对输入进行先转义,后截断,可能导致错误
- 滥用搜索功能——通过搜索可获得未授权访问的信息
- 利用调试消息—— 错误机制泄露隐私信息
- 与登录机制竞赛——应用程序使用静态存储保存应根据独立线程或会话保存的信息,导致进程错误
11.3 避免逻辑缺陷
- 确保应用程序各方面设计信息清楚、详细地记录在文档中
- 所有源代码提供清晰的注释
- 考虑设计过程中的每一个假设,并想象假设被违背的情况
- 考虑应用程序如何处理用户的反常行为输入
- 不同组件与应用程序质检的相互依赖和互操作可能造成的不利影响
- 不要想象用户提交的输入
- 根据会话确定用户身份与权限
- 根据不同用户权限保留搜索索引