【漏洞解析】Yakit靶场通关教程|XSS篇总结
2023-11-12 00:4:35 Author: 利刃信安攻防实验室(查看原文) 阅读量:26 收藏

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编码函数来实现。


文章来源: http://mp.weixin.qq.com/s?__biz=MzU1Mjk3MDY1OA==&mid=2247507919&idx=2&sn=0baee68f00a42b1d5dc8489d0c1079b5&chksm=fbfb6f02cc8ce614eda4c3fabd9c0aa8f8c0b03b96724e1954059e1d3cd8f2b8524735679969&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh