避开客户端控件的渗透测试方法

旧城冷巷雨未停 提交于 2020-02-28 19:42:52

                           

一.通过客户端传送数据

1.1 隐藏表单字段

  隐藏HTML表单字段是一种以表面看似无法修改的方式通过客户传送数据的常用机制。如果一个表单标记为隐藏,那么它就不会显示在屏幕上。但是,当用户提交表单时,保存在表单中的字段名称和值被送给应用程序。

在隐藏表单字段中保存产品价格的零售应用程序就是存在这种安全缺陷的典型示例。在Web应用程序发展的早期阶段,这种漏洞及其普遍,现在也绝没有消失。

虽然Price字段未显示在屏幕上,并且用户无法对其进行编辑,但这只是因为应用程序指示浏览器隐藏该字段而已。因为在客户端进行的一切操作最终将由用户控制,用户编辑这个字段时可解除这个限制。要实现编辑操作,一种方法是保存HTML页面的源代码,编辑字段的值,然后将源代码重新载入浏览器,并单击Buy按钮。然而,使用拦截代理服务器对数据进行动态修改更加简单方便。

当攻击Web应用程序时,拦截代理服务器及其有用,他是一种不可缺少的工具。我们可以找到大量拦截代理服务器工具,但以这些工具功能最强大,使用最普遍:

1.Burp Proxy(Burp 套件的一个组件)

2.WebScarab

3.Paros

 

代理服务器位于Web浏览器和目标应用程序之间。它拦截应用程序发布和收到的每一个HTTP或HTTPS请求和响应。

 

1.2 Referer消息头

浏览器在大多数HTTP请求中使用Referer消息头。浏览器使用这个消息头说明提出当前请求页面的URL。

渗透测试步骤:

1.再应用程序中,确定隐藏表单字段、cookie和URL参数明显被用于通过客户传送数据的任何情况。

2.根据数据出现的位置及参数名称之类的线索,确定或猜测它在应用程序逻辑中发挥的作用

3.修改数据在应用程序相关功能中的值。确定应用程序是否处理参数提交的任意值,以及这样做是否使应用程序易于遭受某种攻击。

 

1.3 模糊数据

渗透测试步骤:

可以使用以下几种方法对通过客户传送的模糊数据实施攻击。

1.如果知道模糊字符串的明文值,就可以尝试破译模糊处理所使用的模糊算法

2.如第四章所述,应用程序的其他地方可能包含一些功能,可以利用他们返回由其控制的一段明文生成的模糊字符串。在这种情况下,可以向攻击的功能直接提交任意一个有效载荷,获得所需要的字符串

3.即使模糊字符串完全无法理解,也可以在其他情况下重新传送它的值。实现某种恶意效果。例如,前面的表单的enc参数中可能包含一个加密的产品价格。尽管无法对所选择的任意价格以相同的算法进行加密,但是可以把另一个更便宜的产品的加密价格复制过来,放在这里提交。

4.如果其他所有方法全部无效,还是可以通过提交畸形字符串(如包含超长值,不同字符集错误的字符串)设法对模糊数据进行解密或饭模糊处理的服务器端逻辑实施攻击。

 

1.4 ASP.NET ViewState

ASP.NET ViewState是一种通过客户传送模糊数据的常用机制。它是一种在所有ASP.NETWeb应用程序中默认建立的隐藏字段,其中包含关于当前页面状态的序列化信息。

ViewState参数实际上是一个可被轻易解码的Base64编码字符串。当对一个明显的Base64编码字符串进行解码时,常常会范一个错误,即从字符串的错误位置开始解码。鉴于Base64编码的特点,如果从错误的位置开始解码,解码后的字符串中将出现乱码。Base64采用一种块格式,每4个字节的编码数据解码后将变为3个字节,因此,如果解码后的Base64字符串毫无意义,请尝试从编码字符串的4个相邻的偏移值(offset)位置开始解码。

渗透测试步骤:

