Yakit靶场通关教程|XSS篇总结
注:本文是从Yakit官方公众号文章中总结归纳,只保存漏洞修复建议以供后续学习参考。
原文链接:
https://mp.weixin.qq.com/s/INfxJqps570h5kFsPp-Kfg
直接拼接导致XSS注入
http://127.0.0.1:8787/xss/echo?name=admin
/*拼接后*/
<div>Hello admin</div>
修复建议:
输入验证:对用户输入进行验证,只接受符合特定格式的数据。例如,如果需要一个整数,确保输入是整数类型,而不是字符串或其他类型的数据。
输出编码:在将用户输入输出到网页上之前,对其进行适当的编码,以确保所有特殊字符都被转义。这样可以防止恶意脚本的执行。
使用HTTP Only标志:对于cookie中的敏感信息,使用HttpOnly
标志,确保它们不会被JavaScript访问,从而减少XSS攻击的可能性。
内容安全策略(CSP):使用CSP头来限制网页中加载的资源,只允许从指定源加载内容,这有助于减少XSS攻击的成功率。
使用安全框架:使用安全框架和库来处理用户输入和输出,这些框架通常会自动处理XSS防护。
不安全的过滤导致XSS
修复建议:
输入验证:对用户输入进行验证,只接受符合特定格式和类型的数据。拒绝包含特殊字符或HTML标签的输入。
输出编码:在将用户输入显示在网页上之前,进行适当的输出编码,将特殊字符转换为对应的HTML实体,以防止恶意脚本的执行。可以使用合适的编码函数,如在Python中使用html.escape。
CSP:使用内容安全策略(CSP)来限制网页中加载的资源,只允许从指定源加载内容,有助于减少XSS攻击的成功率。
XSS: 存在于 JS 代码中(字符串中)
<div>
Here are photo for U! <br>
<script>console.info("Hello" + '')</script>
</div>
修复建议:
输入验证:对用户输入进行验证,只接受符合特定格式和类型的数据。拒绝包含特殊字符或HTML标签的输入。
输出编码:在将用户输入显示在网页上之前,进行适当的输出编码,将特殊字符转换为对应的HTML实体,以防止恶意脚本的执行。
XSS: 存在于 JS 代码中(字符串中 2)
<div>
Here are photo for U! <br>
<script>
const name = "";
console.info("Hello" + `${name}`);
</script>
</div>
修复建议:
输入验证:对用户输入进行验证,只接受符合特定格式和类型的数据。拒绝包含特殊字符或HTML标签的输入。
输出编码:在将用户输入显示在网页上之前,进行适当的输出编码,将特殊字符转换为对应的HTML实体,以防止恶意脚本的执行。
XSS: 存在于 JS 代码中(字符串模版中)
<div>
Here are photo for U! <br>
<script>const name = "Admin";
console.info("Hello" + `+"`{{ .name }}: ${name}`"+`);
</script>
</div>
修复建议:
禁止直接插入用户输入:不要将用户输入直接插入到JavaScript代码中,尤其是字符串模版中。
安全编码实践:采用安全编码实践,避免将用户输入和动态内容插入到不受信任的上下文中。
输出存在于HTML节点on...属性中
<div>
Hello Visitor!
<br>
Here are photo for U! <br>
<img style='width: 100px' src="/static/logo.png" onclick='{{ .code }}'/>
</div>
修复建议:
输入验证和过滤:在处理用户输入时,对输入进行严格验证和过滤,只允许预期的内容通过。可以使用白名单验证,只允许特定类型的输入通过,例如只允许数字或特定字符。
输出编码:在将用户输入输出到HTML页面时,对其进行HTML编码,以防止其中的HTML和JavaScript代码被解释执行。可以使用安全的输出方法,如使用textContent而不是innerHTML。
移除不必要的事件处理程序:避免在HTML节点的onclick属性中直接插入用户输入。相反,尽量避免使用内联事件处理程序,可以在外部的JavaScript脚本中添加事件监听器。
使用模板引擎:如果你必须在HTML属性中包含动态内容,建议使用模板引擎,它们通常会自动对输出进行适当的编码,以防止XSS攻击。
输出存在于HTML节点属性中
但是不再on属性中(IMG ALT)
本案例演示了一种XSS攻击方式,通过将恶意代码注入到HTML节点属性中(如IMG标签的ALT属性),但不在on属性中,从而绕过一些安全机制。
{
DefaultQuery: "value=visitor-name",
Path: "/attr/alt",
Title: "输出存在于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,
}
修复建议:
要防范这种类型的漏洞,开发者需要对从用户输入获取的数据进行适当的转义和过滤,确保用户提供的内容不会被解释为HTML或JavaScript代码。这可以通过使用安全的HTML编码函数来实现。