(1)使用上述技巧下载组件的字节码,解压字节码,然后将其反编译成源代码。
(2)查看相关源代码,了解组件的执行过程。
(3)如果组件包含任何可进行操纵以实现目的的公共方法,可以拦截与该组件交互的HTML响应,并在其中添加一些JavaScript,以使用输入调用相应的方法。
(4)如果组件中不包含公共方法,可以通过修改组件的源代码,重新编译修改后的代码,然后在浏览器中或作为独立的程序执行这些代码,从而达到目的。
(5)如果组件用于向服务器提交模糊或加密数据,则可以使用修改后的组件向服务器提交各种经过适当模糊处理的攻击字符串,以探查其中的漏洞,就像针对任何其他参数实施攻击一样。
4.字节码模糊处理
由于攻击者可轻松反编译字节码以恢复其源代码,因而人们开发出各种技巧来对字节码进行模糊处理。经过模糊处理的字节码更难以反编译,或者反编译后得到的是可能造成误导或无效的源代码,这些代码非常难以理解,不投入大量精力无法进行重新编译。以下面经过模糊处理的Java源代码为例:
常用的模糊处理技巧包括以下几种。
用没有意义的表达式(如a、b、c)代替有意义的类、方法和成员变量名称。这迫使阅读反编译代码的攻击者只有通过研究表达式的使用方法才能确定它们的用途,因此他们很难明白这些表达式的作用。
更进一步,一些模糊处理工具用new和int之类的保留关键字代替项目名称。虽然从技术上讲,这种字节码是非法的,但大多数虚拟机(VM)允许使用这种非法代码,并正常执行它们。不过,尽管反编译器能够处理非法字节码,但这样得到的源代码比前一种方法生成的源代码更加难以阅读。更重要的是,如果不投入大量精力对非法命名的数据项统一进行重命名,就不能重新编译源代码。
许多模糊处理工具删除字节码中不必要的调试和元信息,包括源文件名和行号(使桟追踪缺乏信息)、局部变量名称(使调试更麻烦)和内部类信息(使反射无法正常进行)。
增加多余的代码,以看似有用的方式建立并处理各种数据,但它们与应用程序的功能实际使用的数据并无关系。
使用跳转指令(jump instruction)对整个代码的执行路径进行令人费解的修改,致使攻击者在阅读反编译得到的源代码时无法判别执行代码的逻辑顺序。
引入非法的编程结构,如无法到达的语句和缺少return语句的代码路径。大多数VM允许在字节码中出现这种结构,但如果不更正非法代码,就无法重新编译反编码得到的源代码。