Web
Web由html+css+js搭建而成,通过浏览器访问该网站。其中的步骤是以下图片展示!

简单的理解,当用户输入url的IP地址,无需走DNS直接浏览器和目标服务器建立连接,网站内容并响应给用户。而输入的url是域名,先查看用户主机是否有目标服务器缓存、浏览器缓存或hosts,如有直接建立目标服务器,没有就走DNS【域名解析系统】,递归查询等目标服务器的IP,响应回浏览器并和目标服务器建立连接。
BASIC-1题解

该网站被禁用了F12以及快捷键,那么我们可以有其他办法来查找源代码是否存在flag。

在地址栏左边加上:view-source:// + url访问后是源代码网页。也可以通过burp抓包、在线工具获取响应后的源代码!


获取到了网页中源代码后,在网页源代码中搜索查找flag。

flag是base64编码,可以通过burp自带的编码工具或者在线工具解码。

BASIC-2题解

图中是一个反馈区,可以填写内容并反馈给对方,那么抓包一下是否存在参数。

发现是POST请求,参数大致理解,包含is_admin、nickname、contact、content,注重的是is_admin=0,如果改为1对方服务器是否能接收到我们的参数。

哎!可以,那么右边响应的数据中flag找到了,那么等于1代表是admin用户,0代表普通用户。
BASIC-3题解

网页中需要正确密码才能进入后台,那么随便输入一个密码是否存在限制。

存在限制,直接被锁定60分钟,那么看一下是前端js还是后端限制。

可以通过F12或右击查看源代码,发现包含js脚本,这个脚本就是来判断密码是否正确,并锁定60分钟后才能继续输入密码。

发现head中,有一个key.js,有点可疑点击一下,打开快捷键Ctrl+u查看源代码找到key.js点击。

这是一个jsfuck加密的数据,那么可以通过控制台直接输出回正常数据

复制引号里面的回车,得到正常数据,访问密码就得到了。

查看到里面资料flag。
BASIC-4题解

页面中需要邮件或验证码才能受邀请,那么查看源代码里有什么。

发现有一个main.js文件,点击查看里面内容。

这是一个JavaScript脚本,发现var_0、var_1、var_2猜测是ASCII码,

发现var_0解码后,是QCCTF_VIP_2026。

得到凭证里flag。
BASIC-5题解

网页中需要输入计算正确答案后,加1分并且做满1000分,这里我有两种,一种通过控制台、另一种burp抓包。
F12找到源代码中的main.js,里面内容是构造1000分的加法计算,判断得到flag。
javascript脚本
// 自动答题 - 漫长
// 复现原有函数
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function generateQuestion() {
const op = randomInt(0, 1) ? '+' : '-';
let a, b, answer;
if (op === '+') {
a = randomInt(1, 99);
b = randomInt(1, 99);
answer = a + b;
} else {
a = randomInt(10, 99);
b = randomInt(1, a - 1);
answer = a - b;
}
return { text: `${a} ${op} ${b} = ?`, answer: answer };
}
// 自动答题逻辑
let currentScore = 0;
const answerInput = document.getElementById('answer-input');
const submitBtn = document.getElementById('submit-answer-btn');
const claimBtn = document.getElementById('claim-btn');
const scoreSpan = document.getElementById('score-num');
const progressBar = document.getElementById('progress-bar');
// 自动答一题
function autoAnswer() {
// 解析当前题目
const qText = document.getElementById('question-text').textContent;
const [aStr, op, bStr] = qText.split(' ');
const a = parseInt(aStr, 10);
const b = parseInt(bStr, 10);
const answer = op === '+' ? a + b : a - b;
// 填入答案并提交
answerInput.value = answer;
submitBtn.click();
// 更新分数
currentScore = parseInt(scoreSpan.textContent, 10);
console.log(`当前分数: ${currentScore}/1000`);
// 刷到1000分自动领flag
if (currentScore >= 1000) {
console.log('✅ 分数达标,自动领取flag');
claimBtn.click();
return;
}
// 延迟下一题,避免请求过快
setTimeout(autoAnswer, 100);
}
// 启动自动答题
autoAnswer();
// 直接构造加密后的1000分数据
const realData = btoa(unescape(encodeURIComponent(JSON.stringify({ score: 1000 }))));
fetch('/claim', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data: realData })
})
.then(r => r.json())
.then(r => {
if (!r.data) return alert('失败:' + (r.error ?? '未知错误'));
const res = JSON.parse(decodeURIComponent(escape(atob(r.data))));
if (res.flag) {
console.log('%c🎉 FLAG 已拿到!', 'font-size:16px;color:green');
console.log(res.flag);
alert('FLAG:\n' + res.flag);
} else {
alert('提示:' + res.message);
}
})
以上是我通过豆包生成的JavaScript代码,第一种就是漫长的自动答题,第二种就是构造1000分进行替换获取flag。
burp抓包

