2016-12-05 156 views
6

我一直在经历这么多的论坛&维基百科的几天以来,试图了解XSS攻击alomost我花了2-3天,但仍然没有得到更好的主意,因为建议多专家解答&我想知道黑客如何在受害者浏览器上注入恶意代码?并且我的应用程序已经用于运行某些App Scanner标准测试工具,因此它捕获了很多XSS问题。我想在这里放一个我的应用程序的XSS问题,这样可以请一些人帮我理解我为这个问题究竟做了什么。尽管如此,为了更好地理解XSS问题,我一直在努力。这是我的代码片段跨站脚本问题与window.location.search

function getParameter(param) { 
 
     var val = ""; 
 
     var qs = window.location.search; 
 
     var start = qs.indexOf(param); 
 
     if (start != -1) { 
 
       start += param.length + 1; 
 
       var end = qs.indexOf("&", start); 
 
       if (end == -1) { 
 
         end = qs.length 
 
       } 
 
       val = qs.substring(start,end); 
 
     } 
 
     return val; 
 
} 
 

 
var formName = getParameter("formName"); 
 
var myValue = '<a href="javascript:parent.opener.assignDateIps(new Date(\''+year+'\',\''+month+'\',\''+thisDay+'\'), \''+contextstr+'\', \''+formName+'\');window.close()" class="modulelink">'+thisDay+'</a></td>'; 
 
document.getElementById('calendarA').innerHTML = myValue;

而且这些陈述

var qs = window.location.search; 
val = qs.substring(start,end); 
var formName = getParameter("formName"); 
var myValue = '<a href="javascript:parent.opener.assignDateIps(new Date(\''+year+'\',\''+month+'\',\''+thisDay+'\'), \''+contextstr+'\', \''+formName+'\');window.close()" class="modulelink">'+thisDay+'</a></td>'; 
document.getElementById('calendarA').innerHTML = myValue; 

通过应用扫描测试工具为XSS(跨站脚本)问题可能的代码毫无遗漏的,但我不能确定它是如何导致XSS &我现在可以如何解决这个问题。任何人都可以提供有关如何修复此漏洞的见解吗?

+1

你如何使用formName变量? – Qwertiy

+0

嗨Qwertiy,我刚刚加入这个应用程序刚刚加入了几天,直接从事XSS问题。作为开发人员,我可以说它是queryString参数名称并将此参数传递给getParameter()函数,并尝试使用window.location.search获取该参数的值。 – Venki

+0

你如何使用提取值的afrer? – Qwertiy

回答

2
var myValue = '<a href="javascript:parent.opener.assignDateIps(new Date(\''+year+'\',\''+month+'\',\''+thisDay+'\'), \''+contextstr+'\', \''+formName+'\');window.close()" class="modulelink">'+thisDay+'</a></td>'; 

此行没有任何转义,预计'(... \''+formName+'\');...'是一个字符串。但它可以成为其他一些事情:

formName = "'); alert('I\'m free to do anything here'); (''+" 
document.getElementById('calendarA').innerHTML = myValue; 

让我们的地方这样的片段插入myValue

... <img src=void onerror="alert('hacked')" /> ... 

您可以检查它的工作原理:

document.querySelector('button').addEventListener('click', function() { 
 
    document.querySelector('output').innerHTML = document.querySelector('textarea').value; 
 
})
<textarea>... <img src=void onerror="alert('hacked')" /> ...</textarea> 
 
<button>Go</button> 
 
<output></output>

您绝对不应该信任任何通过url字符串传递的数据。任何网站都可以放置任何链接到您的网站。某些用户点击它,进入您的网站,参数在您的网站上执行,攻击者可以做任何他想做的事情。

+0

感谢你提到这个陈述'var myValue =''+thisDay+'';'没有任何转义它意味着我可以做这个我已经在我的应用程序中导入了ESAPI库,但我是不知道如何使用它。任何示例代码在这个如何我可以逃避这个代码。 – Venki

+0

请帮助我Qwertiy的一个实例,然后我会根据我的下一个问题进行分析。 – Venki

+0

@Venki,没有足够的内容帮助 – Qwertiy

0

您向我们展示的代码中没有任何内容易受攻击。

您正在阅读用户输入内容,因此可能会在此处引入漏洞。那是可能是你正在使用的工具正在检测。

如果您的代码易受攻击,那么这将是因为您在接下来的代码formName(在您未向我们显示的代码中)做的任何事情。

+0

嗨昆汀,你的猜测是对的。在此var myValue =''+thisDay+''中使用了此“formName”值; – Venki

+0

对此有任何帮助吗?我现在已经修改了我的问题 – Venki

0

这是一个可能的基于DOM的XSS问题。

如果您正在使用的formNamedocument.getElementById("demo").innerHTML=formName或以某种方式的价值正在创建您的DOM元素/使用修改的formName你是脆弱的, 我可以像http://urwebsite.html?formName=<script>document.cookie_will_be_transfered_to_my_server_here</script>创建自定义网址,并要求亲自登录点击它(简单的社会工程)。现在我有那个人的会话ID,使用它我可以做我想做的事情。

作为分辨率,来自用户的所有输入数据都必须进行html编码。

+0

嗨Vinod,看起来你回答了我的问题,但是在这里我有一个共同点,即什么是document.getElementById(“demo”)的最终代表。网页上的innerHTML是什么? – Venki

+0

不是'