在将JSON字符串解释为浏览器中的JavaScript对象时,是否有可能存在XSS?

时间:2017-04-16 15:13:11

标签: json xss

我在C#中生成Chart.js JavaScript代码,并想知道XSS的潜力。

我将以下JS代码转储为更大的HTML字符串的一部分:

var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"bar","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);

是否可以在执行c之前更改var myChart = new Chart(ctx, c)的内容?

或者,是否可以强制该行使用更改的c变量重新评估?在我看来,如果你可以重新分配它,至少在理论上可以向JSON添加一个IIFE。

我的用例是:

  1. 用户连接到VPN
  2. 域名中的用户类型,返回单个HTML页面
  3. HTML页面包含用于向VPN C#服务器上的服务器发出请求的JavaScript
  4. 所以我在这个特定域的C#服务器上启用了CORS。

    我不认为在没有使用用户输入的eval函数的情况下存在XSS的可能性,但只是想确定。这对我来说是个新领域。

1 个答案:

答案 0 :(得分:1)

当您在页面上执行用户提供的(或攻击者提供的)代码时,就会发生XSS。

如果你没有正确转义的eval()用户输入,以及像你这样的代码,如果JSON包含未正确转义的用户输入,那么肯定会发生。它看起来像这样:

var ctx = document.getElementById('myChart').getContext('2d');
var c = JSON.parse('{"type":"ba"}');alert('oh, look, I\'m a nasty script!');//r","data":{"labels":[...]],"datasets":[{},{}, etc]},"options":{"scales":{"yAxes":[{},{}]}}');
var myChart = new Chart(ctx, c);

在此示例中,为“type”提供的值为:ba"}');alert('oh, look, I\'m a nasty script!');//r。因为它在写入JSON字符串时没有进行转义,所以特殊构造的值可以结束字符串并执行自己的JavaScript。

这与JSON解析无关。在将其写入页面时,您必须确保正确转义任何用户提供的数据。