了解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),从而 ...
随机推荐
- VC++ ListCtrl Report使用
1.在VC++ 6.0中新建基于对话框的MFC应用程序ListCtrl; 2.在主对话框上添加一个List Control至合适的位置及大小: 3.在对话框OnInitDialog中初始化ListCt ...
- Apache里的httpd-vhosts.conf详解
首先看下面的配置: <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "D ...
- Linux GCC编译使用动态、静态链接库 (转)
原文出处:http://blog.csdn.net/a600423444/article/details/7206015 在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.s ...
- VS2008 AddIn 操作DTE2
在VS2008扩展开发中,最重要的就是DTE对象.DTE对象提供了对扩展性模型中其他对象的访问.DTE是VS自动化模型中的顶级对象. 在按照http://www.cnblogs.com/yjf512/ ...
- Jquery之编辑不可修改
<td class="queryTitle" width="100">优惠券批次号</td> <td class="qu ...
- Maven新建一个Spring MVC项目
新建一个Maven项目,选择archetypes为maven-archetype-webapp,相关的名称按个人习惯取,我这里取Group Id:moonlit-groupArtifact Id:mo ...
- Struts2漏洞利用原理及OGNL机制
Struts2漏洞利用原理及OGNL机制研究 概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成 ...
- NIO概览
NIO专题:http://developer.51cto.com/art/201112/307172.htm 一.新IO概述: 新IO和传统IO都是用于进行输入/输出,相比于传统IO面向流的处理方式, ...
- winform实现QQ聊天气泡200行代码
c# winform实现QQ聊天气泡界面,原理非常简单,通过webKitBrowser(第三方浏览器控件,因为自带的兼容性差)加载html代码实现,聊天界面是一个纯HTML的代码,与QQ的聊天界面可以 ...
- Windows的445端口(文件共享)
周鸿祎:教育网大量电脑445端口暴露,导致中招_科技_腾讯网 http://tech.qq.com/a/20170513/016133.htm 互联网周鸿祎2017-05-13 12:04 据36 ...