隐藏HTML表单字段是一种以表面看似没法修改的方式经过客户传送数据的经常使用机制。若是一个表单标记为隐藏,那么它就不会显示在屏幕上。可是,当用户提交表单时,保存在表单中的字段名称和值被送给应用程序。算法
在隐藏表单字段中保存产品价格的零售应用程序就是存在这种安全缺陷的典型示例。在Web应用程序发展的早期阶段,这种漏洞及其广泛,如今也绝没有消失。浏览器
虽然Price字段未显示在屏幕上,而且用户没法对其进行编辑,但这只是由于应用程序指示浏览器隐藏该字段而已。由于在客户端进行的一切操做最终将由用户控制,用户编辑这个字段时可解除这个限制。要实现编辑操做,一种方法是保存HTML页面的源代码,编辑字段的值,而后将源代码从新载入浏览器,并单击Buy按钮。然而,使用拦截代理服务器对数据进行动态修改更加简单方便。缓存
当攻击Web应用程序时,拦截代理服务器及其有用,他是一种不可缺乏的工具。咱们能够找到大量拦截代理服务器工具,但以这些工具功能最强大,使用最广泛:安全
1.Burp Proxy(Burp 套件的一个组件)服务器
2.WebScarabcookie
3.Parosapp
代理服务器位于Web浏览器和目标应用程序之间。它拦截应用程序发布和收到的每个HTTP或HTTPS请求和响应。框架
浏览器在大多数HTTP请求中使用Referer消息头。浏览器使用这个消息头说明提出当前请求页面的URL。函数
渗透测试步骤:工具
1.再应用程序中,肯定隐藏表单字段、cookie和URL参数明显被用于经过客户传送数据的任何状况。
2.根据数据出现的位置及参数名称之类的线索,肯定或猜想它在应用程序逻辑中发挥的做用
3.修改数据在应用程序相关功能中的值。肯定应用程序是否处理参数提交的任意值,以及这样作是否使应用程序易于遭受某种攻击。
渗透测试步骤:
可使用如下几种方法对经过客户传送的模糊数据实施攻击。
1.若是知道模糊字符串的明文值,就能够尝试破译模糊处理所使用的模糊算法
2.如第四章所述,应用程序的其余地方可能包含一些功能,能够利用他们返回由其控制的一段明文生成的模糊字符串。在这种状况下,能够向攻击的功能直接提交任意一个有效载荷,得到所须要的字符串
3.即便模糊字符串彻底没法理解,也能够在其余状况下从新传送它的值。实现某种恶意效果。例如,前面的表单的enc参数中可能包含一个加密的产品价格。尽管没法对所选择的任意价格以相同的算法进行加密,可是能够把另外一个更便宜的产品的加密价格复制过来,放在这里提交。
4.若是其余全部方法所有无效,仍是能够经过提交畸形字符串(如包含超长值,不一样字符集错误的字符串)设法对模糊数据进行解密或饭模糊处理的服务器端逻辑实施攻击。
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攻击漏洞。
渗透测试步骤:
1.寻找包含maxlength属性的表单元素。提交大于这个长度但其余格式合法的数据(即若是这个程序要求数字,就提交一个数值)
2.若是应用程序接受这个超长的数据,可据此判断出服务器并无采用客户端确认机制。
3.根据应用程序随后对参数进行的处理,能够经过确认机制中存在的缺陷利用其余漏洞(如SQL注入、跨站点脚本或缓存区溢出)
渗透测试步骤:
1.肯定任何在提交表单前使用客户端JavaScript进行输入确认的状况
2.经过修改被提交的请求,在其中插入无效数据;或者修改确认代码使其失效,向服务器提交确认机制一般会阻止的数据
3.与长度同样,肯定服务器是否采用了和客户端相同的控件,若是并不是如此,肯定是否可利用这种状况实现任何恶意意图。
4.注意,若是在提交表单前有几个输入字符须要由客户端确认机制检验,须要分别用无效数据测试每个字段,同时在全部其余字段中使用有效数据。若是同时在几个字段中提交无效数据,可能服务器在识别出第一个无效字段时就已经中止执行表单,于是使测试没法到达应用程序的全部可能代码路径。
使用客户端JavaScript程序确认用户输入的作法在Web应用程序中很是广泛,但这并不表示这种应用程序全都易于遭受攻击。只有当服务器并未采用和客户端相同的确认机制,以及可以避开客户端确认的专门设计的输入可用于在应用程序中形成某种没法预料的行为时,应用程序才存在风险。
在绝大多数状况下,在客户端确认用户输入有助于提升应用程序的性能,改善用户体验。例如,当填写详细的注册表单时,广泛用户可能会犯许多错误,如忽略必要的字段或电话号码格式出现的错误。若是不采用客户端确认机制,更正这些错误可能须要屡次提交注册页面,反而向服务器传送消息。在客户端执行基本的确认检查可以使用户得到更佳的使用体验,减轻服务器的负担。
示例代码:
<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)的形式向服务器提交这些值。然而,攻击者不须要对组件进行任何分析或实施任何攻击,就可轻松避开这种确认。若是厚客户端组件首先对收集到的数据进行某种形式的模糊处理,在将他们提交给服务器,那么厚客户端组件就成为一种更加有用,更具挑战性的目标。在这种状况下,修改被提交的值将会破坏模糊处理,所以将被服务器拒绝。要避开这种确认,必须对厚客户端组件进行分析研究,了解其执行的确认和模糊处理方法,并以某种方法破坏它的处理机制,从而实现攻击目的。
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调试工具)
渗透测试步骤:
1.分析应用程序的所有方法调用,肯定由applet返回的数据是否被提交给服务器。
2.若是数据本质上是“透明的”(即未通过模糊处理或加密),以和处理任何其余参数同样的方式探查并攻击服务器处理提交数据的过程
3.若是数据属于模糊数据,反编译applet以获取其源代码
4.分析相关源代码(首先执行返回模糊数据的方法),了解它正在执行何种处理
5.肯定applet中是否包含任何可用于对任意输入执行相关模糊处理的公共方法
6.若是其中没有这类方法,修改并从新编译applet的源代码,以达到令其执行的任何确认失效或容许模糊处理任意输入的目的。
7.而后,向服务器提交各类通过适当模糊处理的攻击字符串,以探查其中的漏洞。还应对任何其余参数进行相同的处理。
渗透测试步骤:
应对字节码模糊处理的有效策略取决于分析源代码使用的技巧和目的。下面是一些建议:
1.没必要彻底理解源代码,只需查看applet中是否包含公共方法。哪些方法能够从JavaScript中调用,它们的标签是什么,这些内容应是显而易见的;能够经过提交各类输入测试上述方法的行为
2.若是已经使用无心义的表达式(并不是Java关键字)代替类、方法和成员变量名称,那么可使用许多IDE中内置的重构功能帮助理解代码。经过研究数据的用法,就能够给它们分配有意义的名称。IDE中的“重命名”工具能够帮助完成许多工做:在整个代码库中追踪数据的用法并对每个数据进行重命名
3.选择适当的选项,在模糊处理工具中再次对模糊处理后的字节码进行模糊处理,这样既可撤销许多模糊处理。Jode是一个实用的模糊处理工具,它可删除由其余模糊处理工具添加的多余代码路径,并可为数据分配惟一的名称,为理解模糊处理后的名称提供帮助。
ActiveX控件是一种比Java applet更加“重量级”的技术。它们其实是本地Win32可执行代码,用户一旦接受并安装ActiveX控件,在该用户的彻底权限下执行时候就可实现任何操做,包括与操做系统交互。
ActiveX可用于执行几乎任何一种客户端控制,包括收集用户输入和其余包含在浏览器中的信息,并在容许客户计算机访问某种功能前,验证是否知足某些安全标准。
就HTML页面源代码而言,ActiveX控件的示例和调用方式与Java applet很是相似。
能够应用各类技巧解除使用ActiveX执行的客户端控件。
因为ActiveX控件通常由C和C++之类的本地语言编写,所以很难像反编译Java applet同样对它进行反编译,以恢复其源代码。可是,由于ActiveX控件在客户计算机上执行所有处理操做,因此,从理论上讲,那台计算机的用户可以全面检查并控制它的处理过程,从而避开控件执行的任何安全功能。
渗透测试步骤:
1.避免彻底静态解析组件代码,使用一种直观的GUI调试器监控并管理它在运行时的执行状况。例如,OllyDbg是一种简单而强大的调试器,可用于在运行时对编译型软件实施各类攻击。
2.肯定控件及其子组件使用的方法以及控件引入的任何重要的操做系统功能,特别是任何加密功能。在调试器中为这些功能设置“断点”
3.若是遇到断点,分析调用栈,肯定任何被提交给该功能的相关数据,特别是正在接受确认的用户提交的数据。经过追踪这些数据的路径来了解对他们进行的处理。
4.一般,使用调试器可轻易破坏某个进程的执行路径,使其对攻击有用。例如,修改栈中做为输入提交给某一函数的参数、修改用于传送函数返回值的EAX寄存器,或者重写比较和跳转之类的关键指令以改变函数的逻辑。若是可能,使用这些技巧解除确认控件,使函数接受可能为恶意的数据并对其作进一步处理。
5.若是在其余处理(如加密或模糊处理)以前执行数据确认,就能够利用这种多阶段的处理方式,向控件提交有效数据,而后拦截并修改已经通过确认的数据。这样就能够在将可能的恶意数据提交给服务器端应用程序以前,对其进行适当处理。
6.若是找到一种手动改变控件的处理过程,从而破坏其执行的确认方法,就能够经过在磁盘上修改控件的二进制代码(OllyDbg中有一个工具可更新二进制代码,以反映使用提示器对其进行的更改)或使用Microsoft Detours之类的检测框架在运行时链接目标进程,实现攻击自动化。
渗透测试步骤:
1.开发者一般会用有意义的短语命名ActiveX方法,所以只需经过他们的名称就可肯定有用的方法。
2.有时候,可使用不一样的输入系统的调用一个函数,而后监控该函数的可见行为,并使用调试器监控器内部工做机制,从而肯定一个函数的用途。