在编辑旧的博文时,发现新版编辑器插入特定HTML代码不能正确显示。比如“<script type="text/javascript" src="test.js"></script>”或者“<link rel="stylesheet" type="text/css" href="test.css">”。发布后它们的最终页面显示效果如下图所示:
初步判断是由于编辑器内部对某些字符进行转义引起的问题,于是重新进入编辑器的源代码模式查看,发现源代码中已经将"<",">"之类的符号转义成"<"和">",而其他字符并没有做任何处理,因此可以进一步判断是在页面载入时才对字符进行过滤,并且根据显示的结果,可以猜测是"src"和"href"。于是再次进入源代码模式,将"src"中的"s"替换为"s",将"href"中的"h"替换为"h",修改完成后直接保存发布,效果如下:
至此页面已经完全可以正常显示,证实的确是由于前端过滤引起的HTML显示异常。即然系统可以通过此种方式绕过过滤,那么是否也存在相应的XSS漏洞。为此进行了进一步试验,在正文中写入"<script>alert(1);</script>",并将"<"、">"等字符全部替换成ASCII码,保存发布,效果如下:
此次试验并没有达到预期效果,哪怕将"<"或">"全部转义,源代码中依然是"<"和">",而页面中插入的<img>标签却可以正常显示,因此猜测<img>标签可以被利用。据此再次试验,写入<img>标签并设置src属性的值为"javascript:alert(1);",接着进入源代码模式,将其中的"s"替换为"s",保存发布,效果如下:
试验结果比较出乎意料,并没有弹出框生成,且在页面上直接查看HTML源代码显示的是"src=\'#\'"。但是同样的格式"src=http://......" 却不会被系统过滤,因而怀疑只有当src属性值中以"j"开头时才会处理,于是重复上一步试验,只不过改为将"j"替换成"j",保存发布,效果如下:
注:src执行javascript在低版本IE下(如IE6)有效,高版本浏览器无法复现。