如何构建使用 XSS 的黑客挑战?

信息安全 xss ctf 会议
2021-09-04 05:16:49

安全会议经常遇到黑客挑战。我和我的同事已经建立了一些这样的。我们还没有完成一个包含跨站点脚本漏洞的项目。

我已经看到了这样做的挑战。一种方法是浏览器定期(我认为每 10 秒)请求某个页面(易受存储的 XSS 攻击)。成功攻击后,您的有效载荷在该浏览器中运行,挑战是提取 cookie。

这种方法的一个问题是,当多人同时处理挑战时,他们会互相干扰——你可以窃取其他人的想法。另一种想法是只使用反射型 XSS,以及一个页面,您可以在其中提交指向该站点的链接,管理员将在它上线之前对其进行审查。

浏览器保持打开多长时间是一个有趣的选择。如果它保持开放一段时间(60 秒左右),那么人们可以使用 BeEF 之类的工具,这样会更容易一些。如果它只开放 2 秒,则必须编写攻击脚本。

有许多细节会影响挑战在实践中的效果。我更喜欢那些有运行 XSS 黑客挑战经验的人的答案,这些挑战运行良好。但如果做不到这一点,我会接受有根据的猜测。

如果有帮助,我们倾向于参加英国的技术会议,例如 B-Sides Manchester、SteelCon、SecuriTay。

此外,欢迎任何有关保护浏览器免受 JavaScript 攻击的提示!

4个回答

我见过的最常见的方法是运行一个无头浏览器机器人,它通过提交系统获取易受攻击的链接。然后,它会使用一组神奇的 cookie 访问这些链接中的每一个几秒钟。

可以在文章“如何将支持 XSS 的机器人添加到您的 CTF ”中找到一个示例,其中该机器人被实现为无头PhantomJS实例。同样,hackxor 游戏使用HtmlUnit来模拟浏览受害者,而这个 XSS 挑战使用Zombie.js的实例。

避免存储型 XSS 确实有几个原因:玩家不仅会了解其他人的方法并最终干扰他们的有效载荷,而且人们可能会开始用重定向或无限循环来烦其他人,这会让你忙于清理一切。

相反,我建议使用一个简单的提交系统来反射 XSS 漏洞,玩家可以提供链接,然后机器人会访问这些链接。根据场景的不同,提交可以放在联系表单、简单的套接字侦听器、私人 IRC 消息的上下文中,或者,如果您喜欢的话,可以将来自传入电子邮件的链接提取和访问的电子邮件帐户放入其中。

我肯定会避免使用需要手动交互的系统。否则人们会不断询问他们的有效载荷是否已经运行,是否可以再次访问,等等。根据玩家的攻击性,您还应该考虑一种限制提交速度的方法。(联系表格的验证码很适合这种情况。)

我会推荐单独的容器环境来区分参赛者之间的冲突。

举个例子:在https://www.onehourctf.com查看 SANS 的一小时CTF——一小时 CtF 使用 Docker 和 Guacamole 来提供一个活泼的共享学习环境。Guacamole 为 Docker 容器提供可视化(VNC/RDP/SSH)界面。

对于教授跨站点脚本漏洞的简单方法,您可能需要考虑使用自定义代码对攻击进行有根据的模拟。从攻击者的角度来看,它是合法的,但后端模拟了视觉结果。

使用开发 CTF 的系统方法来缩小范围显然很棒。这可以通过包含类似攻击向量的知识库来完成。

例如,在您的 CTF(您打算关注code injections)中,与攻击相关的变体与客户端脚本开发code injection绝对相关要缩小范围,请使用被滥用的关键成分功能。在这种特殊情况下,大多数情况下都是脆弱的。因此,您的团队应该能够整理有关这方面的信息,例如JS Vuln DB可以获取您的 CVE + 它是 POC 开始的!JavaScriptJS Engines

让我们再看一个场景。假设您要制作针对“文件包含”向量的 CTF,示例可以是LFIRFISSI等。您可以使用cve-search提供的 API ,然后可能将所有 CVE 映射下来,这样更容易。

如果您要加入蓝队,想法是集中并隔离在安全环境中运行的练习。其次,我建议也许,在扭曲原件之后,可以进行微调或基于缓冲区附加上下文的利用。那是你开始的地方。cookie 创意被盗的第一个问题,您可以通过使用不同的并行沙箱轻松纠正它。我猜有些供应商有这种设置。查看CTF365

如果您只需要让您的服务器访问给定的 url,而不是让机器人和线程旋转等。最简单的解决方案是立即(一旦提交 url)使用库访问 url(如请求在 python 中),它也允许解析响应。就好像管理员或其他机器人在他们自己的浏览器中真实地访问过它一样。

更新:

以下是更详细的解释(根据要求)。一旦收到用户输入(在这种情况下,例如,一个 url),只需将其传递给以下函数:

def simulate_admin_visits(url):
try:
    #initialise with empty cookies
    jar = requests.cookies.RequestsCookieJar()
    #visit the page that allows the admin to login 
    #and collect the cookies from the response
    response = requests.post(LOGIN_URL, data={'uname': ADMIN_UNAME, 'password': ADMIN_PASSWORD}, cookies=jar)
    jar.update(response.cookies)
    #visit the user-submitted content using the just-collected cookies
    #here the exploit/ctf_challenge-solution is allowed to work
    <parse the submitted content>
    #have the admin logout
    requests.get(LOGOUT_URL, cookies=jar)
except ConnectionError:
    print 'Could not connect to ' + url