11.1 逻辑缺陷的本质
1、一般逻辑缺陷表现为设计者或者开发者在思考过程中做出的特殊假设存在明显或者隐含的错误。
11.2 现实中的逻辑缺陷
11.2.1 例1:征求提示
1、功能:如“记住我”功能,在浏览器设置一个永久cookie存信息。
2、假设
3、攻击方法
11.2.2 例2:欺骗密码修改功能
1、功能:用户可修改密码,但须提交旧密码。而管理员可修改任一账户密码,不需提交旧密码。
2、假设
3、攻击方法
11.2.3 例3:直接结算
1、功能:添加购物车、确认订单、输入支付信息、输入交货信息。
2、假设
3、攻击方法
11.2.4 例4:修改保险单
1、功能:应用程序为用户提供保险报价,若需要还可在线完成并提交一份保险申请。
2、假设:用户提交了应用程序不希望他提交的参数
3、攻击方法
11.2.5 例5:入侵银行
1、功能:应用程序允许尚未使用在线应用程序的顾客进行注册,用户正确输入注册信息。
2、假设
3、攻击方法:
11.2.6 例6:规避交易限制
1、功能:财务人员能在公司拥有账户人员间进行转账。
2、假设:转账负值等不合理值
3、攻击方法
11.2.7 例7:获得大幅折扣
1、功能:购买一定数量商品,有折扣
2、假设
3、攻击方法
11.2.8 例8:避免转义
1、功能:应用程序的设计者决定执行某种功能,该功能需要椅子变量的形式向操作系统命令提交用户控制的输入。
2、假设
3、攻击方法:转义字符本身进行转义
11.2.9 例9:避开输入确认
1、功能:应用程序包含一组输入确认程序,以防范各种类型攻击,其中的两种防御机制SQL注入过滤和长度限制。
2、假设:两种防御机制都该考虑。
3、攻击方法:SQL注入防御通过用户输入中的任何引号配对而生效,因此在没对引号中,第一个引号将作为第二个引号的转义字符。但若将经过转义的输入提交给“截短”功能,将会出现漏洞威胁。
11.2.10 例10:滥用搜索功能
1、功能:正常用户可以运用搜索功能通过付费方式搜索到受保护文档。
2、假设:若无付费通常就会返回一些模糊信息。
3、攻击方法:可利用推断搜索功能提取正常情况下需要付费才能查阅的信息,
11.2.11 例11:利用调试消息
1、功能:在应用程序报错且返回错误数据的时候,确保数据的详细和正确,方便为开发人员后期纠正弥补。
2、假设:用户通过检查浏览器处理的请求与响应,可能获得调试消息中包含的所有信息。但这些消息中并未包含与实际故障有关的任何细节。
3、攻击方法:
11.2.12 例12:与登录机制竞赛
1、功能:应用程序执行采用一种安全多阶段的登录机制,要求用户提交几个不同的证书才能获得访问权限。
2、假设:验证机制接受了大量设计审查与渗透测试,应用程序所有者确信攻击者无法向验证机制发动有效攻击,从而获得未授权访问。
3、攻击方法:
11.3 避免逻辑缺陷
1、下列多种措施降低缺陷:
①将应用程序各方面的信息记录等详细记录在文档中,方便他人理解,
②代码注释详细
③尽可能考虑假设全面,包括每种情况
④不要相信用户输入的值是合法的,做好不合理处理。
…
11.4 小结
当攻击应用程序的逻辑缺陷时,渗透测试员既要进行系统性的探查,也要从不同角度思考问题。还需要了解开发人员的思维。从别人的角度出发。
11.5 问题
1、何为强制浏览?可以通过它确定哪些漏洞?
答:强制浏览包括避开浏览器导航对应用程序功能访问顺序实施的任何限制。应使用强制浏览测试多阶段过程或其他区域中的错误假设。通常,这些假设会导致可以通过使用强制浏览加以利用的访问控制漏洞。
2、为防止不同类型的攻击,应用程序对用户输入实施各种全局过滤。为防止SQL注入,它将出现在用户输入中的单引号配对。为防止针对一些本地代码组件的缓冲区溢出攻击,它将超长的数据截短到适当的长度。这些过滤有什么问题?
答:如果在实施长度限制之前将引号配对,则通过在配对的两个引号之间截短输入,就可以在输入中引入奇数单引号(请参阅第9章了解详情)。
如果在配对之前应用长度限制,仍然可以通过在有效载荷的开头插入大量单引号,使该有效载荷充分放大,并使用位于有效载荷末尾的专门设计的数据来溢出缓冲区,从而达到利用任何缓冲区溢出条件的目的。
3、可以采取哪些步骤来探查某登录功能中是否存在故障开放条件?(列出想到的各种不同测试。)
答:应使用所控制帐户的证书,多次重复登录过程,并以特定方式修改请求:
(a)对于提交的每个参数,尝试提交一个空值,完全省略名称/值对,并使用不同的值多次提交同一数据项。
(b)如果登录过程包括多个阶段,应尝试以不同的顺序执行这些阶段、完全跳过单个阶段、直接进入任意阶段,以及在不需要参数的阶段提交参数。
(c)如果多次提交了同一数据项,应进行探查,以确定如何处理每个值,以及在一个阶段确认的数据在后续阶段是否仍为可信数据。
4、某银行应用程序采用一种非常安全可靠的多阶段登录机制。在第一个阶段,用户输入用户名和密码。在第二个阶段,用户输入在物理令牌上显示的一个不断变化的值,并通过隐藏表单字段重新提交前面输入的用户名。可以立即发现的逻辑缺陷有哪些?
答:应用程序很可能单独执行这两个检查,根据一个用户名确认密码,根据另一个用户名确认令牌值,然后为其中一个已确认的用户名创建通过验证的会话。
如果拥有自己的物理令牌的应用程序用户没法获得了其他用户的密码,他们就可以作为该用户登录。相反,取决于该机制的运行方式,能够读取其他用户的令牌值的用户或许可以作为该用户登录,而无需了解后者的密码。该解决方案的总体安全状态将因此被明显削弱。
5、在通过提交专门设计的输入探查一个应用程序中是否存在常见的漏洞时,应用程序频繁返回包含调试信息的详细错误消息。有时,这些消息与其他用户造成的错误有关。发生这种情况后,就无法令其再次发生。这表示应用程序存在什么逻辑缺陷,接下来该如何处理?
这种行为表示错误消息功能不是线程安全的,将返回由任何用户生成的上一个错误的详细信息。应同时使用两个不同的会话进行深入探查,以确认是否确实出现了这种情况。如果确实如此,应使用一段脚本不断触发一条详细的错误消息,并记录其内容中的任何差异,以获取与其他应用程序用户有关的有用信息。