- 浏览: 2870275 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (1173)
- 名言警句 (5)
- 心情随笔 (50)
- 数据库 (57)
- Java基础 (241)
- J2EE框架 (91)
- 数据结构 (12)
- 程序设计 (21)
- WEB技术 (128)
- 网络日志 (12)
- IT资讯 (247)
- linux (64)
- solaris (2)
- 其它 (143)
- WebService (4)
- 日语学习 (2)
- 机器人 (5)
- Android (5)
- cgywin (3)
- Game (1)
- DWR (1)
- spring (8)
- canvas (1)
- Guava (3)
- Modbus (5)
- 测试 (6)
- mongodb (9)
- Quartz (2)
- Cron (1)
- windows (2)
- 持续集成 (1)
- bootstrap (3)
- 结对编程 (1)
- nodejs (1)
- Netty (1)
- 安全 (3)
- webstorm (2)
- sparkline (1)
- Job (1)
- git (3)
- Maven (3)
- knockout (5)
- jquery (1)
- bower (1)
- docker (1)
- confluence (4)
- wiki (1)
- GoogleMap (1)
- jekyll (10)
- ruby (2)
- npm (3)
- browserify (1)
- gulp (3)
- openwrt (1)
- discuz (3)
- 输入法 (1)
- JPA (1)
- eclipse (2)
- IntelliJ (1)
- css (1)
- 虚拟机 (1)
- 操作系统 (1)
- azkaban (2)
- scrum (1)
最新评论
-
pangxiea_:
你好, 想请问一下 Linux下 这么使用rxtxcomm 在 ...
使用Java进行串口通信 -
abababudei:
请教一下,这个您是怎么解决的:/dev/ttyS2enteri ...
Java应用程序的MODBUS通讯 -
xuniverse:
hannibal005 写道楼主,我问下 request.se ...
用javascript与java进行RSA加密与解密 -
atxkm:
找了一下午,终于找到了
gulp 拷贝文件时如何移除文件目录结构 -
kalogen:
gtczr 写道非常感谢,经过我自己的修改,已经完美实现。发出 ...
用javascript与java进行RSA加密与解密
【IT168 专稿】
web开发应用程序(网站),是目前应用最广泛的程序。但是开发者的水平参差不齐,导致了各种各样web漏洞的出现。本文站在分层架构的角度,分析一下如何在java web程序中找到可能出现的种种漏洞。
本文讨论的只是web程序上的漏洞,和其它漏洞,是相对独立的。这句话看似废话,实际上却说明了时常被忽略的因素,即:“很多人认为只要我开发web程序
没有漏洞,web服务器就安全了”,事实上,并非如此。一个合格的web程序开发人员,应该时刻清楚自己开发的程序会在什么环境中被使用,以及一旦自己的
程序产生某种漏洞,最终会导致什么后果。简单的说,web程序被安装在一台或多台(分布式)web服务器上,一旦安装成功,就等于在为广大用户提供服务的
同时,给入侵者打开了一条或N条新的思路。如果服务器管理员刚好对安全配置不了解(事实上,国内这种管理员居多),那么只好由我们的程序来守好最后的关卡
最后一道防线。
看了本文题目,一定有一部分人会认为,“不就是讲JSP漏洞么,用得着披着这么厚的包装么?”,为了回答这个疑问,我们先看看JSP和ASP的开发有什么
不同吧。在ASP时代(ASP,PHP等语言),开发一套系统往往比修改别人已经写好的系统痛苦的多,因为它们把所有的代码(包括链接数据库的代码、执行
SQL语句的代码、控制页面显示的代码)统统都放在<%......%>中,我们时常会看到如下代码块:
-----------代码来自某ASP木马----------- Function GetFileSize(size) Dim FileSize FileSize=size / 1024 FileSize=FormatNumber(FileSize,2) If FileSize < 1024 and FileSize > 1 then GetFileSize="<font color=red>"& FileSize & "</font> KB" ElseIf FileSize >1024 then GetFileSize="<font color=red>"& FormatNumber(FileSize / 1024,2) & "</font> MB" Else GetFileSize="<font color=red>"& Size & "</font> Bytes" End If End Function ----------------------------------------
如果客户的需求变了,要求页面不能使用“<font
color=red>”等标签,全部应用“CSS”显示。挂了,把程序员召唤出来,一个一个的改吧。。。注意,这里强调下,特指“召唤程序员”才能
改,如果是学美工的,只会HTML、JS、CSS,完了,这活还干不成。而这些只是简单的页面修改,如果客户今天说,MYSQL服务器承担不了这个数据
量,要挂Oracle,可怜的程序员就要在一片一片的代码海洋里寻找执行SQL语句的代码,而每一个文件都可能存放着SQL语句,意味着每一个文件都可能
在受SQL注入的威胁。
而JSP采用MVC模式分层架构进行开发,就可以把所有的文件分开,根据其用途,分别放在不同的文件夹下(分层),每个文件夹下的文件只负责自己的事情。
例如数据访问层的代码就放在数据访问层的文件夹下,业务逻辑层的代码也都放在自己的文件夹下,当显示层(这一层是为了把最终的运算结果显示给用户看)的需
求发生变化,就像前面的客户需求,我们只要修改这一层的文件就是了,其他层的代码根本不需要动,而修改者也不需要懂得其它层的代码。
代码分层了,意味着漏洞也在跟着分层,我们寻找JSP漏洞的思路也要跟着分层,才能与时俱进。
下面在讲述寻找漏洞的过程中,本文就拿一个简单的分层架构例子来做样板。样板程序的名称为“XX文章系统”,系统使用了STRUTS框架,和安全有关的层分为:
“DB层”
,
这一层存放了链接数据库的字符串,以及JdbcTemplate类,直接访问数据库。因为在java中,执行SQL语句的函数按照返回值可以分为三类,所
以在这一层定义了JDBC模版类(JdbcTemplate),每一次使用操作数据库时都要执行这一层的三个方法其中一个。
“DAO层(Data Access Object数据访问对象层)”
,从安全角度上看,这一层存放了SQL语句(并不执行SQL语句,语句传给DB层执行)。这一层调用“DB层”访问数据库,它只知道“DB层”的存在,不知道数据库的存在。
“SERVICE层”
,业务逻辑层,因为一个业务的实现,并不是一次数据库访问就可以完成的,所以这一层通过N次调用“DAO层的方法”实现业务逻辑,它只知道“DAO层”的存在,不知道“DB层”和数据库的存在。
“ACTION层”,调用业务逻辑层,根据返回的结果,控制JSP页面显示。它只知道业务层的存在。这一层是入侵者的攻击平台。
“Form层”
,把用户POST提交的信息封装成Form对象,经过验证后提交给ACTION层处理。
“JSP层”(显示层)
,这一层是最终显示给用户看的页面,同时也是入侵者的攻击平台。
用户通过访问ACTION层,自动会发生:“ACTION调用SERVICE,SERVICE调用DAO,DAO调用DB,DB执行SQL语句返回结果给
DAO,DAO返回给SERVICE,SERVICE返回给ACTION,ACTION把数据显示到JSP里返回给用户”。 有了样板,我们来分析这套程序中可能出现的各种web漏洞。
1、SQL注入漏洞
从SQL注入漏洞说起吧,在web漏洞里,SQL注入是最容易被利用而又最具有危害性的。怎么快速的找到呢?先分析流程,就拿用户查看文章这个流程为例:用户访问一个action,告诉它用户想看ID为7的文章,这个action就会继续完成前面所说的流程。
如果是ASP程序,这就是最容易产生问题的时候,ASP是弱类型,接到参数后不需要转换类型,就和SQL语句连加起来。但是JSP就不一样,JSP是强类
型的语言,接受有害的参数后:对于GET请求(直接在地址栏访问页面),如果这里要的是int型,即使不懂安全的程序员,也会把它(文章的ID)立刻转换
成int,因为这里转换后在后面的处理中会更容易操作,而这时程序就出错了;对于POST请求,如果这里要的是int型,程序会在把它封装成Form对象
时,因为自动要进行类型转化,同样发生错误,这两种错误发生后,根本不会访问后面的流程就跳出了,或许这就是JSP天生的安全性。所以,通常提交的变量是
int时,不会发生问题,问题会出现在string参数这里,如果要查看某用户的信息,程序可能会让你提交如下参数:showuser.do?
username=kxlzx。问题来了,因为这里是string类型,所以不懂安全的程序员顶多会判断一下是不是空,就连加成为SQL语句。有漏洞的程
序大概会写成这个样子:
ACTION的代码:showuser.do String username = null; username = request.getParameter("username"); Service service = new Service(); service.findByUsername(username); 得到参数后调用service,service层直接交给了Dao层,dao的代码: public Object findByUsername(String username) { JdbcTemplate jt=new JdbcTemplate(); String sql = "select * from Users where username='"+username"'"; List list = jt.query(sql); ................... }
dao调用了DB层的JdbcTemplate,把SQL语句拼好后,传给了JdbcTemplate去执行。不用再看这里的JdbcTemplate,就可以知道里面的代码使用了Statement的executequery()方法执行,导致了SQL注入。
分
析了这么半天,有读者会问:“难道我要费这么大的力气才能找到漏洞么?”。的确,通常在ASP程序里找注入时的思路就是这样子,但是我们现在是在使用了开
发模式分层架构的JSP程序里,应该按照分层架构的思维去找漏洞。在回答这个问题之前,我们还得绕个弯子,看看怎么在这里预防SQL注入(java始终都
是这么优美,它不会直接告诉你答案,而是一层一层的让你拨开云雾)。
刚才分析流程,是从正向分析的,从用户输入到产生漏洞,我们在防御的时候,不妨倒过来看看,从DB层入手。JdbcTemplate调用执行SQL语句,
可以有两个类供我们选择,一个是Statement,另一个就是预处理的Statement,两者有着效率上和安全上的显著差别。在效率上,只要数据库支
持预处理技术(sqlserver,mysql,oracle等都支持,只有少数access等不支持),就会在大量执行SQL语句时增加速度;在安全
上,使用预处理,会把接受的参数也经过预处理,从而不会作为SQL语句的一部分执行,而是仅仅作为SQL语句中的参数部分内容被执行。一旦DB层使用了预
处理,DAO层的SQL语句也会发生变化,成为这个样子:
public Object findByUsername(String username) { JdbcTemplate jt=new JdbcTemplate(); String sql = "select * from Users where username=?"; List list = jt.query(sql,new Object[1]{username}); ................... }
这样,SQL注入就和我们的程序几乎无关了,注意我说的是几乎,而不是全部。知道了怎么防御,于是一切在这里变的简单极了,我们应该直接去DB层找到
JdbcTemplate,看看代码,一旦使用了Statement,很好,这个系统十有八九有漏洞,下面要做的是使用Editplus搜索
“request.getParameter”。没有使用预处理的系统,可能会在action层进行防御,对参数过滤,但总有防御不到的时候,因为战线拉
的太长了,每一个action里都可能接受参数并存在漏洞。
还有一种情况,系统一部分使用了预处理,一部分没有,这样的情况可能是因为项目赶的比
较仓促,人员没有经过正规培训,最后艰难的整合到了一起。这种情况也好办,直接在DAO层搜索("')或('"),这些符号用于和字符串变量连加,拼
SQL语句,肯定是这些语句之后的代码使用了Statement。然后再往上层找,看看哪个action调用了这个有问题的dao类,也可能发生SQL注
入。
即使系统使用了预处理,别忘了,程序给客户使用后,客户有权利去扩展的。程序拿到客户那里,客户有了新的需求,而这个需求又不大,很可能不愿意花钱重新雇
人来实现扩展功能,在这个时候也可能出现问题,客户使用自己的程序员扩展AJAX功能,这个程序员因为怕出问题,不敢动源程序,就在web.xml里加了
一个servlet,这个servlet直接去调用conn。可怕的事情发生了。所以,我们的搜索漏洞规则中又加上了一条,在非dao层的文件中,搜索
“select,update,delete”等字符串。
2、暴露程序信息漏洞
这个漏洞是怎么来的呢?我们需要从异常说起。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆
出来的信息等,这个漏洞很容易防御,却很难快速定位漏洞文件。出现这样漏洞的时候,通常是我们在写代码的时候,少了一些可能性的考虑而导致的。这样的问题
都是经验造成的,而寻找漏洞也要通过经验加运气(要有仙缘。。。),我个人技术有限,就不多说了。防御的方法就是在程序中加上“Exception层”,
自定义异常,把系统产生的异常统统包装起来,不要放过任何一个可能产生异常的地方。像腾讯的异常就包装的很好“对不起,今天的注册人数已经达到十万,请您
明天再来。。。”,废话,日注册量都十万,还让不让人活啦,铁定是程序发生了异常,不敢让各位大大们看到真实的面孔。3、AJAX暴露出来的漏洞
前面讲SQL注入的时候说过
的例子就是一个典型的情况,因为大多数网站不是在开发时就拥有Ajax技术的,都是后来看大家都用了,赶时髦加上。但是在加上的同时没有意识到,在web
上增加一个文件,就等于扩展了一点攻击面。在这里我就不多说了,请参考IT168的AJAX安全专题:http://www4.it168.com/jtzt/shenlan/safe/ajax
4、业务逻辑漏洞
这个词看起来挺抽象的,他和“暴露程序信息漏洞”有很多共同点,看名字就知道,应该是存在于业务逻辑层(service层)的漏洞。这样的漏洞都和程序的运行逻辑有关,举一个例子。
小王给小李转账,在业务层的流程应该是这样子的,首先在小王的账上扣除一百元,之后在小李的账上增加一百元。
这
个过程需要执行至少两条SQL语句,也就是调用至少两次dao方法,而一旦调用中间出现问题(产生异常),就应该立刻回滚而不是跳转到异常处理机制。大家
都应该想到使用“事务处理”,是的,在一个大型复杂的项目里,一定要进行事务处理,一旦事务处理控制的不好,麻烦就大了。这就是它和“暴露程序信息漏洞”
的共同点,发现的时候,要凭经验和运气。
5、XSS漏洞
这
个漏洞也影响深远,想要发现这样的漏洞,除了在页面上进行测试外,还要从流程上入手。用户输入有害信息后,信息保存到数据库,从数据库中读出来丢给用户时
产生漏洞。也就是说我们有两个过程可以拦截,就是保存到数据库时,和从数据库读出来后交给用户时。最快的方法是直接打开数据库查看数据,如果数据没有经过
编码直接放进了数据库,那么可能性就有了一半。剩下的一半更简单,在action层搜索转码常用的字符,如果没有,就很容易发现漏洞。即使有,也不用着
急,在action层里慢慢找,很可能还有漏网之鱼。有关XSS漏洞,请参考IT168的XSS安全专题:http://www4.it168.com/jtzt/shenlan/safe/xss/index.html
6、页面层的逻辑漏洞
此类漏洞涵盖面很大,包括“暴露不该暴露的数据”、“权限控制的不精确”、“方便客户的同时存在安全隐患”等等。这类漏洞就只能靠着自己的经验,使用系统的每一个细小功能来寻找。我给出几个例子供大家参考。
例
1,“找回密码”功能,这个功能是为了方便客户的,可以通过一些客户之前确认的信息而获得客户的身份验证。有些程序的逻辑是这样的,“请输入VIP用户名
”--(判断VIP用户不存在)--“请输入提示问题答案”--显示用户密码或提供修改密码的链接。第一步,入侵者可以获得VIP用户名是否存在,进而获
取密码,第二步,一旦用户留的问题比较弱智,就等于告诉别人自己的密码。
例2,用户列表功能,试想,普通用户闲着没事看用户列表做什么?这个功分明是为了方便入侵者搜集用户名的。
例3,不要把防护交给JS,谁告诉我们使用JS可以防止用户做某些操作的?这简直是陷阱,JS只能防护普通用户而已,永远不要相信客户端提交上来的数据,我见到有人的系统在限制上传文件时,仅仅在JS里做了防护,这不是自欺欺人么?
Web
漏洞层出不穷,即使不存在以上漏洞,也别高兴的太早,我们现在使用的技术,只能防范目前上了台面的攻击,或许今天你的系统固若金汤,明天就出现了新的攻击
方法。就像04年突然出现的“上传文件”漏洞,在写代码的时候,谁能想到这里还会出现问题?本文中,我仅仅是根据自己的一些经验,以及一时灵感获得的思
路,给大家抛砖引玉来的,文中一定有没有写到的地方,而从分层架构的角度去看漏洞的思想才刚刚开始,希望每一位读者在自己的心里都有一翻序曲。期待大家文
明的踢场子和鼓励。
发表评论
-
高级Java程序员值得拥有的10本书
2015-05-04 07:24 810Java是时下最流行的编程语言之一。市面上也出现了适合初学者 ... -
深入理解java异常处理机制
2015-01-30 09:30 13271. 引子 try…catch…fi ... -
java 运行时参数设置
2015-01-07 09:13 865JVM的运行时参数: -Xms为执行单元内存的1/4, ... -
每个Java开发者都应该知道的5个JDK工具
2014-12-29 12:37 1139JDK是Java语言的软件开 ... -
使用双重锁判定可以大幅降低锁的征用
2014-12-29 12:30 746class ObjInstance { //单例 pri ... -
MAVEN Scope使用说明
2014-11-24 09:40 757在Maven的依赖管理中,经常会用到依赖的scope设置。这 ... -
Spring4 quartz job xml configuration
2014-11-11 09:46 14371. 定义job details public ... -
Add items into list in one line using guava
2014-11-10 10:54 721//@formatter:off fina ... -
配置动态读取(变化)文件 in Spring
2014-11-10 08:51 13231. 从环境变量中读取路径: <bean id=&q ... -
JAVA实现AES加密与解密
2014-11-04 15:34 659package com.eifesun.monitor.up ... -
Netty4.x分析
2014-07-31 11:06 1461官网定义: netty是一个异步、事件驱动的网络应用框架,用 ... -
Ways to sort lists of objects in Java based on multiple fields
2014-07-21 17:19 7711. the first way: Sorting wit ... -
how to parse a String to BigDecimal
2014-07-21 10:08 918private BigDecimal parsePrice( ... -
order list using google guava
2014-07-21 09:08 884Predicate<String> filter ... -
Java 读文件操作
2014-07-08 14:09 8861. only use java core, no exte ... -
怎样使Java 中测试按一定顺序执行
2014-03-10 11:27 1318@FixMethodOrder(MethodSorters. ... -
如何实现在当类初始化时,自动调动某个方法
2014-02-14 14:44 964有两种思路, 1. 将这个类实现为thread类 (or ... -
持续集成JenkinsAPI常见用法
2014-02-10 13:54 43jenkins(持续集成开源工具)提供了丰富的api接口,基 ... -
Sonar 安装与使用
2014-01-13 10:49 1730Sonar 是一个用于代码质量管理的开放平台。通过插件机制, ... -
源代码管理分析工具 Source Navigator的安装与使用
2014-01-13 09:51 1893Source-Navigator是原来redhat开发的一个 ...
相关推荐
2. **分层架构**:这种架构模式将应用程序分为多个层次或模块,如表现层、业务逻辑层和数据访问层等。每一层都有其特定的功能和职责,有利于系统的扩展和维护。 3. **微服务架构**:近年来非常流行的一种架构风格,...
web开发应用程序(网站),是目前应用最广泛的程序。但是开发者的水平参差不齐,导致了各种各样web漏洞的出现。本文站在分层架构的角度,分析一下如何在java web程序中找到可能出现的种种漏洞
9. **应用架构设计**:遵循最小权限原则,设计安全的架构模式,如使用安全的编程模型,如模型-视图-控制器(MVC)框架,以及分层设计。 10. **代码审计与安全测试**:定期进行代码审查,使用自动化工具进行静态代码...
这个系统的设计和实现涵盖了Web开发的多个方面,不仅要求开发者掌握Java编程和数据库管理,还需要理解Web应用的架构设计和测试策略。对于初学者来说,这是一个很好的实践项目,可以全面学习和应用相关知识。而对于...
JVM(Java虚拟机)在运行时会针对频繁调用的方法进行多种优化措施,以提高程序执行效率。主要的优化策略包括: - **方法内联**:对于简单的、频繁调用的小方法,JVM可能会将其代码直接嵌入到调用者的方法体中,从而...
- 分层架构:通常包括表示层、业务逻辑层和数据访问层,使系统更易于维护和扩展。 - 部署便捷:通过容器进行组件部署,简化了应用的部署和配置过程。 - 可移植性:基于标准的API,确保应用程序能在不同的J2EE兼容...
- 分层架构:通常包括表示层(用户界面)、业务逻辑层、数据访问层,各层之间职责分明,易于扩展和维护。 - 微服务架构:将复杂系统拆分为多个小型独立服务,提高系统的可伸缩性和可靠性。 3. **核心技术**: - ...
分层架构:将系统划分为表现层、业务逻辑层和数据访问层,以便实现代码的模块化和易于维护。 功能设计: 用户管理:支持用户注册、登录、个人信息管理等功能,确保用户身份的安全和可靠。 商品管理:提供商品浏览、...
- **架构设计**:采用分层架构设计,确保各层之间职责分明、易于扩展和维护。 - **界面设计**:设计简洁美观的用户界面,提升用户体验。 - **数据库设计**:根据需求分析结果,设计合理的数据库表结构,确保数据...
在使用开源借贷系统源码时,应确保遵守开源协议,如MIT、Apache等,并且对源码进行充分的安全审计,以避免潜在的漏洞和风险。 总结,这套开源的借贷系统源码提供了完整的前后端解决方案,对于开发者来说,是一个...
- 采用分层架构,将系统分为表现层、业务逻辑层和数据访问层。 - 使用JSP实现表现层,Spring MVC作为控制层处理请求和响应,MyBatis作为数据访问层与MySQL数据库交互。 - **关键技术**: - Spring框架:用于实现...
Struts 是一个开源的Java框架,主要用于构建基于MVC(Model-View-Controller)模式的Web应用程序。在本文中,我们将深入探讨Struts框架的基本概念、工作原理以及它在开发博客系统中的应用,同时也会触及到描述中提到...
通过分层架构和模块化设计,提高了系统的灵活性和可扩展性。 #### 4.2 关键组件实现 重点讨论了JSP页面的设计与实现、JavaBeans组件的开发以及Servlet的使用方法。同时,还介绍了如何通过合理的配置和编程技巧来...
在项目经验方面,求职者参与过CRM客户关系管理系统的开发,使用Microsoft Visual Studio 2021和Dreamweaver等工具,配合SQL2021数据库,项目采用了分层架构,包括Web、BLL和DAO层,利用Ajax和XML技术。他在这个项目...
SSM框架的选用是因为它具有良好的分层架构,Spring负责控制层,SpringMVC处理视图和控制,MyBatis处理数据访问。这种组合可以提高开发效率,降低耦合度,便于维护和扩展。使用MySQL数据库是因为其广泛的应用和高效的...
文档还特别关注了安全性和合规性的方面,提供了 OWASP(开放 Web 应用程序安全项目)和 CVE(常见漏洞和暴露)的角度来分析潜在的安全威胁,并提出了相应的防范措施。 - **OWASP 观点**:从 OWASP 的十大安全风险...
这种分层架构有助于代码组织和模块化,便于后期维护和扩展。 **安全性考虑** 在开发过程中,必须注意网络安全,如防止SQL注入、XSS攻击等。这需要正确处理用户输入,使用预编译的SQL语句,并对敏感信息进行加密。...
- **SSM**:即Spring、SpringMVC、MyBatis框架的组合,用于构建分层的Java Web应用程序。 - **JSP**:Java Server Pages,用于创建动态网页。 #### 关键技术详解 ##### SpringBoot框架 SpringBoot是一个基于...