0 ×00 引言 很多不了解html、js编码的童鞋遇到xss时,都是一顿乱插,姿势对了,就能获得快感,姿势不对,就么反应。另外在freebuf里,有很多文章介绍过跨站编码,有兴趣的,可以搜索下。 本文介绍常见的编码方法,能力不足,如有其他意见,请指正。 0 ×01 常用编码 URL编码:一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F(一般大写,但不强求) HTML实体编码: 命名实体:以&开头,分号结尾的,例如“<”的编码是“<” 字符编码:十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;”,例如“<”可以编码为“<”和“<” JS 编码:js提供了四种字符编码的策略, 1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“\145” 2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\x65” 3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\u0065” 4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r) <td onclick=”openUrl(add.do?userName=’<%=value%>’);”>11</td> value的内容首先出现在一个URL中,这个URL在一段javascript总,而javascript代码又是html的一部分。所以解码的顺序就是HTML解码–>js解码–>url解码,那么正确的编码顺序就应该是url编码–>js编码–>html编码。 <img src="https://www.example.com"> <img src="ht&# x74;p://www.example.com"> 而下面的两个例子,实际上却没法真的加载图片,因为这种编码干扰了标签本身的结构。 <img src&# x3d;"http://www.example.com"> <img s&# x72;c="http://www.example.com"> 下面了解下 浏览器解析HTML的步骤:浏览器收到从服务器发送来的HTML内容,会从头解析,当遇到<script></script>时,会调用javascript脚本解析器解析javascript,并执行脚本,然后继续解析其他的HTML内容,对于一些需要触发才能执行的事件,当触发事件发送时,脚本解析器才会解析其中的脚本,在事件触发之前,它是HTML的一部分。 <?php function htmlencode($str){ if(empty($str)) return; if($str == "") return; $str = str_ireplace("<","",$str); $str = str_ireplace(">","",$str); $str = str_ireplace("script","",$str); $str = str_ireplace("img","",$str); $str = str_ireplace(":","",$str); $str = str_ireplace("javascript","",$str); return $str; } if(!array_key_exists ("name",$_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true; } else { $html .= '<pre>'; $html .= '<a onclick=" ' .htmlencode($_GET['name']).'">click this url</a>'; $html .= '</pre>'; } ?> <html> <script> </script> </html> 可以看到,过滤了尖角号,script等标签,当输入javascript:alert(/xss/)时, 系统返回的为: <?php if(!array_key_exists ("name",$_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true; } else { $value = $_GET['name']; $html .= '<pre>'; $html .= "Your Name is : <div id='a'></div> <script> document.getElementById('a').innerHTML= "."'".htmlspecialchars($value)."'"."; </script> "; $html .= '</pre>'; } ?> 可以看到,$value使用了htmlspecialchars进行了编码,htmlspecialchars会对&、’、”、<、>进行html编码,当输入<img src=1 onerror=alert(/xss/)>时,系统不会弹框,因为特殊符号被html编码了。 我们现在分析下$value的环境,$value先在javascript中,然后在html环境中(通过innerHTML操作html),所以浏览器解码顺序为js解码–>html解码,所以我们可以对$value进行js编码,绕过htmlspecialchars限制,因为$value在html解码时,已经是正常的html代码了。 |
-
上一篇: DedeCMS-V5.7-UTF8-SP1 变反射为持久xss - 网站安全 - 自
下一篇: JS投毒的另一种尝试 - 网站安全 - 自学php
还没有人抢沙发呢~