发现data数据是一个base64编码的数据,我们将它解码得到:{“score”:1},这么一来,就发现是通过键值对base64编码后传递给对方,通过对方解码并返回是否是1000分。

将{“score”:1000}base64编码后得到eyJzY29yZSI6MTAwMH0=传递给data参数。

发送请求后,对方响应data数据,也是一个base64,我们将它解码一下。

解码后得到flag。
BASIC-6题解

页面中什么都没有,我在源代码里也没有找到相关重点。

发现网络中当前网页的标头中的响应标头有一个x-flag,找到了flag。
BASIC-7题解

这里一个拼图,那么我们将图片拼好并提交。

发现页面中没有flag,那么通过抓包查看一下参数有哪些。


有一个csrf参数值,那么在拼图的源代码里有一个csrf,那么在抓包看一下。

将拼好图提交并抓包,请求后发现Location参数对应下一次请求的文件,那么我们修改一下请求文件。

再次请求之后,响应的数据是flag,那么得到了flag。
BASIC-8题解

该题目的页面是什么都没有,但具我所知,利用.phps来查看

发现最后有一个参数判断,意思是get请求参数?a 如果不等于这个值返回网站建设……,如果等于就返回/flag文件读取的内容。

直接在地址栏后加上?a=QCyYdS回车,就得到flag。
BASIC-9题解

该题目介绍信息收集以及爬虫协议的三个考点,index.phps、robots.txt、sitemap.xml介绍。

直接在地址栏靶机后输入robots.txt,发现一个qcq.php文件。

访问qcq.php,得到flag。
BASIC-10题解

页面中什么都没有,通过dirb扫描。

扫描后,发现有一个sitemap.xml访问一下。

发现页面中,有一个http://localhost/wqw.php地址,修改url 访问/wqw.php页面。

响应的内容无法查看,不是admin用户,那么通过burp抓包修改一下。

将cookie中user参数值修改为admin,在右边查找flag。
BASIC-11题解


该页面有一个robots,点击后发现有一个/flag.php文件,进行访问。

访问后,显示的是假的flag。

这道题,本人也不知道怎么找到flag在哪!直接在地址栏后输入/fl4g.php。
BASIC-12题解


访问该页面,点击卡片发现地址栏后面携带着?id=参数,那么这里有可能是爆破id。

抓包后,选择intruder,在id=值选择payload,选择数值1-1000并攻击。

筛选网页中包含flag的,发现存在对应的?id=121。
BASIC-13题解


该页面是一个登录页面,F12查看源代码发现默认username是admin。那么密码是需要爆破出正确密码进行登录。

在intruder配置好,以及密码字典进行爆破。

筛选得到正确密码:admin123以及flag。
BASIC-14题解

网页显示.php的源码,里面代码就是,fopen读取文件,然后判断参数filename是否为空并且长度小于17才能输出/admin_secret.txt文件里面的内容。如果输出?filename=/admin_secret.txt就直接else因为等于17长度,那么如何解决呢?

这里从刚刚那张图,$flag = fopen(‘/admin_secret.txt’, ‘r’);就已经被执行了,是读取状态存在进程,在Linux有两种方法查看。第一种是lsof命令,第二种/proc/self/fd/5。
那么第一种肯定不行,第二种可以,这里不介绍原理,简单理解就是虚拟文件系统存放在内存中当前进程打开某个文件后面加上数字。

