繁体   English   中英

Golang struct unmarshal xss

[英]Golang struct unmarshal xss

我有一个注入了XSS的结构。 为了将其删除,我将其json.marshal,然后运行json.HTMLEscape。 然后我将json解组为新的结构。

问题是新结构仍注入了XSS。

我根本无法弄清楚如何从结构中删除XSS。 我可以在该字段上编写一个函数来执行此操作,但考虑到存在json.HTMLEscape,我们可以将其反编组,它应该可以正常工作,但不能正常工作。

type Person struct {
    Name string `json:"name"`
}
func main() {
    var p, p2 Person
     // p.Name has XSS
    p.Name = "<script>alert(1)</script>"
    var tBytes bytes.Buffer

    // I marshal it so I can use json.HTMLEscape
    marshalledJson, _ := json.Marshal(p)
    json.HTMLEscape(&tBytes, marshalledJson)

    // here I insert it into a new struct, sadly the p2 struct has the XSS still 
    err := json.Unmarshal(tBytes.Bytes(), &p2)
    if err != nil {
        fmt.Printf(err.Error())
    }
    fmt.Print(p2)

} 

预期结果是p2。要清理的名称类似于&lt;script&gt;alert(1)&lt;/script&gt;

首先, json.HTMLEscape不能满足您的要求:

HTMLEscape在字符串文字中将<,>,&,U + 2028和U + 2029字符附加到dst的JSON编码的src更改为\\ u003c,\\ u003e,\\ u0026,\\ u2028,\\ u2029,以便JSON安全嵌入HTML <script>标记中。

但您想要的是:

p2。要清理的名称,例如&lt;script&gt;alert(1)&lt;/script&gt;

您可以通过调用html.EscapeString来获取,但不能通过任何json编码器例程获取。 1个

其次,如果您检查json.Marshal的结果,您会发现它已经用< \<替换了< \< ,依此类推-它已经完成了json.HTMLEscape ,所以json.HTMLEscape没有任何字符可替换! 有关示例,请参见https://play.golang.org/p/Zergs3bwElY

正如艾哈迈德·哈瑟姆(Ahmed Hashem)指出的那样,如果您确实想做这种事情,则可以使用反射来查找字符串字段(如Golang中的Implements XSS protection一样 ),但是通常在输入时这样做比较明智。 请注意,那里的答案不会递归到可能包含字符串的内部对象中。


1 JSON不是HTML,也不是XML等。请在您的脑袋和代码中将它们分开。

另请参阅https://medium.com/@oazzat19/what-is-the-difference-between-html-vs-xml-vs-json-254864972bbb ,据我所知,我们如何到达此处的简短摘要没有错误,这对于随机的Web文章来说非常不错。 :-)使用JSON时,我们得到非常简单的类型化数据:对象,字符串,数字,列表/数组,布尔值和null; 看到https://www.w3schools.com/js/js_json_syntax.asphttps://www.w3schools.com/js/js_json_objects.asphttps://cswr.github.io/JsonSchema/spec/basic_types/例如。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM