SWCTF2025-部分wp

web

ezphp

<?php
highlight_file(__FILE__);
if(isset($_POST['v1_snert.com']) && isset($_POST['v2_snert.com'])){
    $v1 = $_POST['v1_snert.com'];
     $v2 = $_POST['v2_snert.com'];
     if(sha1($v1)==sha1($v2) && $v1!=$v2){
         $p=$_GET['p'];
        if(!preg_match('/^ctf$/im',$p)){
            die("nono");
            }
        if(preg_match('/^ctf$/i',$p)){
            die("nono");
            }
        echo "good";
        if($_COOKIE['user']=="admin"){
            if(isset($_GET['flag'])||isset($_POST['flag'])){
                die("nonono");
                }
            @parse_str($_SERVER['QUERY_STRING']);
            extract($_POST);
            $c=$_GET['c'];
            if($flag==666) {
                if(!preg_match('/[0-9]|[a-z]/i',$c)){
                    eval($c);
                    }
                }
            }
        }
    }
?>

首先第一个考察的点是POST传参。在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_, 但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换 。然后就是两个变量的sha1值相等,但两个变量不相等,这里不能用数组绕过,使用两个sha1值为0e开头的即可,0e开头会被当成0。

下面两个preg_match,一个是多行匹配,一个整个字符串进行匹配,使用%0a(换行的URL编码)。

在cookie设置user=admin,传参_POST[flag]=666,经过parse_str($_SERVER['QUERY_STRING'])处理,将URL查询字符串(如 ?a=1&b=2)解析为全局变量,会变成$_POST[flag]=666,再经过extract($_POST)$_POST 数组中的键值对转换为变量,可使$_PSOT[flag]转换成$flag。

最后就是一个无字母无数字的rce,异或、取反都可以。

signin

纯签到,file伪协议直接读即可。

ezupload

前端校验,传png后缀,抓包改为php,已经测试可以发现过滤了php、eval、system等函数。使用短标签绕过。也是送分题,ai也能问出来。

misc

JUST_SO_SO

打开压缩包是一个png和一个txt,坤坤的图片明显可以感觉到宽高被修改了,将宽高恢复发现其上的interesting,txt里内容是2进制,2进制转字符发现是zip压缩包

zip中有两个文件,其中haha.txt没有加密,而坐标.txt是加密的,将haha.txt拿出来,可以发现有隐藏字符,使用snow解密,而解密密码是刚刚的interesting,得到的就是压缩包的密码。

打开压缩包,将坐标.txt中的点在直角坐标系中表示出来,就可以得到flag。

pixel

打开是一张图片,首先可以分离出私钥文件,图片上只有黑、红、蓝、绿四种颜色,明显是4进制,黑0,红1,蓝2,绿3,把这些值提取出来转换成字符串,是一串base64,,将其转换为图片

  

这张照片只有黑白,黑0,白1,将值提取出来转换成字符串,这个字符串就是密文,利用最开始分离出来的密钥进行解密。

你要的flag全拿走

真送分题。打开压缩包可以看到注释的字符,解base64。

得到解密密码。使用MP3Stego解密即可。得到flag{90ba414e7dc2ea5adc7b0e836e9de76d}

套娃压缩包

首先是一个名字叫hash.zip的加密压缩包,hash这个名字已经在提示利用hash值去爆破压缩包密码。

解压缩以后,里面是一个key.txt和一个压缩包。通过循环解压缩,得到压缩包最里面是个hint.txt,宫水三叶是“你的名字”里在主人公,将刚刚那些压缩包的名字拼接起来,解base64可以得到一个压缩包,里面是flag.txt,先解base64然后sm4解密。

hbase

打开txt看到好几百行16进制字符串,每行都是32个字符,将前几行放cmd5网站上尝试解密,可以发现每行都是单个字符MD5后的结果。

写脚本,对每行MD5值进行爆破,得到很长一串base编码的内容,对该结果进解10次base64,即可得到flag{4ed2b09cf41c5a353d42ec5adfa1122b}

import hashlib
import string
def brute_force_md5(md5_hash, max_length=5):
    # 定义可能的字符集合:所有可打印字符(包括字母、大写字母、数字、符号和空格)
    possible_chars = string.printable.strip()  # .strip() 去掉换行符和空格
    for length in range(1, max_length + 1):
        for guess in generate_combinations(possible_chars, length):
            guess_hash = hashlib.md5(guess.encode()).hexdigest()
            if guess_hash == md5_hash:
                return guess
    return None
def generate_combinations(chars, length):
    if length == 1:
        for char in chars:
            yield char
    else:
        for char in chars:
            for combination in generate_combinations(chars, length - 1):
                yield char + combination
def read_hashes_from_file(file_path):
    with open(file_path, 'r') as file:
        return file.read().splitlines()
# 读取密文文件,假设文件路径为 'hashes.txt'
hashes_file = 'output.txt'
md5_hashes = read_hashes_from_file(hashes_file)
ms=""
# 对每个 md5 密文进行暴力破解
for md5_hash in md5_hashes:
    print(f"正在破解哈希:{md5_hash}")
    result = brute_force_md5(md5_hash, max_length=5)
    if result:
        print(f"找到匹配的明文: {result}")
        ms=ms+result
    else:
        print("没有找到匹配的明文。")
print(ms)

重要文件

打开是一个word文档,算是misc签到题吧,flag就隐藏在各处。

只有最后这一部分有一点点不好找,将右图保存下来,然后提取水印。把这些拼接起来就是完整的flag{7a57580b8b51bfcb6c9de4410e3dc5f0}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值