阅读:2475回复:0
Browser Security-超文本标记语言(HTML)
重要的4个规则:
1 &符号不应该出现在HTML的大部分节点中。2 尖括号是不应该出现在标签内的,除非为引号引用。3 在text节点里面,[img]http://php.upupw.netcommentimg src=x onerror=alert(1)//[/img]Entity编码 HTML解析器在建立文档树的时候会针对节点内的Entity编码解码后传输。 以下两个表示相同: 下面两个例子代码不会执行,因为,编码的是标签本身的结构而非节点内的内容: 尝试在标签与/之间再插入其他字符来测试,由于空字符无法直观显示,所以用来表示null,同样主流浏览器都可以执行: 再尝试ASCII码之外的字符,这种字符在正则表达式中w是无法匹配到的,主流浏览器都可以执行: 测试发现,标签名与属性名直接只要是以/开头以/或"结尾,中间几乎可以插入任意字符。 在Fuzzing属性方面,考虑两方面,一个是可以使用什么分隔符,一个是属性值可以采用什么编码。 分隔符有很多种,单引号,双引号,无任何引号,反撇号(IE中)。 上面代码可以直观的看出当前浏览器支持的分隔符有哪些字符。 上面代码size属性如果输入的是字符的话,会顺利执行,所以当$character中循环到数字的时候也会顺利解析,但这并非是把数字当成了分割符: 以上代码可以看出,属性为字符串的时候,可以作为分隔符的字符。 为了表示那些不可打印的字符,就用x十六进制来表示: 以上代码x17即表示不可打印字符chr(23),浏览器提交的时候可以输入%3Cimg%20src%3D%17%17%20onerror%3Dalert%281%29%2f%2f%3E。 在src中可以正常工作的分隔字符,在处理事件的属性里不一定会工作,例如onerror。 但是仍然有一些字符可以达到我们的目的,ASCII表中的133和160已经IE中的空字符,甚至是分号。 以上代码urldecode之后在chrome中可以顺利执行。 下面讨论多个标签的问题,比如用户可控的数据插入到了标签中,同时过滤了只能插入标签内数据: |
|