NewStar CTF WP
Web Week1
1.multi-headach3

打开题目发现是有关于robots.txt 的问题
关于robots.txt [如何使用robots.txt及其详解-CSDN博客]()
访问https://eci-2ze0iex5s63bb2l3y5og.cloudeci1.ichunqiu.com:80/robots.txt

可知/hidden.php不允许被robots访问,我们尝试访问/hidden.php

和预想结果不同,没有直接显示flag,考虑到题面上的“头”,我们看一下响应头
由location可知,这里其实进行了重定向

找到flag:flag{90c9c7a4-7724-4f68-b06d-a79313e774fb}
当然此处也可以通过burp抓包进行操作

2.strange_login


这里考察了最基本的SQL注入问题
对应SQL语句为“select * from table where id=admin or 1=1“
根据SQL语句的定义,id=admin和1=1满足一个即可,1=1恒为真故语句成立

成功拿到flag:flag{67915529-053e-4d66-b41a-8fc21b711d8c}
3.宇宙的中心是php


右键和F12都被禁用了,我们用view-source:查看页面的源代码

找到并访问/s3kret.php

此处问了一下ai该代码的含义
代码解读:1.intval($answer):只提供一个参数时,
intval()默认将字符串视为十进制 (Base10) 进行转换2.
intval($answer, 0):第二个参数设置为0时,intval()会自动检测基数:
- 以
0x开头:视为十六进制 (Base 16)。- 以
0开头:视为八进制 (Base 8)。- 其他:视为十进制 (Base 10)。
所以需满足两条件:
1.POST传参"newstar2025"且其值不等于47
2.基数经转换后等于十进制下的“47”,则有“0x2F”(Base 16)和“057”(Base 8)满足条件


成功得到flag:flag{f8a1031b-bebb-4d15-ac00-62984ab3fccc}
4.我真得控制你了



这题和按钮禁用与开发者工具禁用有关,没关系,还有其他方式可以打开开发者工具
根据提示"JavaScript",需要一段解除限制的指令
javascript:(()=>{try{document.getElementById('shieldOverlay')?.remove();document.getElementById('accessButton')?.classList.add('active');document.getElementById('accessButton').disabled=false;const f=document.getElementById('nextLevelForm');if(f){fetch(f.action||'/next-level.php',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:new URLSearchParams(Object.fromEntries(Array.from(f.querySelectorAll('input')).map(i=>[i.name,i.value]))).toString()}).then(r=>r.text()).then(t=>alert('server returned:\\n'+t)).catch(e=>alert('fetch failed: '+e))}else alert('no form found')}catch(e){alert('error: '+e)}})();点击按钮来到下一关
这里考察弱口令,我们用burp来爆破一下


得到密码:111111
问了一下ai代码的含义
代码行 作用 error_reporting(0);禁用所有 PHP 错误报告,使代码执行中的错误不显示给用户。 function generate_dynamic_flag($secret) { ... }定义一个获取 Flag 的函数,它从环境变量 ICQ_FLAG中获取,如果不存在则返回default_flag。if (isset($_GET['newstar'])) { ... }检查 URL 中是否存在 newstar这个 GET 参数。if (is_array($input)) { die("恭喜掌握新姿势"); }检查 1: 禁止输入值为数组。 if (preg_match('/[^\d*\/~()\s]/', $input)) { die("老套路了,行不行啊"); }检查 2: 字符限制。 这个正则表达式( /[^\d*\/~()\s]/)使用了否定字符类[^...],它禁止了除以下字符之外的所有字符: -\d:数字 (0-9) -*:乘法/星号 -\/:除法/斜杠 -~:位非运算符 (Tilde) -():圆括号 -\s:空白字符 (空格、制表符等) 重点:字母、点、引号、美元符号等都被禁止。if (preg_match('/^[\d\s]+$/', $input)) { die("请输入有效的表达式"); }检查 3: 操作符限制。 阻止输入只包含数字和空白字符(例如 2025)。它强制你必须使用一个运算符(如*,/,~,())。try { @eval("\$test = $input;"); } catch (Error $e) { die("表达式错误"); }执行点: 将你的输入 $input拼接后,使用eval()函数执行,结果赋给$test变量。这是核心漏洞点。if ($test == 2025) { ... echo "FLAG: {$flag}</div></div>"; }成功条件: 只有当 eval()执行的结果$test恰好等于 2025 时,才会输出 Flag。
可知要构造GET请求,且newstar2025的值等于但不可以直接等于2025
故构造 ?newstar=45*45

成功得到flag:flag{202ec28c-7d93-4355-bf09-cb058f247098}
5.别笑,你也过不了第二关


查看一下源代码

可见关键点在于score,从控制台操作一下

成功得到flag:flag{aac09df6-a802-4d90-b27a-9a2f9224a51b}
6.黑客小W的故事(1)


根据提示抓个包,改一下吉欧的数量

根据提示,继续传POST请求


这个地方有两种方法
1.fetch
// 1. 发送DELETE请求到特定端点
fetch("https://eci-2zee3y0yhvj7uppsoyyw.cloudeci1.ichunqiu.com:8000/talkToMushroom?shipin=mogubaozi", {
method: "DELETE",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: "chongzi=remove" // 明确指定要删除的属性
})
// 2. 服务器接收到请求后:
// - 识别DELETE方法
// - 解析查询参数 shipin=mogubaozi
// - 解析请求体 chongzi=remove
// - 执行删除chongzi属性的操作
// 3. 服务器返回操作结果(通常是HTML页面)
.then(r => r.text())
// 4. 客户端将返回的HTML直接渲染
.then(html => {
document.open();
document.write(html); // 用服务器返回的内容替换当前页面
document.close();
});此时我们用burp抓包可以得到

2.bp发送DELETE指令

但是这个时候蘑菇会说

我们再发送一个POST请求,让guding=1即可
如果这个地方不想再多发一步POST,可以用burp传”chongzi=remove“这一DELETE请求

访问/Level2_END


根据提示修改UA头,得到token
这里要记得修改版本号,不然不通过


访问/Level_Sly

成功得到flag:flag{e72ce6c5-49d2-46d6-a631-b7b5459187c1}




































































































































