暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅析XSS漏洞

小9运维 2021-08-09
953

一、XSS简介

XSS跨站脚本攻击(Cross Site Scripting),为了不与前端层叠样式表(Cascading Style Sheets,CSS)混淆,故将跨站脚本攻击简称为XSS。

XSS是恶意攻击者对Web页面插入恶意Script代码,当用户访问该页面时,嵌入在该Web页面中的Script代码就会被执行,从而达到恶意攻击用户的目的。XSS是目前Web安全最普遍的漏洞,也是Web攻击中最常见的攻击方式之一。


二、XSS分类

1.反射型XSS

反射型XSS也称非持久性XSS,在网页中将可控参数注入XSS代码,提交服务器端进行参数处理,但不存储,服务器端把带有XSS的数据发送到浏览器,浏览器解析、执行代码,就造成了XSS漏洞,这个过程就像是一次反射,所以叫做反射型XSS。

该类型XSS具有临时性特点。攻击者构造恶意代码,需要诱使用户“点击”恶意链接,才能攻击成功,达到窃取用户数据或冒充用户等目的。反射型XSS漏洞常见于通过URL传递参数的功能处,如网站搜索、跳转等。

2.存储型XSS

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

攻击者可访问网页,表单注入XSS代码后提交,服务器端接收并存储,通过网页注入的代码会被存储在数据库或其他物理文件中,当攻击者或用户再次访问网页时,被注入的XSS代码就会被程序读取出来响应给浏览器执行,造成XSS攻击,这就是存储型XSS。

该类型XSS具有持久性和稳定性的特点。存储型XSS常见于带有用户保存数据的功能处,如评论、发帖、私信等。

3.DOM型XSS

DOM型XSS是特殊类型的反射型XSS,不同于以上两种类型XSS,以上两种类型XSS属于服务器端的安全漏洞,而DOM型XSS属于前端JavaScript的安全漏洞。

通过网页可控参数注入XSS代码,提交服务器端请求页面,此时,服务器端程序不对参数数据进行处理与存储,页面返回响应后,浏览器JS才对参数数据进行处理、执行代码,造成XSS漏洞,该类型XSS也具有临时性特点。


三、XSS漏洞相关示例

1.参数未做任何过滤

以下例子为XSS Game关卡1

如下图所示,这个关卡页面简洁得只有一个搜索功能

在输入框中输入任意字符数据<"asd123?'
进行搜索,发现返回的URL中query的值与输入内容一致

故判断该网页可能未做任何过滤,于是构造可以弹出弹框的JavaScript语句

<script>alert(1)</script>

该语句与URL进行拼接,得出如下URL:

http://www.xssgame.com/f/m4KKGHi2rVUN/?query=<script>alert(1)</script>

访问,成功弹出弹框

所以该关卡XSS漏洞形成的原因是未对用户可控参数进行任何过滤。

2.参数过滤限制不严格,可通过符号进行隔断绕过

以下例子为XSS Game关卡3

这个关卡页面中有三个按钮,对应三张不同的图片,与图片同步的还有URL后面的数据

在URL中输入上文构造的XSS测试语句,发现script语句被写入到img语句中,没有被执行

查看源码:

var html = "Cat " + parseInt(name) + "<br>";
html += "<img src='/static/img/cat" + name + ".jpg' />";
document.getElementById('tabContent').innerHTML = html;

输入的数据与<img>
语句进行拼接,通过innerHTML语句写入到<div>
中,而innerHTML方法直接写入的<script>
语句不会被执行。故尝试使用符号进行语句截断,最后发现使用单引号可截断,于是构造拼接语句,得到如下URL:

http://www.xssgame.com/f/u0hrDTsXmyVJ/#1' onerror='alert(1)'

访问构造的URL,成功弹出弹框

单引号从1后面截断,src指向cat1文件,cat1文件不存在,加载错误,执行onerror事件里的alert()方法。所以该关卡虽然有做一些过滤与限制,但是过滤限制不严格,可通过截断绕过方式去进行XSS攻击。

