阿里云后的服务器

前言

这是一个医疗咨询行业的网站,很多功能已经停用了,而且还有阿里云盾。

注入

这家公司有两个域名,从a域名找到了注入点,得到了数据库信息,从其中翻到了b域名的子域名数据库,里面有user表,果断dump。

image-20230327111054584

dump后发现表中有username和password_hash,图片是部分内容。

image-20230327111502998

在前面注入过程中,爆出了是yii框架,他的password_hash是加盐的,cmd5解不了。

爆破

在dump下来的user表中,有username为管理员_测试的帐号,于是爆破了一波弱口令,运气好爆出来了,密码是123123,登陆进去翻了一遍,有发现KindEditor,但是上传时报目录没有写入权限错误,

image-20230327114754692

无奈只好继续翻功能点,但是翻了个底朝天也没有找到能用的。没有办法了,于是大胆猜想测试账户密码都是123123,又对user表中的其他几个测试账户进行了测试,发现真被我猜中了。

经过登陆其他账户,发现他们的功能权限数量是不一样的,有的多有的少,于是我决心搞到admin的账户。

替换大法好

首先是对admin帐号一通密码爆破,无果,后来想到替换password_hash,将其替换成123123的hash,这里需要用到堆叠注入,幸运的是注入点能堆叠。注入后要知道是否成功,这里用到sqlmap的自定义sql语句功能(自己瞎起的名字),

1
sqlmap -u 'http://www.xxx.com?id=1' -p id --sql-query "SELECT password_hash  FROM test.user where id=1" --purge

注意要用上purge参数,不读取缓存,如此,便可查询到实时的数据库字段。

image-20230327115713169

接下来去用admin登陆,成功。

登陆成功后要把密码改回去,然后用cookie登陆,这里说下yii的cookie,我这个网站只有 _identity-backend 是核心,

1
0f26ba5ad6cfc8e5a48aa136223df0f4681580209365ac29d36b8537ad0b3020a:2:{i:0;s:17:"_identity-backend";i:1;s:45:"[1,"7c-ci5pDhwCbrbT2xWvkt_vQEu8_0jmH",864000]";}

它是由两部分组成,第一部分是 0f26ba5ad6cfc8e5a48aa136223df0f4681580209365ac29d36b8537ad0b3020 ,这个我不清楚是怎么得到的;第二部分是 a:2:{i:0;s:17:"_identity-backend";i:1;s:45:"[1,"7c-ci5pDhwCbrbT2xWvkt_vQEu8_0jmH",864000]";},是一个数组序列化后的结果。其中的 i 就是数据库中的 id 字段, 7c-ci5pDhwCbrbT2xWvkt_vQEu8_0jmH 这一部分就是 auth_key.

如果不是第一部分我找不到admin对应的值,不然就不用替换密码hash了。

再一次上传

来到admin的后台,功能多了不是一点点呀,

image-20230327121103467

翻了一通之后,找到了一个能用的上传点,这个上传点差点被我错过了,因为历史原因,它代码存在错误,返回了500,但是由于php是解释型语言,文件上传部分已经完成了。

image-20230327122312827

然而,事情总不会一帆风顺,有一股未之力量在我和服务器之间阻挡。

阿里云盾

我尝试修改上传的内容为webshell,但是服务器无返回,连响应码都没有的那种无返回,于是我删掉其中一些字符,慢慢的直到php、phpinfo()等关键字被删掉后才有响应,很明显是关键字匹配,另外文件名也有匹配。于是我尝试

burp插件的Sleep chunked sender,成功,但是这样上传很麻烦,而且对于后续流量也存在关键字匹配,webshell连接工具都使不了。

我索性手动执行命令,传了个无字母数字的webshell上去,成功。然后在测试中发现了针对这个网站源码的绕过方法。

绕过

首先是文件名,通过使用 1.php.jpg 就可以绕过,猜测后端写的逻辑是取 . 分隔符数组的 [1],就像上面500报错截图写的一样。

然后是内容,用了无字母webshell可以成功上传,但是用不了用不了几次就返回502错误Powered by Tengine,猜测是被阿里云盾搞了,然后将执行的部分从assert换成了system,发现拦截次数少了一些。

但是总归还是不方便,因为每被拦截一次,就要重新上传一次文件,用新文件执行命令。后来我想到用neoreg开个代理,以127.0.0.1为url,host为原本域名,这样就绕开了那堵空气墙。

image-20230327123058099

站库分离

刚开始以为所有的子域名都在这一个小小云主机上了,后来才发现一直找不到www子域名的web目录,原来这个还是个站库分离的,而且还分了几家,所以现在当务之急就是找到的ip。

数据库

从yii的数据库配置文件 /data/sites/webs/xxx_press/vendor/simple_html_dom.php 找到了数据库账户,然后从 netstat -antlp 看到了远端端口为3306的ip,是个内网地址,于是我用neoreg代理,横向连上了数据库。其实这个数据库也就是我们注入的那一个。

信息收集

是个mysql,接下来用命令找连接了mysql的ip,得到了几个ip,其中有个陌生的,可能就是www子域名的站点

1
select * from information_schema.PROCESSLIST;

image-20230327213921344

获取数据库版本,得到这是8.0.25,高版本

1
select @@version;

遗留问题

yii反序列化漏洞

yii是有反序列化漏洞的,晚网上也有很多PoC公开,我这个目标也是受影响的版本,但是我没有研究过yii,我理解是需要通过代码审计找到源码中有unserialize方法的入口点。

cookie的未知部分

cookie的 _identity-backend 的第一部分是怎么得到的,估计要去看源码的部分了。

www站点

由于是站库分离,只拿到了press站点的权限,数据库、www等站点的都没拿到。