环境搭建

下载地址:https://github.com/GreenCMS/GreenCMS

环境:

  • php5.6.9
  • Apache2.4.39
  • MySQL5.7.26

访问http://127.0.0.1/install.php直接安装:

image-20251024142716423

框架分析

先看目录结构:

image-20251024182247083

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/
|--Addons 插件文件夹 (与OneThink高度兼容)

|-- 各个插件目录

|--Application 应用目录

|-- Admin 管理员模块

|-- Home 主模块

|-- Api 手机客户端API模块

|-- Common 通用基础模块

|-- Install 安装程序模块

|-- Weixin 微信公共平台API模块

|-- Core ThinkPHP 3.2.1 完整版 (有删减)

|-- Data 运行文件

|-- Backup 全站备份

|-- Cache 升级等工作的缓存

|-- DBbackup 数据库备份

|-- Install 安装文件

|-- Log hinkPHP框架Log

|-- Upgrade 升级文件

|-- Temp ThinkPHP框架Temp目录

|-- Extend 外部扩展文件夹

|-- GreenFinder Elfinder文件管理器

|-- PHPMailer 邮件发送类

|-- Ueditor 编辑器

|-- Public 公共文件夹

|-- 各个主题文件夹

|-- Upload 上传文件夹

|-- 不同类型的附件


//==

README

.htaccess

.gitignore

robots.txt

LICENSE.txt


//跳转文件

admin.php

weixin.php

install.php

//配置文件

const_config.php

version_config.php

db_config.php

//入口文件
index.php

这是一个thinkphp框架,所以我们重心肯定是在Application文件夹下做文章

路由分析

对于thinkphp框架,其路由一般有几种形式:普通模式、PATHINFO模式、REWRITE模式、兼容模式

image-20251024183210653

普通模式:

1
http://localhost/?m=home&c=user&a=login&var1=value1&var2=value2

其中m指模块,c指控制器,a指操作

pathinfo模式:

1
http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]

REWRITE模式:

1
2
在PATHINFO的基础上去掉入口文件
http://serverName/模块/控制器/操作/[参数名/参数值...]

兼容模式:

1
2
http://servername/index.php?s=/index/Index/index
其中变量`s`的名称的可以配置的。

这里我们可以通过url来看路由,比如进入后台:
image-20251024185621624

可以看到是普通模式:

  • m对应模块->目录

    m=admin告诉框架要去 Application目录下寻找名为 Admin的模块目录。即/Application/admin

  • c对应控制器->文件

    c=index告诉框架要去上述模块目录下的 Controller目录里,寻找名为index的控制器文件。

  • a对应操作->方法

    a=index告诉框架要去上述控制器文件中,寻找名为index的 公共方法(public function)来执行。

路由清楚后就可以直接找漏洞了。

敏感信息泄露

/Data/Log目录下存放着日志文件,而这里并没有对访问作任何过滤,所以我们可通过对Data/Log/year_month_day.log文件发送直接请求利用该漏洞获取敏感信息。

image-20251024170129962

甚至可以下载网站全部日志。

XSS

第一处

找了一圈,由于默认配置的原因,基本上很多XSS注入的地方都存在着htmlspecialchars函数进行转义:

image-20251024200002893

这就导致很多地方都注入不了,但依然存在一些漏网之鱼或者可以绕过的地方。

第一处http://127.0.0.1/install.php?m=install&c=index&a=step3

这里的功能主要是连接数据库并设置用户名密码等信息。

image-20251024163310198

定位到Install/Install\Controller\IndexController.class.php:

image-20251024191020432

image-20251024191046344

这里读取了用户名、密码、邮箱等信息且没有经过任何的过滤就直接存入数据库,而后面读取其信息时也没经过任何检验,所以直接在邮箱注入XSS即可。

注意用户名和密码注入后在登录时会对我们的输入进行转义导致用户名或密码错误登录不了,所以对邮箱注入即可

只要能显示邮箱的地方都有xss:

image-20251024163413003

第二处

由于其他很多地方都有htmlspecialchars转义,但通过不断的尝试功能点还是找到了几处并没有进行htmlspecialchars转义的地方

分别是添加角色功能和添加节点功能http://127.0.0.1/index.php?m=admin&c=access&a=addnode两个功能点中并没有过滤,所以能直接注入:

先看添加角色功能:
功能点在http://127.0.0.1/index.php?m=admin&c=access&a=addrole

image-20251024193506686

其源码定位到:Admin\Controller\AccessController.class.php

image-20251024193343602

这里判断是否为POST请求,如果是POST请求:返回JSON格式的角色添加结果,没有进行任何的过滤,所以直接注入:

image-20251024193445225

image-20251024193544449

image-20251024193618802

再看另一个添加节点功能:

功能点在:http://127.0.0.1/index.php?m=admin&c=access&a=addnode

其源码同样位于:Admin\Controller\AccessController.class.php

image-20251024194011945

逻辑一样的,直接注入即可:

image-20251024163722944

image-20251024194124687

image-20251024194201925

第三处

这一处就比较有意思了,功能点是是在编辑菜单处位于:http://127.0.0.1/index.php?m=admin&c=custom&a=menuedit

image-20251024194414980

一开始我看着这里可以写东西,本来想试着看是否有存储型XSS的,我先试着直接注入:

1
<script>alert(1)</script>

image-20251024194614073

image-20251024194644864

可当我查看菜单管理时发现被转义了,这是由于ThinkPHP配置了全局输出过滤可以理解

但htmlspecialchars函数有个缺陷就是它并不会对单引号进行转义,所以对于那种单引号闭合的标签就可以绕过,这不,刚好我在编辑菜单时发现一个惊喜:

image-20251024202233000

在参数链接这一栏是通过单引号闭合的,所以我们可以直接构造:

1
' onmouseover='alert(1)

这样闭合后就是:

1
2
3
4
<input class="form-control large" name="menu_url"
id="menu_url" type="text" size="40"
value='' onmouseover='alert(1)'
/>

从而直接绕过:
image-20251024202640742

image-20251024202701762

任意文件删除

功能点在插件管理:

image-20251024164445764

这里的插件删除是可以实现任意文件删除的

源码位于Admin\Controller\CustomController.class.php

image-20251024203113336

可以看到它并没有对我们的路径进行验证,可以直接路径穿越

抓包:

image-20251024164532058

将目录改成我们的测试目录:

image-20251024165229195

将参数改成../B1uel0n3

image-20251024165201365

文件上传

在文件管理处可以直接上传文件:
image-20251024203557661

然后直接访问即可:
image-20251025210036418