XSS和SQL漏洞总结与防御

  • 2016-01-20
  • 985
  • 0

web安全

一.什么是XSS和SQL漏洞

1.1 什么是XSS

Xss是cross site script 跨站脚本的简称,因简写与css相同,故改为xss。是一种在网站页面注入html的攻击方式。

常见的XSS分为三种:

  1. 反射式XSS:这种XSS漏洞一般攻击人数较少,一般是将用户输入直接输出到html页面中,若其中包含script或其他可执行的方法,则会在html中得以表达,常用于窃取用户cookie或钓鱼行为,攻击一般一次为一个人。
  2. 存储式XSS:这种XSS攻击范围则比较大,具有持久性。可能会造成严重的后果,常发生于用户可自定义的地方,如博客、帖子、签名档、留言等地方。从而批量攻击目标,攻击目标为多人。
  3. DOM base XSS:这种攻击与反射式类似,是通过修改网页的DOM节点实现攻击的方式,本质与反射式攻击相同,攻击目标为一次一个人。

 

1.2 什么是SQL注入

Sql注入,是由于未对于用户输入进行过滤,将非常规的输入直接拼接入sql语句中,使之与预期sql语句不同,从而达到攻击者目的的一种方式。

这两种漏洞一直排在OWASP(开放式web应用安全项目) top 10前列。

二.XSS和SQL注入是如何工作的

2.1 XSS的工作原理和解决

XSS是一种在网站页面中插入自定义html的方法。由于输入不被期待的值,而未经过过滤回显到html中从而导致被攻击的手段。

常见的xss攻击分为反射式和存储式。

2.1.1 反射式XSS

反射式sql通常以个人为目标,被攻击者在网站的权限越大,危害也越大。常用于获取用户的cookie构造登录凭证,若该凭证可以直接登录,则不需要知道密码就可以实现攻击。

例: 假设有页面a

如上网页,当输入的username为abc<script>alert(‘你被攻击了’)</script>时,就会实现攻击,若黑客诱使该网站用户进入一个如下的URL:www.a.com?username=abc%3Cscript%3Edocument.location=%22http://www.b.com%22%3C/script%3E

用户看到其以www.a.com开头,信任了该网址,而实际点开后会跳转到www.b.com若将www.b.com和www.a.com登录页面相同,就实现了钓鱼攻击。从而获取了用户的账号密码。

这样的页面就存在严重的XSS漏洞,而原本我们的期望是不管输入什么,全都当作username的内容,页面显示为:

你好,abc<script>…</script>!

产生这个漏洞的原因是,我们的输入加入html中时,会当作html的一部分,而不是一个字符串。因此会被当作html进行解析,在html中<script>就是脚本,于是script中的内容就作为脚本运行了。

所以,阻止此处攻击的方式就是让它以我们需要的形式进行编码,即此处对输入进行html编码,即以如下形式解决:

蓝色带有abc的地方会进行不同方式的编码,其中abc’s item、abc、abc’s link会进行html解码 abc\’s onclick 会先html解码,再进行js解码,http://www.abc.org 会进行url解码,abc’s URL 会先进行js解码,再进行url解码。

所以在这些地方,如需使用动态的值,需要进行相应的编码,多层解码处,也需要多层编码。

回归到我们的代码错误处:

Php:

Html:

红色的地方一个在<span>体中,一个在标签的value属性中,这两处都会进行html解码,由于我们返回的值没有经过转码,相当于直接用cookie中的值替换此处,如使用如下参数:

从而将其转化成

聪明的浏览器,会将其理解为

从而导致将灰色区域理解为div中的内容,会对其当成js执行,你也会在input标签后面看到”/> 的内容。

我们的输入是会经过过滤的,但此处不行的原因是此处使用的参数是cookie,只有get和post的参数才会经过过滤。

当然,get和post的过滤规则也可能会有漏洞,但只要我们在这些地方使用正确的编码,就可以从根本上杜绝XSS反射式漏洞。

2.1.2 存储式XSS

为什么不使用以上方式杜绝存储式XSS呢?

主要用于,我们有允许用户进行一定程度自定义的需求,如我们允许用户设置签名档,设置背景,排版格式,字体大小等。这些地方则不适合对其进行编码,是展示个性的地方,于是我们需要过滤规则。

存储式XSS也是在网页中插入html的一种攻击方式,但插入的方式具有存储性,可以达到多次攻击的目的,主要方法是在这些可以一定程度自定义的地方,插入不被希望的代码,从而在页面加载时,执行这些代码。如在一篇博客中插入偷取cookie的代码,所有浏览者,都将被偷取cookie。

XSS过滤的规则主要有白名单和黑名单两种方法,白名单,即我们允许用户做什么,其他一律禁止,黑名单,即我们不允许用户做什么,其他都可以做。

