Skip to main content

03.不安全的过滤导致 XSS

如果不安全地过滤输入,特别是对<script>标签的不安全过滤,可能导致 XSS(跨站脚本攻击)漏洞。XSS 攻击是一种利用网页应用程序未正确过滤或转义用户输入的情况下,将恶意脚本注入到网页中并在用户浏览器上执行的攻击。

示例代码:#

func(writer http.ResponseWriter, request *http.Request) {    var name = request.URL.Query().Get("name")    scriptRegex := regexp.MustCompile("(?i)<script>")    name = scriptRegex.ReplaceAllString(name, "")    scriptEndRegex := regexp.MustCompile("(?i)</script>")    name = scriptEndRegex.ReplaceAllString(name, "")    writer.Write([]byte(fmt.Sprintf(`<html>Hello %v</html>`, name)))

攻击示例:#

可以通过双写<script>标签的方式来绕过,这样当<script>标签被过滤掉,剩下的组合起来刚好形成一个完整的 payload。

http://127.0.0.1:8787/xss/replace/nocase?name=<scr<script>ipt>alert("hello yakit")</scr</script>ipt>#过滤后变成<script>alert("Hello Yakit")</script>

利用 iframe 标签

http://127.0.0.1:8787/xss/replace/nocase?name=<iframe src="javascript:alert('Hello Yakit')">

防御措施:#

要防止此类 XSS 攻击,不应仅仅对<script>标签和</script>标签进行过滤。正确的做法是对用户输入进行全面的输入验证和输出编码。具体措施如下:

  • 输入验证: 对用户输入进行验证,只接受符合特定格式和类型的数据。拒绝包含特殊字符或 HTML 标签的输入。
  • 输出编码: 在将用户输入显示在网页上之前,进行适当的输出编码,将特殊字符转换为对应的 HTML 实体,以防止恶意脚本的执行。可以使用合适的编码函数,如在 Python 中使用html.escape
  • CSP: 使用内容安全策略(CSP)来限制网页中加载的资源,只允许从指定源加载内容,有助于减少 XSS 攻击的成功率。

靶场演示: 视频#