记下应用程序修改用户输入(特别是截短、删除数据、编码或解码)的任何位置。对于观察到的每一个位置,确定是否可以人为构造恶意字符串。
(1)如果数据已被过滤一次(非递归),确定是否可以提交一个“补偿”过滤操作的字符串。例如,如果应用程序过滤SELECT这个SQL关键字,则可以提交SELSELECTECT,看过滤机制是否会删除其中的SELECT子字符串,而留下SELECT。
(2)如果数据确认按设定的顺序发生,并且有一个或多个确认步骤修改了数据,则确定是否可以将这些步骤用于破坏之前的确认步骤。例如,如果应用程序执行URL编码,然后过滤掉恶意数据(如<script>标签),则可以通过提交以下字符串来避开确认机制:
注解
跨站点脚本过滤经常会错误地删除HTML标签对之间的所有数据,如<tag1>aaaaa</tag1>。这种行为通常易于受到上述攻击。
我们曾在一个提供基于预订的金融新闻和信息访问的应用程序中发现过这种逻辑缺陷。随后,我们又在两个完全无关的应用程序中遇到相同的漏洞,这表明许多逻辑缺陷既难以捉摸,又广泛存在。
1.功能
应用程序允许用户访问大量的历史档案与当前信息,包括公司报表与账目、新闻稿、市场分析等。大部分信息只有付费用户才可查阅。
应用程序提供一个功能强大、分类详细的搜索功能,所有用户都可使用这项功能。如果匿名用户执行一项查询,搜索功能将返回所有与查询相匹配的文档链接。然而,如果用户想要查看查询返回的受保护文档的实际内容,就需要付费订阅。应用程序的所有者认为这种行为是一种有用的营销策略。
2.假设
应用程序的设计者认为,如果用户不付费订阅,就无法使用搜索功能提取任何有用的信息。 搜索结果返回的文档标题往往含义模糊,例如,“2010年度报告”、“新闻稿08-03-2011”等。
3.攻击方法
因为搜索功能指出与某一查询匹配的文档数量,狡猾的用户就可以提交大量查询,并通过推断利用搜索功能提取正常情况下需要付费才能查阅的信息。例如,下面的查询可从一个受保护的文档中提取内容。
虽然用户不能查看文档的具体内容,但通过发挥充分的想象并使用有针对性的请求,他就能够相对清楚地了解文档的内容。
提示
在某些情况下,能够以这种方式通过搜索功能过滤信息,对应用程序的安全非常重要:它会披露大量与管理功能、密码和釆用的技术有关的信息。
提示
事实证明,使用这种技巧可对内部文档管理软件实施有效攻击。笔者曾釆用此技巧对存储在维基百科中的配置文件内的关键密码实施过蛮力攻击。由于维基百科会返回提示,说明搜索字符串是否出现在页面的任何位置(而不是匹配整个单词),因此,可以通过搜索以下内容,逐个字母地对密码实施蛮力攻击:
我们曾在一家金融服务公司使用的Web应用程序中发现过这种逻辑缺陷。
1.功能
该应用程序最近才开发出来,像许多新软件一样,其中包含大量与功能有关的缺陷。每隔一段时间,应用程序的各种操作就会意外中断,并向用户返回一条错误消息。
为方便错误调查,开发者决定在这些消息中提供详尽的信息,包括:
用户的身份;
当前会话的令牌;
被访问的URL;
在造成错误的请求中提交的所有参数。
提供这些消息对服务台工作人员调查并恢复系统故障非常有用,而且有助于消除剩下的功能缺陷。
2.假设
尽管安全顾问经常提出警告,称这种详尽的调试消息可能会被攻击者滥用,但开发者仍然认为它们不会造成任何安全漏洞。通过检查浏览器处理的请求与响应,用户就有可能获得调试消息中包含的所有信息。但是,这些消息中并未包含与实际故障有关的任何细节(如栈跟踪),因此无法帮助攻击者向应用程序发动有效攻击。
3.攻击方法
尽管开发者对调试消息的内容进行了合理保护,但由于他们在创建调试消息时犯下的错误,假设仍然存在缺陷。
当错误发生时,应用程序的一个组件将收集所有必要的信息,并将其保存起来。用户收到一个HTTP重定向,它指向一个显示这些被保存信息的URL。问题在于,在应用程序保存调试信息、用户访问错误消息时,并没有使用会话。相反,调试信息被保存在一个静态容器内,并且错误消息URL总显示最后放入这个容器的信息。因此,开发者认为,使用重定向的用户只会看到与错误有关的调试信息。
实际上,在这种情况下,如果两个错误几乎同时发生,普通用户偶尔会看到与另一名用户造成的错误有关的调试信息。除线程安全问题外(见下一个示例),这并非一个简单的竞态条件。如果攻击者知道错误机制的工作原理,他就可以重复访问消息URL,并记录下所有不同的错误消息。只需短短几个小时,他就可以获得大量应用程序用户的敏感数据:
一组可用在密码猜测攻击中的用户名;
一组可用于劫持会话的会话令牌;
一组用户提交的输入,其中包含密码和其他敏感数据。
因此,错误机制可能会造成严重的安全威胁。由于管理用户有时会收到这类内容详细的错误消息,监控错误消息的攻击者就可以迅速获得足够的信息,从而攻破整个应用程序。