了解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),从而 ...
随机推荐
- 织梦dedecms整合discuz论坛的操作方法
织梦dedecms和discuz论坛整合主要用途,是让两个系统共享用户数据,同一个用户可以在两个网站都可以登录.在我们制作织梦cms模板的时候,有时需要整合discuz里的东细.本文主要讲解一下ded ...
- linux CentOS安装telnet
1.检查linux版本号 cat /etc/issue 2.检查是否已经安装telnet rpm -qa | grep telnet 上面的显示是已经安装.就不须要再安装了,假设没有,接着下一步吧. ...
- ios开发之 --调用系统的页面,显示中文
在开发的过程中,我们会接入很多的sdk,比如相机,相册,是否允许获取位置等,大多数的情况下是默认显示英文, 在plist文件里面添加一个key就可以了,如下图: key:Localization na ...
- Excel 一个工作表进行按行数拆分
1. 如下Excel表,总共有120多行数据,如何将以50行数据为一个工作表进行拆分 Sub ZheFenSheet() Dim r, c, i, WJhangshu, WJshu, bt As Lo ...
- Android软键盘的隐藏显示研究
http://winuxxan.blog.51cto.com/2779763/522810 全局推: android:windowSoftInputMode="adjustResize&qu ...
- 160309、Spring AOP操作action时无法注入,报空指针错误
今天帮同事看个问题,action注入失败,代码没问题,主要是stuts2权限移交的问题,特此记录一下 Spring AOP操作action时无法注入,报NullPointer异常 当使用Spring ...
- 按批次处理list数据 (list按条数取)
按批次处理list数据的两种方法 主要应用于list存储数据过多,不能使list整体进行其余操作 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 基于xml文件的格式配置Spring的AOP
用例子直接说明: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...
- react 快速 点击
用 fastclick npm 一下 他 就可以
- sevlet实现反盗链
有时候为了网站的版权和安全问题,我们需要为我们的网站应用设置防盗链,这样可以保证我们网站的一些资源的安全性.防盗链的主要是通过获取http的请求头referer的信息来和我们的网站地址做对比,如果相同 ...