常见漏洞以及修复方法

更新时间:2024-03-28 19:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

常见漏洞以及修复方法

文:政府事业本部第一事业部 劳动人事开发部 刘世涛

1

目录

(一) (二)

前言 ......................................................................................3 常见漏洞及原理分析 ...................................................................3 1. sql脚本注入 .......................................................................3 2. 跨站点脚本编制 ...................................................................3 3. 不安全的HTTP方法及登录验证相关 ...........................................4 4. 跨站点请求伪造 ...................................................................4 5. 危险性较低的开发及配置问题 ...................................................4 系统防御原理 ............................................................................5 1. sql脚本注入 .......................................................................5 2. 跨站点脚本编制 ...................................................................5 3. 不安全的HTTP方法及登录验证相关 ...........................................6 4. 跨站点请求伪造 ...................................................................6 5. 危险性较低的开发及配置问题 ...................................................6 结语 ......................................................................................7

(三)

(四)

2

(一) 前言

在做互联网的项目中,由于网络用户数量大、环境更加复杂,对系统安全的考虑要更加慎重和全面。我在部门中参与了多个互联网项目,以此为基础,并结合IBM AppScan安全工具,介绍一下我们遇到的几个安全方面的问题及其原理和解决方案。

我们的项目使用的技术主要包括:spring、spring MVC、freemarker、hibernate。 本文主要站在软件系统的构建者和开发者的角度出发,类似网络环境、服务器配置等,可以参考其他资料。 (二)

常见漏洞及原理分析

1. sql脚本注入

后台执行sql语句时,使用字符串拼接的方式,并且该字符串是使用浏览器提交的数据时。攻击者将提交的数据就行修改,可以达到执行希望的sql的目的。该攻击比较危险,可能会造成数据破坏和数据盗取的后果。

例如:用户提交username和password两个字段,系统后台判断语句为

String sql = “select * from user where name=’”+username+”’ and password=’”+password+”’”; 后台通过判断查询结果是否为空,来决定用户的账号和密码是否正确。 如果用户将username的值写为 admin‘ or 1 or ‘,并且存在账号名称为admin的管理员用户,则可以直接以admin登录成功。

以上例子只是很简单的一种状况,如果某些功能处理不好,有可能会造成大量数据被盗取的严重后果。

2.

跨站点脚本编制

攻击者在浏览器向服务端提交的数据中,加入危险的内容,如js脚本等。如果服务器端没有响应的防御措施,则会被注入跨站脚本。典型的攻击分为两类:

持久型:例如攻击者在某博客内留言,该留言内容中嵌有一段获取用户账号cookie的JS脚本。该博客被某个登录用户访问时,脚本会在用户未知的情况下运行,就会被盗取账号等个人信息。

非持久型:攻击者在查询的请求内,使用URL参数的方式添加html语法内容和非法js脚本,并且将该URL发送给登录用户。登陆用户点击连接之后,脚本会在用户未知的情况下运行,就有可能被盗取账号等个人信息。

3

3. 不安全的HTTP方法及登录验证相关

针对现有的常见漏洞进行解释:

1. 已解密的登录请求、启用了不安全的 HTTP 方法:如果没有使用https协议,攻

击者可以在网络层面对数据进行拦截。针对登录、注册等功能,账户等主要信息会被法拦截。

2. 不充分帐户封锁:攻击者可能会使用穷举法对密码进行暴力破解。

3. 会话标识未更新:用户在未登录和登录后的sessionid没有进行更新,则攻击者

仿造一个带有自定义的jsessionid参数的URL发送给被攻击者,通常为登录页面,如果被攻击者点击链接之后,进行了登录操作,jsessionid未更新,并且攻击者拥有这个jsessionid,则可以使用这个sessionid作为攻击者自身的信息,进入系统后,就拥有了被攻击者的权限。

4. 跨站点请求伪造

在某个非法网站的页面内嵌入允许跨站点的标签,例如js、img标签。标签的src属性为某个操作的请求,例如转账、授权等等。当用户在登录被攻击网站之后,如果访问该非法页面,则会自动向被攻击网站发送一条请求,此时网站认为该请求是用户本人的操作,攻击成功。

5.

危险性较低的开发及配置问题

1. Bash Shell 历史记录文件检索

服务器配置

2. Robots.txt 文件 Web 站点结构暴露 3. 会话 cookie 中缺少 HttpOnly 属性

会话cookie没有HttpOnly属性,则在浏览器端可以使用js等手段进行修改 4. 自动填写未对密码字段禁用的 HTML 属性

自动记录密码功能

5. HTML 注释敏感信息泄露

注释信息中含有某些关键字,如password等等 6. 发现电子邮件地址模式

注释或代码中存在邮件格式的信息,可能会有信息泄露 7. 发现内部 IP 泄露模式

返回信息中,带有内部IP信息,可能会有信息泄露 8. 客户端(JavaScript)Cookie 引用

浏览器端运行的js文件对cookie进行了引用,可能会被攻击者利用。

4

(三) 系统防御原理

1. sql脚本注入

要求所有的人员在开发过程中,杜绝食用字符串直接拼接sql语句的方式,而使用预编译或命名参数的方式。

例如:

String sql = “select * from a where b=’”+name+”’”; //name为浏览器请求的参数 1. 预编译的sql在jdbc中的体现为preparedstatement。

查询语句应为:select * from a where b=? ,时候使用preparedstatement.setXXX的方法进行变量设置。

2. 命名参数在常用的orm框架中都有对应的方法,以spring的jdbctemplate为例:

String sql =” select * from a where b=:name”; jdbctemplate.query(sql, new Object[]{name}, …)

3. 通常使用hibernate等orm框架,使用其对应的java bean进行增删改查操作都

是安全的。

现在处理漏洞方法:使用过滤器来过滤非法字符,解决该漏洞!但是在程序开发中,请不要使用直接拼接sql语句! 过滤器代码:

2.

跨站点脚本编制

该漏洞的核心原因是未针对用户提交的数据中含有html语义的内容进行替换,从而造成用户提交的数据可以被客户端执行造成的。

解决办法就是针对用户提交的数据进行处理,将其中的特殊字符替换为用于显示的html实体。例如:小于号(<)替换为<等等。如果你使用用于页面展示的模板引擎,那恭喜你。这些模板引擎通常有自带的处理方法,可以方便的将特殊子图替换掉。如果没有,那就需要自己进行替换,建议使用正则表达式,方便效率。 下面以我们项目为例,介绍我的处理方法。

1. 数据库层面:添加系统级配置管理模块,对系统库表和字段进行配置。针对需

要进行替换的数据库表和字段,在管理模块内配置为需要替换。系统会在该字段被修改和保存时,通过hibernate拦截器。对数据内的html语义字符替换为html实体,如小于号(<)、大于号(>)等。该操作可以防御危险性较高的持久型跨站点脚本攻击。

2. 页面显示层:添加系统级配置管理模块,对用户请求页面进行配置。针对需要

进行替换的页面,将页面动态显示内容(freemarker变量内容,例如动态显示的用户名称、展示数据等)进行替换,对数据内的html语义字符替换为html实体。该操作可以防御所有的跨站点脚本攻击。例如:攻击者使用伪造请求数据的方法,提交了非法的js脚本,该请求数据在freemarker渲染页面时,作为语句开

5

发的

Top