This page looks best with JavaScript enabled

一次传销站实战

 ·  ☕ 3 min read

一天朋友丢个站过来,要求getshell,就简单的看了下

踩点

网站使用宝塔,windows操作系统。基于thinkphp3.2.3 端口开发80,443,3389

发现sql注入

thinkphp3.2.3 注入还是比较常见的,这里简单发现个注入

image.png

thinkphp3.2.3默认支持pdo,这里我们想办法先进后台

image.png

注入管理员表,发现几百个管理人员
image.png

登录后台

因为需要短信验证码,这里为了不让管理员引起警觉,利用pdo把一个不常登录的账号的手机号改成自己的,尝试登录,发现不行。说明不是以数据库里的值来进行判断的,猜测写死在了代码里(getshell之后发现确实是写死在代码里了)。所以我们只能尝试找一个不常登录的账号,然后去找验证码,登录到后台。这种网站实现验证码登录一般是2个情况,要不就是通过接口来判断,要不就是接口发送完短信写死到数据库里,然后通过数据库查询进行比对。所以我们要不就找接口,要不就是找数据库。这里很幸运,发现smscode这个表是用来存储用户短信验证码的
image.png

所以我们点发送验证码之后,查询这个表的最后一条值即可登录到后台。

image.png

通过oss_key拿到源码

登录到后台之后,发现没有getshell的点,这时候想办法找源码审计。

刚好发现个.git泄露,赶紧还原。头疼的是,用了市面上大部分工具,都没还原到完整的代码。这时候只能硬着头皮看了。前面说过,后台是有短信验证功能的。而这种发送短信功能的,要不就是买的第三方短信平台的,要不就是用的云短信,比如阿里云腾讯云这种接口。第三方短信平台代码实现一般是把账号密码写死在代码里,然后去请求某个接口来实现发送短信。而阿里云腾讯云这种云短信,一般是用的oss_key来调用api实现发送短信功能。所以代码实现很可能会写死在代码里。幸运的是,发现确实用了oss_key。

image.png

利用坛子里兄弟的工具,把shell给反弹回来。https://www.t00ls.net/thread-58471-1-1.html

发现目标站并没有在这台机器里,但是上面确实有套与目标站一样的源码,猜测可能搞到开发商了。

通过代码审计getshell

拿到源码之后,简单进行审计。

image.png

S方法,tp的缓存方法。首先进行读取然后赋值给变量tmpl。如果为空或为1就进入到getTmpId方法。并把返回的内容直接写入到TMPL缓存文件去。这肯定是能进去的,所以我们跟进到getTmpId方法
image.png

实例化一个模型。
image.png

getTmplList方法,sql查询。

image.png

一遍流程走下来,可以发现,就是遍历tmpl所有字段的值。所以说,只有值可控,我们就能把指定内容写入到缓存文件里。而我们是有sql注入的,并且是有pdo的。所以我们把一个值插入一句话,即可getshell。

首先,我们先把一个字段的值改大一点,比如

alter table tmpl modify titile varchar(3000);

然后update,填入我们的payload。最后成功getshell

image.png

总结

一趟下来看上去挺流畅,其实遇到的坑没写出来而已

Share on

Dejavu
WRITTEN BY
Dejavu
Web渗透爱好者