1.渗透测试员在攻击ASP.NET应用程序时,需要先确定EnableViewStateMac选项是否被激活。如果ViewState结构末尾存在一个20字节的散列,即表示应用程序激活了该选项,可以使用Burp Proxy中的解码器确定上述散列是否存在。

2.即使ViewState受到保护,还是可以解码各种不同应用程序页面中的ViewState参数,了解应用程序是否使用ViewState通过客户传送任何敏感数据。

3.试着修改ViewState中某个特殊参数的值,但不破坏它的结构,看看是否会导致错误消息。

4.如果能够修改ViewState而不会造成错误,应该分析ViewState中每个参数的功能,并分析应用程序是否使用它保护任何定制数据。尝试用专门设计的值代替每一个参数,探查常见的漏洞,就像检查通过客户传送的其他数据项一样。

5.注意,每个页面可能激活或禁用密钥散列选项,因此有必要测试应用程序的每一个重要页面,了解其中是否存在ViewState攻击漏洞。

 

二.收集用户数据:HTML表单

2.1 长度限制

渗透测试步骤:

1.寻找包含maxlength属性的表单元素。提交大于这个长度但其他格式合法的数据(即如果这个程序要求数字,就提交一个数值)

2.如果应用程序接受这个超长的数据,可据此判断出服务器并没有采用客户端确认机制。

3.根据应用程序随后对参数进行的处理,可以通过确认机制中存在的缺陷利用其他漏洞(如SQL注入、跨站点脚本或缓存区溢出)

 

2.2 基于脚本的确认

渗透测试步骤:

1.确定任何在提交表单前使用客户端JavaScript进行输入确认的情况

2.通过修改被提交的请求,在其中插入无效数据;或者修改确认代码使其失效,向服务器提交确认机制通常会阻止的数据

3.与长度一样,确定服务器是否采用了和客户端相同的控件,如果并非如此,确定是否可利用这种情况实现任何恶意意图。

4.注意,如果在提交表单前有几个输入字符需要由客户端确认机制检验,需要分别用无效数据测试每一个字段,同时在所有其他字段中使用有效数据。如果同时在几个字段中提交无效数据,可能服务器在识别出第一个无效字段时就已经停止执行表单,因而使测试无法到达应用程序的所有可能代码路径。

 

使用客户端JavaScript程序确认用户输入的做法在Web应用程序中非常普遍,但这并不表示这种应用程序全都易于遭受攻击。只有当服务器并未采用和客户端相同的确认机制,以及能够避开客户端确认的专门设计的输入可用于在应用程序中造成某种无法预料的行为时,应用程序才存在风险。

在绝大多数情况下,在客户端确认用户输入有助于提高应用程序的性能,改善用户体验。例如,当填写详细的注册表单时,普遍用户可能会犯许多错误,如忽略必要的字段或电话号码格式出现的错误。如果不采用客户端确认机制,更正这些错误可能需要多次提交注册页面,反而向服务器传送消息。在客户端执行基本的确认检查可使用户获得更佳的使用体验,减轻服务器的负担。

 

2.3 禁用的元素

示例代码:

<form action = " " method = "post">

<p>Product:<input disabled = "true" name = "product" value = "1234567"></p>

<p>Quantity:<input size = "2" name = "quantity">

<input name = "price" type = "inputbox" value = "1224.95">

<input type = "submit" value = "Buy!"></p>

</form>

 

这个表单的行为与本章开头的示例完全相同:它只提交quantity和price参数。但是,存在禁用字段表示应用程序可能已经使用了这个参数。先前的表单种可能已经含有一个包含产品名称的隐藏字段或可编辑。这个表单已经提交给服务器并由应用程序处理完成。通过修改产品名称实施攻击明显不如修改其价格有效。但是,如果应用程序处理这个参数,那么它就易于受到各种攻击(如SQL注入或跨站点脚本),这正是攻击者感兴趣的。

渗透测试步骤:

1.在应用程序的每一个表单中寻找禁用的元素。尝试将发现的每一个元素与表单的其他参数一起提交给服务器,确定其是否有效