我们使用的是黑名单的方式,其中用户定义的所有script都不是我们想要的,定义的url地址也不一定是我们想要的,其他排版格式字体没有问题的。

所以,我们需要过滤所有的script、link、base、iframe等标签,同时有些属性也可以定义script,如所有on开头的如onclick,部分style,再其次,我们要过滤一些可能导致界面变化的标签,如富文本定义在<textarea>中,如果在文本中出现</testarea>也会影响我们的页面显示。

过滤到此处,绝大多数的XSS都能够得到有效过滤,但如果用户定义了一个钓鱼链接呢?使用黑名单很明显就行不通了,此处应该使用白名单对url进行过滤。

Url可能有以下几种:http、https、ftp、file,在html中,只有完整的url才会跳转,否则认为是内部地址,所以,需要匹配标签中的http、https、ftp、file,对这些进行过滤即可。

 

至此,只要程序正确,就可以排除几乎所有的XSS了。

2.2 SQL注入的原理和解决

SQL注入,一直列在OWASP TOP 10的榜首,主要是因为其危害十分巨大,且隐藏较为隐蔽,且常常出现。

SQL注入即通过构造特殊的输入,达到破坏者目的的一种手段,是攻击者较常使用的攻击手段。

出现这种问题的原因是,服务器没有对用户输入进行过滤导致产生不被期望的sql,从而获得不被期望的结果。

此次SQL漏洞中,由于编码中直接使用前台输入的用户名构造sql从而导致SQL注入。

代码如下:

代码中红色标注的地方就是产生注入的原因$strUserCode是没有过滤的用户输入,当攻击者以如下的形式输入时:

将其替换到$strUserCode时,就变成了这样:

如上蓝色部分,则变成了一个一定成立的条件,只要用户提交的密码,与任意用户的密码一致,就会匹配成功,从而以该用户的身份进入系统中。

SQL注入的危害十分巨大,当攻击者进入系统后,可以进行较多的操作,对于越靠近数据的站点,权限越大的用户,其危害也越大。

解决办法:在thinkphp中我们推荐使用数组的形式进行,即将where中的内容替换成如下形式:

Thinkphp的数组形式为什么可以有效防止sql注入?

因为其会对数据进行过滤,会过滤掉不被希望的内容,转义单引号等操作,输入最终会转义成

于是用户的输入又重新被看作一个整体。

PDO

当前的数据库链接方式是MYSQLi,其与mysql链接方式不同之处在于链接的时长,前者为长链接,后者为短链接。长链接在经常进行数据库的方法中,可以减小多次链接的时间损耗。

PDO是另一种通用的数据库链接方式,常用的关系型数据库几乎都支持。是官方推荐的数据库访问方式。

PDO的精髓在于其模板与数据分离的方式,不管是mysql还是mysqli,一次数据库操作都是一次将完整的SQL语句进行操作。数据过滤,由服务器完成,将过滤后的sql用于数据库访问。

而PDO将模板与数据分为两次传输给数据库,数据库根据模板自行过滤,这种方式可以更有效的保证其安全性,从根本上杜绝了sql注入的可能性。在mysqli中,仍然可以通过构造特殊的字符进行注入。

 

三.总结与其他

1.对于XSS漏洞,明确不需要富文本的地方,对于无法保证的数据,一定要进行正确的编码:

前端如何解码,后台反向编码

常见格式如下:

<X>输出</X> 将输出进行html编码<X>htmlencode(输出)</X>

<X value=”输出” ></X> 对于html解码的属性,进行html编码

<X onclick=”输出” ></X> 对于先html解码再js解码的属性,进行js编码再html编码

<X url=”输出” ></X> 对于url解码属性,进行url编码

2.cookie都是没有经过xss过滤的,不允许直接返回到页面上

 

  • 不能直接使用用户输入构造sql语句,请使用数组形式,或pdo的方式进行

PDO在basemodel中定义,PDO为惰性链接,不使用时,不会链接数据库,故不会产生影响,

使用PDO请务必使用其精髓进行:先构造模板->再构造参数。此外,模板是可以复用的。

其他:

  1. 对于这两个漏洞,我相信程序中还是有其他地方存在的。
  2. 对于第一个XSS漏洞,其利用难度是十分大的,需要黑客可以修改用户的cookie,这是十分困难的。
  3. SQL注入漏洞是此次漏洞的重点,此漏洞利用十分简单,影响较大,应当引起重视。若编程人员在编写代码时,牢记编码规范,SQL注入漏洞是可以避免的。
  4. 网站并不是只有这两种漏洞,还有其他的漏洞可以被利用,希望大家可以规避可能遇到的风险。
  5. 推荐《白帽子讲web安全》。

 


上一篇:  下一篇:

评论

还没有任何评论,你来说两句吧

Copyright © 2014-2016 lxlxw All Right Reserved