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}