目录
1.1、简介:
在实际攻击的应用程序中提取出更多信息, 主要包括以出人意料和恶意的方式
与应用程序进行交互, 利用应用程序的反祜行为提取出有价值的信息。如果取得成功, 攻击者就可以通过这种攻击获取用户证书之类的敏感数据, 深人了斛某种错误条件并据此调整攻击方向,或者发现应用程序所使用技术的更多细节, 同时解析应用程序的内部结构与功能
2.1、简述:
1、发生意外事件时,许多Web应用程序返回详尽的错误消息,从仅仅披露错误类型的简单内置消息到泄漏许多应用程序状态细节的详细测试信息,都涵盖在错误消息中。
2、在部署之前,大多数应用程序都接受了各种可用性测试。通常这种测试能够发现在正常使用应用程序过程中出现的大部分错误条件。因此一般情况下,应用程序会对这些条件进行合理地处理, 而不会向用户返回任何技术消息。但如果应用程序正在遭受攻击,很可能就会出现各种各样的错误条件,导致应用程序向用户返回更加详细的信息,如果出现极不平常的错误条件,即使是最注重安全的应用程序, 也会向用户返回非常详细的调试消息
2.2、错误消息脚本
1、如果在解释型Web脚本语言(如VBScript)中出现错误,应用程序通常会返回一条简单的错误消息,以揭示错误的本质,并且还可能会有发生错误的文件的行号(如包含error、[number -1]、line 23等信息)
2、这种消息中并不包含任何与应用程序状态或被处理的数据有关的敏感信息。但可以利用它从各方面缩小攻击范围。如当为探查常见的漏洞在一个特殊的参数中插入各种攻击字符串时,可能会遇到消息(error、[string=' ' ']、line 76)
3、这条消息指出,修改的值被赋给了一个数字式参数, 但由于提交的输入中包含非数字字符, 因而不能赋给上述参数。在这种情况下,向这个参数提供非数字攻击字符串可能达不到任何目的, 也不会发现各种类型的漏洞, 因此最好选择其他的参数。
4、此外这种类型的错误消息还有助于更好地理解服务器端应用程序的逻辑。因为消息披漏了发生错误的行号,所以能够确定两个不同的畸形请求是触发同一个错误,还是不同的错误。通过在几个参数中提交不良的输入并确认错误发生的位置,还可以确定应用程序处理不同参数的顺序。系统性地修改不同的参数,就可以解析出服务器执行的各种代码路径。
2.3、栈追踪
简述:
1、大多数Web应用程序用比简单脚本更复杂,但仍然在一种托管执行环境下运行的语言编写, 例如Java 、C#和Visual Basic.NET。如果这些语言中出现无法处理的错误,浏览器往往会显示完整的栈追踪
2、栈追踪是一种结构化的错误消息。它首先说明具体的错误,接行在后面的许多行中描述错误发生时调用栈的执行状态。调用栈的首行显示生成错误的函数,第二行显示调用前一个函数的函数, 以此类推,直到显示所有被调用的函数
3、一般这种错误消息提供大扯有用的信息, 可帮助攻击者优化针对应用程序的攻击
A、通常会说明错误发生的准确原因。攻击者可以根据这些信息调整输入内容,避开错误条件, 从而继续实施攻击
B、调用栈经常会引用应用程序使用的大量库和第三方代码组件。可以查阅这些组件的文档资料,了解它们的预期行为与假设。还可以创建这些组件的本地应用,并对它进行测试,了解应用程序如何处理出人意料的输入,并确定潜在的漏洞
C、调用栈中包含用于处理请求的所有权代码组件的名称。了解这些组件的命名方案及其相互关系有助于推断应用程序的内部结构与功能
D、栈追踪中通常包含行号,和前面描述的简单错误消息脚本一样,可以利用这些行号探查并理解每个应用程序组件的内部逻辑
E、错误消息中常常包含与应用程序及其运行环境有关的其他信息。一般可以确定应用程序所使用的ASP.NET平台的版本,因此就可以研究这个平台,查找任何已知或新出现的漏洞、反常行为、常见的配置错误等
2.4、详尽的调试消息
1、一些应用程序生成自定义的错误消息,其中包含大从的调试信息。在开发与测试阶段, 这些消息,有助于开发者对应用程序进行调试,其中常常包含大队与应用程序运行状态有关的信息
2、详尽的调试消息中通常包含以下信息:
A、可通过用户输入操纵的关键会话变量值
B、数据库等后端组件的主机名称与证书
C、服务器中的文件与目录名称
D、嵌入在有意义的会话令牌中的信息
E、用于保护通过客户端传送的数据的加密密钥
F、在本地代码组件中出现的异常调试信息,包括CPU寄存器的值、栈的内容、加载的DLL列表及其基本地址
3、如果在实际的生产代码中出现这种泄漏功能的错误,那么应用程序就存在严重的安全缺陷,应该对它进行仔细检查,确定任何可用于扩大攻击范围的数据,并且可以通过提交专门设计的输入操纵应用程序的状态, 控制其获取信息的情况
2.5、服务器与数据库消息
简述:
不仅应用程序自身,数据库、邮件服务器或SOAP服务器等后端组件也会返回详尽的错误消息。如果发生完全无法处理的错误,应用程序通信会返回一个HTTP 500状态码,而且响应主体中也包括其他与错误有关的信息。其他情况下,应用程序会对错误进行适当处理,并向用户返回一条定制消息, 其中有时还包括后端组件生成的错误信息。在某些情况下,信息披漏本身可能被攻击者当做攻击手段。应用程序通常会在调试消息或异常错误中无意披漏信息,因此组织的安全规程可能会完全忽略这种信息披漏
利用应用程序返回的消息,可以实施一系列其他攻击:
利用信息披漏扩大攻击范围
在针对服务器后端组件实施特定攻击时,这些组件在遇到错误时常常会提供直接反馈,可以利用这些反馈对攻击进行调整。数据库错误消息中通常包含有用的信息。如它们通常会披露造成错误的查询,可以将其用于优化SQL注入攻击
错误消息中的跨站点脚本攻击
1、针对跨站点脚本的安全防御是一个艰巨的任务,需要确定用户提交的数据的每一个输出位置,虽然大多数框架在报告错误时都会对数据进行HTML编码,但并不是所有框架都这样做。错误消息常常在HTTP响应中的非常规位过多次出现。在Tomtat使用的HttpServlet-Response.sendError()调用中,错误数据还是响应消息头的一部分
2、如果拥有对输入字符串的控制权, 攻击者就可以提交换行字符并实施HTTP消息头注入攻击, 或在HTTP响应中实施跨站点脚本攻击。
3、通常定制错误消息主要发送到控制台等非HTML目标,但有时用户可以在HTTP响应中发现这类错误显示的消息。在这些情况下,攻击者就可以轻松实施跨站点脚本攻击
信息披露中的解密提示
1、利用应用程序意外显示的"加密提示",可以解密以加密格式向用户显示的字符串。信息披露也会导致同样的问题。某应用程序提供一个用于文件访问的加密下载链接,如果某个文件已被移走或删除,应用程序会报告无法下载该文件。当然错误消息中包含了该文件的解密值, 因此可以向该下载链坟提供任何加密的"文件名"从而导致错误。
在这种情况下,信息披露是由刻意滥用反馈造成的,如果对参数进行解密,然后将其用在各种函数中,只要其中的任何函数会记录数据或生成错误消息,则这时导致的信息披露往往更具偶发性。
2、在许多其他信息披露攻击类似的攻击中,了解文件路径为攻击者提供了实施文件路径操纵攻击所需的信息。在文件名中提供3个路径遍历字符并向上导航类似的目录结构,就可以直接向其他组的工作空间上传包含恶意代码的文件
过程:
1、当通过在不同的参数中提交专门设计的攻击字符串,探查应用程序中是否存在常见的漏洞时, 应始终监控应用程序的响应,以确定任何可能包含有用信息的错误消息
尝试通过在错误的情况下提交加密数据字符串,或通过对未处于处理操作的正确状态的资源执行操作,强制应用程序返回错误响应。
2、注意在服务器响应中返回的错误消息可能不会在浏览器中显示。因此确定错误条件的有效方法, 是在每一个原始响应中在找经常出现在错误消息中的关键字
error、exception、illegal、invalid、fail、stack、access、directory、file、not found、var char、ODBC、SQL、SELECT
3、在基本请求中发送一系列修改参数的请求时,为避免错误警报,应检查最初的请求是否已经包含任何正在寻找的关键字。
4、可以使用Bp中的Grep函数迅速确定在由某个攻击生成的任何响应中出现的有用的关键字,如果发现匹配的关键字,应手动检查相关响应,确定应用程序是否返回任何有用的错误信息
2.6、使用公共信息
简述:
1、由于Web应用程序通常会采用大量各不相同的技术与组件,因此经常会遇到一些以前从未见过的错误消息,它们可能不会立即揭示应用程序中出现的错误的本质。在这种情况下,可以从各种公共资源获得更多与错误消息有关的信息
2、通常不常见的错误消息往往是由某个特定的API故障造成的,对消息文本进行搜索就可以找到这个API的文档资料或开发者论坛,以及讨论这个问题的其他位置
3、许多应用程序采用第三方组件执行一些常见的任务,如搜索、购物篮和站点反馈功能,这些组件生成的任何错误消息可能已经出现在其他应用程序中,并被人们在其他地方讨论。
4、一些应用程序中合并了公开发布的源代码,通过搜索出现在不常见错误消息中的一些特殊的表达式,就可以找到实际执行相关功能的源代码,然后检查这些代码了解它们对输入执行了何种处理以及如何操纵应用程序,从而对某个漏洞加以利用
过程:
1、使用标准搜索引擎搜索任何不信见的错误消息的文本。可以使用各种高级搜索特性缩
小搜索范围2、检查搜索结果,寻找所有关于错误消息的讨论以及其他出现相同消息的站点。其他应用程序生成的同一条错误消息可能更详细,有助于更好地了解错误条件,使用搜索引擎缓存获取不再出现在当前应用程序中的错误消息
3、使用Google代码搜索查找任何生成特定错误消息的、公开发布的代码,搜索可能被硬编码到应用程序源代码中的错误消息代码段,还可以使用各种高级搜索特性指定代码语言及其他已知的细节
4、如果获得了包含库与第三方代码组件名称的栈追踪,在上述两种搜索引擎中搜索这些名称
2.7、制造详尽的错误消息
简述:
1、有些情况下可以系统性地制造错误条件,以获取错误消息中的敏感信息。假如能让应用程序对一个特殊的数据执行某种无效的操作,就可能出现上述情况。如果生成的错误消息揭示该数据的值,就可以让应用程序以这种方式处理有用的信息,然后利用这种行为从应用程疗中提取任意数据。
2、可以在SQL注入攻击中利用详尽的开放式数据库连接(ODBC)错误消息检索任意数据库查询的结果。如果将SQL注入WHERE子句中,将导致数据库将用户表中第一个用户的密码转换为整数,以执行求值操作【' and 1=(select password from users where uid=1)--+】
3、此外如果某个应用程序错误生成一个包含错误描述的栈追踪,就可以利用这种技巧制造一种情形, 让应用程序将有用的信息合并到错误描述中。
4、一些数据库允许用户创建用Java编写的自定义函数。在这种情况下,可以利用一个SQL注入漏洞创建自己的函数,执行任意任务,如果应用程序向浏览器返回错误消息,就可以让创建的函数生成一个包含任何想要的数据的异常。如下面的代码将运行橾作系统命令ls,然后生成一个包含命令输出结果的异常。它将向浏览器返回一个栈追踪,其中第一行包含一个目录列表
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
Process P = Runtime.getRuntime().exec('ls');
InputStream is = p.getInputStream();
int c;
while(-1 !=(c=is.read()))
baos.write((byte) c);
}
catch (Exception e)
{
}
throw new RuntimeException(new String(baos.toByteArray()));