2.通常,提交元素被标记为禁用,这些按钮即以灰色显示,表示相关操作无效。应该尝试提交这些参数名称,确定应用程序是否在运行被请求的操作前执行服务器端检查。

3.注意,当提交表单时,浏览器中并不包含禁用的表单元素;因此,简单浏览监控由浏览器发布的请求的应用程序功能并不能确定其中是否含有禁用的元素。要确定禁用的元素,必须监控服务器的响应或在浏览器中查看页面来源。还可以使用拦截代理服务器中的自动“查找与替换”功能,删除输入标签中的禁用属性。

 

三.收集用户数据:厚客户端组件

除HTML表单外,另一种收集、确认并提交用户数据的主要方法是使用厚客户端组件(thick-client component)。最常见的厚客户端组件包括Java applet、ActiveX控件和Shockwave Flash对象。

厚客户端组件可通过输入表单或者在某些情况下通过与客户操作系统文件系统或注册表交互,以各种不同的方式收集数据。在收集到数据被提交给服务器之前,他们可以对其执行任何复杂的确认和处理。而且,由于他们的内部工作机制与HTML表单和JavaScript相比更加不透明,开发者认为他们执行的确认更加难以躲避。为此,通过厚客户端组件查找Web应用程序中存在的漏洞往往能够获得更大的成果。

无论厚客户端组件执行何种确认和处理,如果它以“透明”的形式向服务器提交数据,那么,和上述修改HTML表单数据一样,使用拦截代理服务器就可对这些数据进行修改。例如,一个支持验证机制的厚客户端组件能够获取用户证书,对他们进行某种确认,并在请求中以明文参数(plaintext parameter)的形式向服务器提交这些值。然而,攻击者不需要对组件进行任何分析或实施任何攻击,就可轻松避开这种确认。如果厚客户端组件首先对收集到的数据进行某种形式的模糊处理,在将他们提交给服务器,那么厚客户端组件就成为一种更加有用,更具挑战性的目标。在这种情况下,修改被提交的值将会破坏模糊处理,因此将被服务器拒绝。要避开这种确认,必须对厚客户端组件进行分析研究,了解其执行的确认和模糊处理方法,并以某种方法破坏它的处理机制,从而实现攻击目的。

 

3.1 Java applet

Java applet之所以成为一种流行的厚客户端组件技术,主要在于他们可跨平台使用,并能够在“沙盒”环境(sandboxed environment)中运行,因而能够避免各种困扰许多“重量级”厚客户技术的安全问题。

由于在沙盒中运行,Java applet一般无法访问文件系统之类的操作系统资源。因此,他们在客户控件方面的主要用途,是收集用户输入或其它包含在浏览器中的信息。

 

通常,Java applet被压缩成JAR(Java Archive)文件,其中包含各种文件和其他资源,如声音和图像,JAR文件实际上只是带.jar文件扩展名的ZIP压缩文件。可以使用WinRar或WinZip这些标准文件压缩工具以及Sun Java SDK中的Jar工具解压或重新压缩Jar文件。

分析和处理Java Applet的有用工具还有Jode(一种反编译器和字节码模糊处理工具)和JSwat(一种Java调试工具)

 

·3.1.1 反编译Java字节码

 

渗透测试步骤:

1.分析应用程序的全部方法调用,确定由applet返回的数据是否被提交给服务器。

    2.如果数据本质上是“透明的”(即未经过模糊处理或加密),以和处理任何其他参数一样的方式探查并攻击服务器处理提交数据的过程

    3.如果数据属于模糊数据,反编译applet以获取其源代码

 

4.分析相关源代码(首先执行返回模糊数据的方法),了解它正在执行何种处理

5.确定applet中是否包含任何可用于对任意输入执行相关模糊处理的公共方法

6.如果其中没有这类方法,修改并重新编译applet的源代码,以达到令其执行的任何确认失效或允许模糊处理任意输入的目的。

7.然后,向服务器提交各种经过适当模糊处理的攻击字符串,以探查其中的漏洞。还应对任何其他参数进行相同的处理。

 

