Browser Security-超文本标记语言(HTML)上.ppt
《Browser Security-超文本标记语言(HTML)上.ppt》由会员分享,可在线阅读,更多相关《Browser Security-超文本标记语言(HTML)上.ppt(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Browser Security-超文本标记超文本标记语言(语言(HTML)重要的重要的4个规则:个规则:1&符号不应该出现在HTML的大部分节点中。2 尖括号是不应该出现在标签内的,除非为引号引用。3 在text节点里面,左尖括号有很大的危害。4 引号在标签内可能有危害,具体危害取决于存在的位置,但是在text节点是没有危害的。文件解析模式文件解析模式 在任何HTML文档中,最开始的用来指示浏览器需要解析的方式,同样也可使用Content-Type头来告诉浏览器。一般情况下,浏览器中的解析器会尝试恢复大多数类型的语法错误,包括开始和结束标记。在XML中,是非常严格的,所有标签必须有对应的开始
2、关闭,也可以有自动关闭如也是允许的。了解了解HTML解析解析 在IE浏览器中允许在1中插入NUL字符(0 x00),可以绕过非常多的xss过滤器。如下php代码可把NUL字符插入标签内做测试:2和4中的空格也可以由tab(0 x0B)与换页键(0 x0C),2处也可以用/来代替。5中的在IE中也可替换成。IE当中还有一个特性是当遇到=后面紧跟一个引号的时候会有奇怪的解析。Yes,we are still inside a tag!img src=Entity编码编码 HTML解析器在建立文档树的时候会针对节点内的Entity编码解码后传输。以下两个表示相同:下面两个例子代码不会执行,因为,编码
3、的是标签本身的结构而非节点内的内容:Fuzzing 对一个普通的HTML进行Fuzzing测试:Click me看一下可以Fuzzing的位置可以使用php代码进行快速测试,例如我们对第一个位置(的右边)进行Fuzzing:?php for($i=0;$i=255;$i+)$character=chr($i);#右边进行测试 echo.$i.;?上面的代码只测试了256个字符,如果想要测试Unicode的所有字符,则需要创建65536个链接。php默认字符是ISO-8859-1作为默认的字符编码,而这种编码只有256个字符,所以单纯的循环65536遍是没用的。所以采用Entity编码方式循环,
4、解码后输出:?php for($i=0;$i=65535;$i+)$character=html_entity_decode(.$i.;,ENT_QUOTES,UTF-8)#右边进行测试 echo.$i.;?有一个有趣的现象是几乎所有浏览器对$#33;即!,浏览器会!当成注释的开始,然后自动补齐剩下的代码,浏览器解析后的代码:33 针对标签名的针对标签名的Fuzzing click me上面的代码,在Chrom、Firefox和Safari中点击,可以顺利弹出1。讨论一下空字符的问题,IE浏览器会自动忽略空字符,并解析剩下的代码,这样会绕过很多采用正则匹配黑名单字符串的过滤器。并且,很多函
5、数和库并没有意识到这个问题:?php echo;?用IE8打开上述代码的网页,查看源代码只能看到im后面的字符都隐藏了。还有两种方式可以对标签名Fuzzing,第一种是涉及字符集的问题,第二种是针对php中在过滤之前使用了utf8_decode()函数。?php header(Content-Type:text/html;charset=Shift_JIS);for($i=1;$i=255;$i+)$character=html_entity_decode(.$i.;,ENT_QUOTES,UTF-8);$character=utf8_decode($character);echo$cha
6、racter.123456.$i.rn;?代码很简单,设置返回响应字符集为Shift_JIS,然后把utf-8转换为Shift_JIS字符集。可以看到在IE中129-159和224-252中,123456中的1消失了,与前面的字符合并成一个字符了。标签后面也可加入/符号做间隔:尝试在标签与/之间再插入其他字符来测试,由于空字符无法直观显示,所以用0来表示null,同样主流浏览器都可以执行:再尝试ASCII码之外的字符,这种字符在正则表达式中w是无法匹配到的,主流浏览器都可以执行:测试发现,标签名与属性名直接只要是以/开头以/或结尾,中间几乎可以插入任意字符。在Fuzzing属性方面,考虑两方面
7、,一个是可以使用什么分隔符,一个是属性值可以采用什么编码。分隔符有很多种,单引号,双引号,无任何引号,反撇号(IE中)。?php for($i=1;$i=255;$i+)$character=chr($i);echo.$i.;?上面代码可以直观的看出当前浏览器支持的分隔符有哪些字符。上面代码可以直观的看出当前浏览器支持的分隔符有哪些字符。上面代码上面代码size属性如果输入的是字符的话,会顺利执行,所以当属性如果输入的是字符的话,会顺利执行,所以当$character中循环到数字的时中循环到数字的时候也会顺利解析,但这并非是把数字当成了分割符:候也会顺利解析,但这并非是把数字当成了分割符:?p
8、hp for($i=20;$i=255;$i+)$character=html_entity_decode(.$i.;,ENT_QUOTES,UTF-8);echo;?以上代码可以看出,属性为字符串的时候,可以作为分隔符的字符。为了表示那些不可打印的字符,就用x十六进制来表示:以上代码x17即表示不可打印字符chr(23),浏览器提交的时候可以输入%3Cimg%20src%3D%17%17%20onerror%3Dalert%281%29%2f%2f%3E。在src中可以正常工作的分隔字符,在处理事件的属性里不一定会工作,例如onerror。但是仍然有一些字符可以达到我们的目的,ASCII
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Browser Security-超文本标记语言HTML上 Security 超文本 标记 语言 HTML
限制150内