2012年(272)
分类: 网络与安全
2012-06-26 13:11:33
最近一直在和
suddy 折腾 XSLT 安全问题,他之前写了篇不错的blog:
今天我再补充点心得。精力有限,只能马虎的写写了。
XSLT 2.0 功能更强大,但是目前浏览器都还没有完全支持,所以暂时不涉及。
在java、php里都有实现 XSLT
Processor
在客户端浏览器里,也实现了 XSLT
Processor,通过js可以进行调用.
transform 的过程,等于把xml数据组装在xsl样式文件里,拼出来一个html,最后展示在浏览器上。有兴趣了解更详细内容的可以参考W3C里关于XHTML和XSLT的规范。
在客户端,可以参考如下JS:
点击(此处)折叠或打开
这个过程中,如果是输出在HTML里,transform 本身不会产生什么问题,即便是transform了一些特殊符号,比如 在拼装后的html里是执行不了的。
如下firebug里所见:
但是,如果该值的输出是在 script 元素中或者是在某个元素事件内,则可能导致执行脚本。 点击(此处)折叠或打开 那么onclick事件就会执行alert(1)
比如,xsl文件中是这么写的:My CD Collection
Title Artist
同样的,修改适当的xml数据后,在script标签中输出的数据也会得到执行。
如何解决这个问题,请参考我前几篇blog。
此外,一些安全问题都是出在 xsl 文件中。
首先,XSL 文件可能会造成 XSS
如果允许用户直接上传XSL文件,则用户可能直接写脚本执行。
XSL
中支持 script扩展,即script标签。
某些XSLT Processor 中还支持调用本地文件,主要是通过 document() 或者 类似 doc() 的函数加载一个本地文件进来,如果控制的不好,就可能造成类似加载 ../../../../../../../../../etc/passwd 这类问题。
此外,在XSLT中有时候还能执行某些服务端的函数,比如在PHP中:(这是 PHP 的 XSLT Processor 特有的)
IE曾经宣称他们是安全的,因为在 MSXML 中很早就开始禁用 script 扩展,也就是说在XSL里的
......
是不被IE解析的,如果要使用,需要额外配置选项。
同时,MSXML里也是禁用document函数的。
这些选项确实增加了IE的安全性,不过我测试发现,对于事件中的输出,IE并没有处理
也就是说在XML中使用类似
的语句,还是会导致XSS的执行。
参考资料:
http://www.tkachenko.com/blog/archives/000726.html
http://www.acunetix.com/blog/web-security-articles/the-hidden-dangers-of-xsltprocessor-remote-xsl-injection/