·3.1.2 字节码模糊处理

渗透测试步骤:

应对字节码模糊处理的有效策略取决于分析源代码使用的技巧和目的。下面是一些建议:

1.不必完全理解源代码,只需查看applet中是否包含公共方法。哪些方法可以从JavaScript中调用,它们的标签是什么,这些内容应是显而易见的;可以通过提交各种输入测试上述方法的行为

2.如果已经使用无意义的表达式(并非Java关键字)代替类、方法和成员变量名称,那么可以使用许多IDE中内置的重构功能帮助理解代码。通过研究数据的用法,就可以给它们分配有意义的名称。IDE中的“重命名”工具可以帮助完成许多工作:在整个代码库中追踪数据的用法并对每一个数据进行重命名

3.选择适当的选项,在模糊处理工具中再次对模糊处理后的字节码进行模糊处理,这样既可撤销许多模糊处理。Jode是一个实用的模糊处理工具,它可删除由其他模糊处理工具添加的多余代码路径,并可为数据分配唯一的名称,为理解模糊处理后的名称提供帮助。

 

3.2 ActiveX控件

ActiveX控件是一种比Java applet更加“重量级”的技术。它们实际上是本地Win32可执行代码,用户一旦接受并安装ActiveX控件,在该用户的完全权限下执行时候就可实现任何操作,包括与操作系统交互。

ActiveX可用于执行几乎任何一种客户端控制,包括收集用户输入和其他包含在浏览器中的信息,并在允许客户计算机访问某种功能前,验证是否满足某些安全标准。

就HTML页面源代码而言,ActiveX控件的示例和调用方式与Java applet非常类似。

可以应用各种技巧解除使用ActiveX执行的客户端控件。

 

·3.2.1 逆向工程

由于ActiveX控件一般由C和C++之类的本地语言编写,因此很难像反编译Java applet一样对它进行反编译,以恢复其源代码。但是,因为ActiveX控件在客户计算机上执行全部处理操作,所以,从理论上讲,那台计算机的用户能够全面检查并控制它的处理过程,从而避开控件执行的任何安全功能。

渗透测试步骤:

1.避免完全静态解析组件代码,使用一种直观的GUI调试器监控并管理它在运行时的执行情况。例如,OllyDbg是一种简单而强大的调试器,可用于在运行时对编译型软件实施各种攻击。

2.确定控件及其子组件使用的方法以及控件引入的任何重要的操作系统功能,特别是任何加密功能。在调试器中为这些功能设置“断点”

3.如果遇到断点,分析调用栈,确定任何被提交给该功能的相关数据,特别是正在接受确认的用户提交的数据。通过追踪这些数据的路径来了解对他们进行的处理。

4.通常,使用调试器可轻易破坏某个进程的执行路径,使其对攻击有用。例如,修改栈中作为输入提交给某一函数的参数、修改用于传送函数返回值的EAX寄存器,或者重写比较和跳转之类的关键指令以改变函数的逻辑。如果可能,使用这些技巧解除确认控件,使函数接受可能为恶意的数据并对其做进一步处理。

5.如果在其他处理(如加密或模糊处理)之前执行数据确认,就可以利用这种多阶段的处理方式,向控件提交有效数据,然后拦截并修改已经经过确认的数据。这样就可以在将可能的恶意数据提交给服务器端应用程序之前,对其进行适当处理。

6.如果找到一种手动改变控件的处理过程,从而破坏其执行的确认方法,就可以通过在磁盘上修改控件的二进制代码(OllyDbg中有一个工具可更新二进制代码,以反映使用提示器对其进行的更改)或使用Microsoft Detours之类的检测框架在运行时连接目标进程,实现攻击自动化。

 

·3.2.2 利用输出函数

渗透测试步骤:

1.开发者通常会用有意义的短语命名ActiveX方法,因此只需通过他们的名称就可确定有用的方法。

2.有时候,可以使用不同的输入系统的调用一个函数,然后监控该函数的可见行为,并使用调试器监控器内部工作机制,从而确定一个函数的用途。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!