如何在这些条件下执行 XSS?

信息安全 Web应用程序 渗透测试 xss
2021-09-10 16:40:42

我正在尝试学习渗透测试,并且我下载了一个名为“Bodgeit Store”的易受攻击的应用程序。除了执行跨站点脚本攻击之外,我已经完成了几乎所有的挑战。我查看了应用程序的源代码,发现以下 Java 代码:

if (request.getMethod().equals("POST") && comments != null)
{
    anticsrf = request.getParameter("anticsrf");
        if (anticsrf != null && anticsrf.equals(request.getSession().getAttribute("anticsrf")))
            {
                // Strip script tags, because that will make everything alright...
                comments = comments.replace("<script>", "");
                comments = comments.replace("</script>", "");
                // And double quotes, just to make sure
                comments = comments.replace("\"", "");
            .................
            }
}

挑战说:

“使用以下方式显示弹出窗口:<script>alert("XSS")</script>

但是查看源码我们发现<script>and</script>标签被空字符代替了。此外,我无法发出 GET 请求,因为代码还会验证请求是否为 POST 请求。

我已经尝试并成功地使用其他方法(例如使用外部 .js 文件等)执行警报框,但我真的很想找到如何完成这一挑战。请给我一些关于如何解决这个问题的建议。

4个回答

除了Gumbo's nice and simple answer之外,另一种可能性是使用最后一个replace()调用来绕过早期的调用,例如:

<scr"ipt>alert('XSS')</scr"ipt>

事实上,我怀疑这可能是挑战的作者所期望的解决方案:除了故意允许这种特殊攻击之外,去除双引号没有多大意义,而且“只是为了确保”的评论甚至会引起人们的注意。

当然,即使代码没有去掉双引号,你仍然可以这样做:

<scr</script>ipt>alert('XSS')</scr</script>ipt>

再次查看您的问题后,我终于看到了挑战试图让您实现的目标。请注意反 XSS 代码是如何被一条if语句包裹起来的,该语句检查anticsrf参数是否存在以及它是否等于anticsrf用户会话对象中存在的对象。通过打破这两个条件中的任何一个,您可以有效地使上面的代码 ( <script>alert("XSS")</script>) 工作。换句话说,如果您anticsrf从请求中排除参数或将请求anticsrf中的参数更改为任意参数,则该comment参数将被逐字反映,因为剥离 XSS 代码的代码块将被跳过。

其他需要考虑的事情:

<script>标签容器不是唯一可以进行 XSS 的地方看看其他 HTML 标记以及它们可以做什么。例如,以下内容适用于<img>标签:

<img src=javascript:alert('hi'); />

还有onload,onmouseover等事件处理程序与 HTML 中的一大堆标签相关联,可用于此目的。我最好的建议是查看HTML 规范以获得更多想法。如果您要成为一名网络渗透测试员,那么您肯定会想用这些知识武装自己。

自动提交表格:

<html>
    <body onload="document.forms[0].submit()">
        <form method="POST" action="...">
        ...
        </form>
    </body>
</html>

没有脚本标签的 XSS:

<img src="missing" onerror="..." />

我喜欢这里的一些其他有创意的帖子来寻找答案。

这里有一些简单而愚蠢的想法立即出现在我的脑海中:

<script >alert('XSS')</script >
<SCRIPT>alert('XSS')</SCRIPT>