场景:页面上有一个具有用户名信息的持久XSS。用户名在页面中显示了三次,只能显示一次,可见的则正确转义。
鲍勃“>& nbsp;& nbsp;...有效载荷
发布于 2013-08-01 12:42:34
来回答你的三个问题:
修复正确的转义输出:
将XSS修补程序设置为DOM,以便从特定的标记中删除注入的JavaScript。例如,您可以在注入的XSS前面加上一个字符,例如管道(即|
),以帮助区分实名:
var nameHtml = document.getElementById('username').innerHTML;
var parts = nameHtml.split("\">|", 2);
document.getElementById('username').innerHTML = parts[0];
所以,如果您的XSS看起来像这样:
">|<script>alert(1);</script>
上面的代码将删除">|
之后的所有内容,并将其包括在内。
如果你不能在那个页面上执行代码,你还能做些什么吗?
如果您仍然可以将HTML注入页面,但由于内容安全策略或类似的原因无法获得XSS,则可以使用display: none !important;
将用户名元素完全隐藏起来,从而覆盖所有内容。如果它是一个存储的XSS,并且您可以CSRF提交,那么这将节省您的麻烦也。
如何防止您的有效负载执行不止一次?
有许多方法可以做到这一点,包括:
发布于 2013-08-01 02:35:11
您可以使用XSS更改可见的用户名,使其看起来是良性的。例如,注入的脚本可以执行如下操作:
document.getElementById("displayedUsername").innerHTML = "john";
要回答问题的第二部分,可以使用全局变量确保代码只运行一次。代码应该如下所示:
var alreadyExecuted;
if (alreadyExecuted !== true) {
alreadyExecuted = true;
// your code here
}
https://security.stackexchange.com/questions/39889
复制相似问题