3.跳转URL未做过滤限制

以下例子为XSS Game关卡4该页面依旧只有输入框与跳转键

通过查看源码得知输入框可忽略,只剩下"Next”键可利用

点击"Next"会跳转到下一个页面

查看代码获取到一个关键信息,以下代码中的welcome
类似于传入的参数,经传入其他参数测试,window.location
的值为可控参数,

<script>
    setTimeout(function(window.location = 'welcome'; }, 1000);
</script>

构造JavaScript语句并与URL进行拼接,得到如下URL:

http://www.xssgame.com/f/__58a1wgqGgI/confirm?next=javascript:alert(1)

访问,成功弹出弹框

所以该关卡是未对跳转URL进行过滤限制,导致攻击者可通过修改跳转URL进行XSS攻击。

4.对标签进行过滤不严格,可通过双写绕过过滤

以下例子为alert(1) to win JSON2

查看其源码得知参数过滤了</script
标签

function escape(s{
    s = JSON.stringify(s).replace(/<\/script/gi'');
    return '<script>console.log(' + s + ');</script>';
}

于是对</script>
标签进行嵌套双写,让其只过滤一次,得到如下结果:

</s</scriptcript>
// 中间的</script被过滤,只剩下前面的</s与cript>,前后进行拼接后,就得到了完整的</script>标签

所以对标签做黑名单过滤限制不严格时,攻击者可通过双写或大小写进行绕过,从而进行XSS攻击。

5.对符号转义不严格

以下例子为alert(1) to win Template

查看源码,可控参数s中的<>&"
被转义为HTML实体编码,其余的值通过innerHTML被拼接到<a>
标签中

由于以上符号被转义,但有一些符号未被转义,如\
,可使用其他类型的转义字符来代替被转义的字符。因为\
没有被转义,所以可使用\x3C
\x3E
代替<>
,然后对语句进行拼接,得到如下结果:

对符号转义过滤不严格,可能会导致攻击者使用其他未限制的符号进行转义,形成XSS攻击。


四、XSS漏洞危害

XSS漏洞危害包含但不仅限于以下几种危害:

1.会话劫持,窃取用户或管理员的账号信息或Cookie,冒充用户或管理员进行登录系统或后台,进行一些恶意操作,对网站安全产生极大的威胁;

2.网站挂马,利用XSS漏洞进行传播,攻击者将恶意代码嵌入到Web程序中,当用户浏览挂马网页时,用户的计算机就会被植入木马;

3.利用XSS漏洞可网站重定向;

4.利用XSS漏洞构造URL脚本实现钓鱼攻击;

5.发送广告或垃圾信息,影响用户正常使用。


五、XSS漏洞防范

XSS的危害主要是取决于JavaScript能够实现的功能,XSS跨站脚本的形成原因是对输入输出没有严格过滤,导致在页面上可以执行JavaScript等客户端代码。以下列举一些XSS漏洞的防范方法:

1.反射型XSS和存储型XSS可以在服务器端对用户输入输出的内容过滤和编码操作,将关键字进行过滤处理,关键符号进行编码转义处理;

2.DOM型XSS如有在服务器端进行交互,也可参考上述的方法进行修复,如未和服务器端进行交互,可在客户端使用JavaScript等客户端脚本语言进行编码和过滤处理。

3.采用严格的CSP作一个辅助措施,可以降低XSS带来的风险与后果;

4.设置HTTP-only Cookie,禁止JavaScript读取某些敏感 Cookie,对Cookie劫持做限制,攻击者完成 XSS 注入后也无法窃取此 Cookie。


参考

Web安全头号大敌 XSS漏洞解决最佳实践

如何防止XSS攻击?

浅谈XSS漏洞攻击与防御

XSS Game通关经验

XSS练习平台【a/lert(1) to win】


文章转载自小9运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论