了解Java应用中的开发攻击
注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果。
下面是几种主要的注入式攻击途径,原则上提供动态执行能力的语言特性,都需要地方发生注入攻击的可能。
1. SQL注入攻击。一个典型的场景就是Web系统的用户登录功能,根据用户输入的用户名和密码,我们需要去后端数据库核实信息。
假设应用逻辑是,后端程序利用界面输入动态生成类似下面的SQL,然后让JDBC执行。
select * from use_info where username="input_usr_name" and password="input_pwd".
但是,如果我输入的input_pwd 是类似下面的文本
" or ""="
那么拼接出的SQL字符串就变成了下面的条件,or的存在导致输入什么名字都是符合条件的。
select * from use_info where username="input_usr_name" and password="" or ""="".
它是利用了期望输入和可能输入之间的偏差。类似场景可以利用注入的不同SQL语句,进行各种不同目的的攻击,甚至还可以加上";delete xxx"之类语句,如果数据库权限控制不合理,攻击效果就可能是灾难性的。
2. 操作系统命令注入。
Java语言提供了类似Runtime.exec(...)的API,可以用来执行特定命令,假设我们构建了一个应用,以输入文本做为参数,执行下面的命令
ls -la input_file_name
但是用户如果输入“input_file_name;rm -rf/*” ,这就有可能出现问题了。Java标准类库本身进行了非常多的改进,所以类似这种编程错误,未必可以真的完成攻击,但其反应的一类场景是真实存在的。
3. XML注入攻击
Java核心类库提供了全面的XML处理、转换等各种API,而XML自身是可以包含动态内容的,例如XPATH,如果使用不当,可能导致访问恶意内容。
还有类似LDAP等允许动态内容的协议,都是可能利用特定命令,构造注入式攻击的,包括XSS(Cross-site Scripting)攻击,虽然并不和Java直接相关,但也可能在JSP等动态页面中发生。
知识扩展
1. Java应用安全,主要涉及哪些安全机制。
1) 运行时安全机制。
可以简单认为就是限制Java运行时的行为,不要做越权或者不靠谱的事情
----类加载过程中进行字节码验证,以防止不合规的代码影响JVM运行或者载入其他恶意代码
----类加载器本身也可以对代码之间进行隔离,例如,应用无法获取类加载器对象实例,不同的类加载器也可以起到容器的作用,隔离模块之间不必要的可见性。
----利用SecurityManager机制和相关的组件,限制代码的运行时行为能力,其中,可以定制policy文件和各种粒度的权限定义,限制代码的作用域和权限,例如对文件系统的操作权限,监听某个网络端口的权限等。Java的安全模型是以代码为中心,贯穿了从类加载到应用程序运行时权限检查等全过程。
----Java的GC等资源回收管理机制,都可以看作是运行时安全的一部分,如果相应机制失效,就会导致JVM出现OOM等错误,可看作是另类的拒绝服务。
2) Java提供的安全框架API,这是构建安全通信等应用的基础
----加密、解密API。
----授权、鉴权API。
----安全通信相关的类库,比如基本HTTPS通信协议相关标准实现,或者复数的类似证书撤销状态判断等协议实现。这一部分API内部实现是和厂商相关的,不同的JDK厂商往往会定制自己的加密算法实现。
3) JDK集成的各种安全工具
----keytool,这是个强大的工具,可以管理安全场景中不可或缺的秘钥、证书等,并且可以管理Java程序使用的keystore文件。
----jarsigner,用于对jar文件进行签名或者验证。
----在应用实践中,如果对安全要求非常高,建议打开SecurityManager,-Djava.security.manager,就会导致10%~15%的性能下降,在JDK9以后,这个开销有所改善。
2. 安全漏洞
1) 按照传统的定义,任何可以绕过系统安全策略限制的程序瑕疵,都可以算作安全漏洞。
2) 但是要达到攻击的目的,未必都需要绕过权限限制。比如利用哈希碰撞发起拒绝服务攻击,这种攻击方式无关于权限,可以看作是程序实现的瑕疵,给了攻击者以低成本进攻的机会。
3. 对SQL注入式攻击的解决办法
----在数据输入阶段,填补期望输入和可能输入之间的鸿沟。可以进行输入校验,限定什么类型的输入是合法的,不允许输入标点符号等特殊字符,或者特定结构的输入
----在Java应用进行数据库访问时,如果不用完全动态的SQL,而是利用PreparedStatement,可以有效防范SQL注入。不管是SQL注入还是OS命令注入,程序利用字符串拼接生成运行逻辑都是个可能的风险点。
----在数据库层面,如果对查询修改等权限进行了限制,就可以在一定程度上避免被注入删除等高破坏性的代码。
----尽量使用较新版本的JDK,并使用推荐 的安全机制和标准。。如果有看过JDK release notes,会发现JDK会修复已知的安全漏洞,并且会对安全机制进行增强
了解Java应用中的开发攻击的更多相关文章
- MAXIMO系统 java webservice 中PDA移动应用系统开发
MAXIMO系统 java webservice 中PDA移动应用系统开发 平时经常用的wince PDA手持设备调用c#写的webservice, 当然PDA也可以调用java webservic ...
- Java 泛型在实际开发中的应用
java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...
- Java 数据类型在实际开发中应用
在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决
问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
- Java数据类型在实际开发中的应用一
在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...
- Java反射库中的安全漏洞在30个月后终于修复了(转)
2013年7月,安全组织Security Explorations发现了Java 7u25中的一个安全漏洞,通过这个漏洞攻击者可以完全摆脱Java沙箱.Oracle在更新的7u40中包含了一个补丁,但 ...
- 深入理解Java虚拟机--中
深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而 ...
随机推荐
- ASP.NET MVC 随想录
http://www.cnblogs.com/OceanEyes/category/696137.html
- VC中的学习点滴
1. __stdcall 和 __cdecl __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,由调用者负责 ...
- Swig 使用指南 (express模板)
如何使用 API swig.init({ allowErrors: false, autoescape: true, cache: true, encoding: 'utf8', filters: { ...
- THINKPHP5操作数据库代码示例
数据库表结构 #表结构 CREATE TABLE `qrcode_file` ( `id` ) NOT NULL AUTO_INCREMENT, `active` ) ' COMMENT '是否有效' ...
- Android "Please ensure that adb is correctly located at" 错误
转自:http://blog.csdn.net/hyx1990/article/details/12681207 遇到问题描述: 运行Android程序控制台输出 [2013-10-13 16:45: ...
- 应用开发之Linq和EF
本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知 ...
- AVR 定时器快速PWM模式使用
PWM很常用,AVR自带内部PWM功能,分为快速PWM模式和相位修正PWM模式. 我们这里选择方式15 ,由OCR1A保存上限值,由OCR1B保存匹配值,所以输出管脚 OCR1A不能输PWM,只能 ...
- Firefox 新增容器标签:可同时登录多个用户
Mozilla昨天在Firefox夜间构建版50.0a1中增加了一个名为“容器标签Container Tabs”的实验性功能. Mozilla的工程师称,该功能可以将用户的浏览会话分到不同的容器中.这 ...
- 读取properties文件------servletcontext及dao层读取
用servletcontext读取properties文件-------1) 重点在于:InputStream in=this.getServletContext().getResourceAsStr ...
- 网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。
网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型. 每一层实现各自的功能和协议,并且都为上一层提供业务功能.为了提供这 种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后 ...