前言
之前在群里有个老兄求助帮忙审计一个自助发卡系统的cms(还是1块钱买来的) 基于tp5开发 我反正没事 于是看了一下o-o 找到了几种getshell的方法 这里就介绍一种
正文
这个系统的后台上传是有两个步骤首先会调用 admin模块plugin控制器的update方法 通过 post的md5 和 filename 生成一个加密token 这个token会用于后面的检验
对应源码
再来看看第二步 当然就是上传文件拉 下面就是个平常的上传文件包
看看对应的源码
这里
1 | if ($this->request->post('token') !== md5($filename . session_id())) |
这一个判断是可以绕过的 因为 这里的 $filename = join(‘/‘, $md5) . “.{$ext}”; 而 $md5是可以控制的 ext 也是可以控制的 所以$filename可以控制 而且 post 的token也可以控制 这样当然可以绕过 具体的生成方法就是利用上传文件的第一步 自己可以随意构造post的md5值 并且没有检验针对post的md5参数 这是getshell的背景之一
然后关键点在 1
$info = $file->move('static' . DS . 'upload' . DS . $md5[0], $md5[1], true))
1 | $saveName = $this->buildSaveName($savename); |
我们来看看这个buildsavename函数
1 |
|
兄弟萌 看见没 hh 关键点就在 最后一个if判断上 判断 $savename里是否有. 有的话就会直接 return $savename 那么这个savename是什么呢 看前面的调用发现 这个savename就是 调用move函数的第二个参数 也就是 $md5[1] 这个是咱们可以控制的呀 而且看move函数后面是将这个作为文件名了的 那么我们将$md5[1]设置成xxxx.php(要长与16位) 是不是已经成了!!! hh
还需要注意一下 上传的时候 png图片前面一部分的格式需要保留 因为有检测 php代码丢后面就好
你别看它返回的是上传失败 其实已经上传成功了 路径就是 xxxxx/static/upload/$md5[0]/$md5[1]
我刚开始百思不得其解为什么会上传失败 一切都这么的流畅…. 最后自己在本地搭建了环境,然后实验,偶然间,去瞟了一眼上传目录,发现……其实已经上传成功了….. 应该自己去访问一下的 这个地方有点傻了
最终:
弄了个phpinfo上去
看了一下disabled function 并不恐怖 而且是php 7 直接用 php7的bug 就能执行命令
提权的话还没有尝试 也不是很会提权………..eee 就这样…………