关于Tom表哥对卖手机的骗子网站的一不小心的分析

一切的一切都要从一只蝙蝠开始说起…总之最近很闲,于是逛bilibili,发现了大表哥一不小心就进了某个骗子网站的后台,不仅心向往之
但不幸的是据说为了规避风险,表哥删减了很多内容,看的我云里雾里,一不小心就晕了
Tom表哥的视频在这里
为了有朝一日我也能够像表哥一样一不小心,我决定动手分析一波
放一张视频截图
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第1张图片
可以看到表哥用的是burpsuite爆破日志,然后知道管理员密码进了后台
网站是由基于thinkphp5开发的shopxo1.6(或许可以试试thinkphp5的几个poc,下次一定吧),去官网上下载源码安装后,知道了默认的管理员账户为admin,shopxo,但我肯定现在不会有人使用默认的密码了,毕竟谁没有被盗过QQ号呢?啊!我逝去的青春…
表哥说的日志位于/runtime/log/(省略网站根目录前缀,下同)下的目录中,不同的目录命名格式应该是4位的年份加上2位的月份,然后对应月份的目录下是文件名为2位的日,后缀为log的文本文档
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第2张图片
因为只需要关心最近一个或两个月内管理员的登录行为(太靠前或许密码被改掉了,以及日志或许被清掉了),所以目录是直接可以确定的
于是通过burp suite的intruder进行对2位日子的遍历,然后根据大小排序得到信息相对较多,更可能是有登录行为的文件
搜索pwd字符串是因为管理员登录时post的密码变量名为login_pwd,然后发现确实有对数据库中s_admin表中usernameadminlogin_saltlogin_pwd进行查询,而且登录后会对数据表中的login_saltlogin_pwd进行更新
在这里插入图片描述
密码校验主要调用/application/common.php里的LoginPwdEncryption函数

function LoginPwdEncryption($pwd, $salt)
{
    return md5($salt.trim($pwd));
}

数据表中一直都是对密码加盐后的md5值,效验的时候将用户输入的密码同样加盐后进行对比,成功后更新数据库里的login_saltlogin_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项是明文的密码
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第3张图片
进入后台get


后续上传一句话getshell,如果mysql的SECURE_FILE_PRIV不是NULL的话,那就直接在工具->SQL控制台select into outfile一气呵成
不行的话不知道咋办了,或许是这个CNVD-2019-47173(未公布poc),或许是ueditor有上传漏洞(懒得试了),求知道的大佬告知
放一张图假装自己getshell

关于Tom表哥对卖手机的骗子网站的一不小心的分析_第4张图片
参考路西法大哥的ShopXO框架后台Getshell漏洞复现,成功从后台getshell

步骤:
首先,到后台应用管理->应用商店->主题,去下载那个唯一的免费主题
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第5张图片
在这个压缩包的\default\__static__目录下添加一个php文件

网站管理->主题管理->主题安装里将这个压缩包上传,添加的php文件会解压到
shopxo根目录\public\static\index\default目录下,http访问这个文件即可
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第6张图片
(小声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);
}

去年1月的那个变量覆盖的payload在源码里添加
error_reporting(0);后是可以的
关于Tom表哥对卖手机的骗子网站的一不小心的分析_第7张图片

你可能感兴趣的:(渗透测试)