web安全及防御 - XSS跨站脚本漏洞

XSS又叫CSS(Cross Site Scripting:跨站脚本攻击),是最常见的Web应用程序安全漏洞之一,在2013年度Owasp top 10 中排名第三。

一、XSS原理解析

XSS是在网页中嵌入客户端恶意脚本代码,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。

JavaScript可以用来获取用户的Cookie、改变网页内容、URL跳转,即存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者需要做的仅仅是向Web页面中注入JavaScript代码。

二、XSS类型

XSS主要被分为三类,分别是:反射型、存储型和DOM型。

1. 反射型XSS

反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞,这个过程就像一次反射,故称为反射型XSS。

原理图

(1)第一步:要有URL请求localhost:3000/?xss=<img src='null' onerror='alert(1)'/>
(2)第二步:服务器端接收数据解析并响应;

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
  res.set('X-XSS-Protection', 0); // 关闭浏览器对xss的拦截
  res.render('index', { title: 'Express', xss: req.query.xss });
});

(3)XSS代码随响应内容一起传回浏览器,浏览器页面获取数据并显示;

// 使用的ejs
<body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <!-- 要不要对html进行转译,‘-’号:表示不需要进行转译 -->
    <%- xss %>
</body>

这个阶段,攻击已经生效了,举以下两种类型:

自动触发型:这是最简单的植入广告的方式

例1

引诱触发型:

例1

例2

总结:反射型,需要四处散发这个有XSS漏洞的地址,否则就是自己玩,散发出去才能攻击更多的网页,获取更多的用户信息,XSS主要存在URL上。

2. 存储型XSS

存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。

允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器接收并存储,当攻击者再次访问某个页面时,这段代码被程序读出来响应给浏览器,造成XSS跨站攻击,这就是存储型XSS。

和反射型XSS的差别在于,不依靠用户手动去触发,具有更高的隐蔽性,危害性更大。

类似评论、博客、留言板等示例

如果不对用户的输入做任何的防御,浏览器就会把XSS代码认为是正常的JavaScript代码来执行,这是很危险的。

3. DOM XSS

基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。

获取URL中参数的值,并且显示在浏览器上,从而给攻击者提供攻击的机会,攻击者可以随意在浏览器URL上输入任意XSS代码,如果不加以防范,不做任何过滤,后果会很严重。

例如:http://www.com?content=<script>alert(/xss)</script>
客户端代码:

<script>
    var temp = document.URL;  // 获取URL
    var index = document.URL.indexOf('content=') + 4;
    var par = temp.substring(index);
    document.write(decodeURI(par)); // 显示获取的内容
</script>

三、XSS高级利用

XSS不仅仅是弹出一个框那么简单,在某些情况下,XSS不弱于SQL注入。下面列举了几个常见的危害:

  • 盗取用户Cookie;
  • 修改网页内容;
  • 利用网站重定向;
  • XSS蠕虫。

四、预防XSS

XSS跨站漏洞最终形成的原因是对输入输出没有严格过滤,在页面执行JavaScript等客户端脚本,这就意味着只要将敏感字符过滤,即可修补XSS跨站漏洞。但这一过程却是复杂无比的,很多情况下无法识别哪些是正常字符,哪些是非正常字符。

1. 输入与输出

都要进行转义,才能让那些XSS代码失效。

  • &(和号)转义为:&amp
  • "(双引号)转义为:&quot
  • '(单引号)转义为:&#039
  • <(小于)转义为:&lt
  • >(大于)转义为:&gt

XSS可能发生的场景:

  • 在标签内输出;
  • 在属性内输出;
  • 在事件中输出(与属性相同);
  • 在css中输出;
  • 在script标签中输出。

OWASP提供了一系列解决XSS场景的编码器:针对输入输出。

  • html编码:
    ESAPI.encoder().encodeForHTML(String input);
    ESAPI.encoder().encodeForHTMLAttribute(String input);
  • CSS编码:
    ESAPI.encoder().encodeForCSS(String input);
  • JavaScript编码:
    ESAPI.encoder().encodeForJavaScript(String input);

防御XSS没有那么难,只要把控好输入与输出点,针对性的过滤、转义,就能杜绝XSS跨站漏洞。

2. HttpOnly

严格地说,HttpOnly对防御XSS漏洞不起作用,而主要目的是为了解决XSS漏洞后续的Cookie劫持攻击。


什么是HttpOnly:
是微软公司的Internet Explorer 6 SPI引入的一项新特性。这个特性为Cookie提供了一个新属性,用以阻止客户端脚本访问Cookie。至今已成为一个标准,几乎所有的浏览器都会支持HttpOnly。

在身份标识字段使用HttpOnly可以有效的阻挡XSS会话劫持攻击,但却不能够完全阻挡XSS攻击。因为XSS攻击的手段太多:模拟用户“正常”操作、盗取用户信息、钓鱼等,仅靠HttpOnly是不够的,防御的关键还是要靠过滤输入与输出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容