阿欢

  • 主页
  • 随笔
所有文章 友链 关于我

阿欢

  • 主页
  • 随笔

getshell 某发卡平台

2020-03-30

前言

之前在群里有个老兄求助帮忙审计一个自助发卡系统的cms(还是1块钱买来的) 基于tp5开发 我反正没事 于是看了一下o-o 找到了几种getshell的方法 这里就介绍一种

正文

这个系统的后台上传是有两个步骤首先会调用 admin模块plugin控制器的update方法 通过 post的md5 和 filename 生成一个加密token 这个token会用于后面的检验
getshell-某发卡平台

对应源码
getshell-某发卡平台

getshell-某发卡平台

再来看看第二步 当然就是上传文件拉 下面就是个平常的上传文件包
getshell-某发卡平台

看看对应的源码

getshell-某发卡平台

这里

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))
这个move函数里 跟进这个move函数 在这个move函数里有一个关键的调用

1
2
3
$saveName = $this->buildSaveName($savename);
$filename = $path . $saveName;

我们来看看这个buildsavename函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

protected function buildSaveName($savename)
{
// 自动生成文件名
if (true === $savename) {
if ($this->rule instanceof \Closure) {
$savename = call_user_func_array($this->rule, [$this]);
} else {
switch ($this->rule) {
case 'date':
$savename = date('Ymd') . DS . md5(microtime(true));
break;
default:
if (in_array($this->rule, hash_algos())) {
$hash = $this->hash($this->rule);
$savename = substr($hash, 0, 2) . DS . substr($hash, 2);
} elseif (is_callable($this->rule)) {
$savename = call_user_func($this->rule);
} else {
$savename = date('Ymd') . DS . md5(microtime(true));
}
}
}
} elseif ('' === $savename || false === $savename) {
$savename = $this->getInfo('name');
}
if (!strpos($savename, '.')) {
$savename .= '.' . pathinfo($this->getInfo('name'), PATHINFO_EXTENSION);
}
return $savename;
}

兄弟萌 看见没 hh 关键点就在 最后一个if判断上 判断 $savename里是否有. 有的话就会直接 return $savename 那么这个savename是什么呢 看前面的调用发现 这个savename就是 调用move函数的第二个参数 也就是 $md5[1] 这个是咱们可以控制的呀 而且看move函数后面是将这个作为文件名了的 那么我们将$md5[1]设置成xxxx.php(要长与16位) 是不是已经成了!!! hh

还需要注意一下 上传的时候 png图片前面一部分的格式需要保留 因为有检测 php代码丢后面就好
getshell-某发卡平台

你别看它返回的是上传失败 其实已经上传成功了 路径就是 xxxxx/static/upload/$md5[0]/$md5[1]

我刚开始百思不得其解为什么会上传失败 一切都这么的流畅…. 最后自己在本地搭建了环境,然后实验,偶然间,去瞟了一眼上传目录,发现……其实已经上传成功了….. 应该自己去访问一下的 这个地方有点傻了

最终:

弄了个phpinfo上去

getshell-某发卡平台

看了一下disabled function 并不恐怖 而且是php 7 直接用 php7的bug 就能执行命令

getshell-某发卡平台

提权的话还没有尝试 也不是很会提权………..eee 就这样…………

赏

谢谢你请我吃糖果

  • 审计
  • php代码审计

扫一扫,分享到微信

微信分享二维码
如何绕过某985(母校)钢铁waf并拿下该系统
emmmmmmm-一次bypass
© 2020 阿欢
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 审计
  • 注入bypass
  • bypass
  • 基于语义的waf

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家