我在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。
我的用例是:
所以我在这个特定域的C#服务器上启用了CORS。
我不认为在没有使用用户输入的eval
函数的情况下存在XSS的可能性,但只是想确定。这对我来说是个新领域。
答案 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解析无关。在将其写入页面时,您必须确保正确转义任何用户提供的数据。