安装

地址:https://github.com/OpenRapid/rapidcms

环境:

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

image-20251021214519647

分析框架

首先看目录结构

image-20251021214711399

是一个无框架的cms,每个目录对应功能:

  • admin:后台管理目录,包含管理员登录界面和后台管理功能
  • article:文章模块目录,处理文章相关的业务逻辑,文章发布、编辑、删除等功能
  • category:分类管理目录。管理文章分类、栏目分类,分类的增删改查操作
  • install:系统安装目录,包含CMS的安装脚本和初始化程序
  • plugin:插件目录,存放各种功能插件,可以扩展CMS的功能
  • resource:资源文件目录,存放CSS、JavaScript、图片等静态资源,前端页面所需的样式和脚本文件
  • template:模板目录,存放网站的前端模板文件,可以切换不同的网站主题
  • upload:上传文件目录,用户上传的文件存储位置,包括图片、附件等

锁定接口代码文件我们可以通过burp抓包获取:
image-20251021224302494

敏感信息泄露

我们前面安装的时候知道后台入口在/admin,那么我们先从入口动手:

image-20251021230332081

这里包含了../resource/variable.php文件,然后使用file_get_contents读取读取了sql.json文件,然后连接数据库,进而步入登录逻辑代码,sql.json包含数据库的账号、密码等信息,那么我们能否直接访问这个数据库信息呢?

直接访问:

1
http://127.0.0.1/install/sql-config/sql.json

image-20251021230926127

存在未授权漏洞

接着我们进入后台跟随其他功能点审计代码

文件上传

第一处:设置图标处

配置中基本配置下面有个上传文件:
image-20251021233129370

上传文件逻辑定位到/admin/config/uploadicon.php
image-20251021233347081

这里对上传文件类型进行了验证,需要是jpg、gif或者png,但这里是通过文件头检验的,所以我们可以伪造jpg文件头:

1
2
GIF89a
<?php phpinfo();?>

image-20251021233806659

image-20251021233857185

image-20251021233916195

第二处:新增文章处(失败)

image-20251021234420463

文章->新增文章处能够上传图片

上传逻辑定位到/admin/article/upload.php
image-20251021234709152

这里获取文件扩展名,判断是否为jpg、png或gif,由于php版本是5.6.9,所以没办法截断

sql注入

第一处:查看分类update注入

分类->查看分类->修改处:

image-20251022000105896

image-20251022000129536

定位到/admin/category/cate-edit-run.php文件:
image-20251022000218495

这里pic、num、id都是我们可控的且没有过滤,直接注入即可:

1
id=1" and sleep(5)#

image-20251022001637390

第二处:查看分类delete注入

image-20251022002136844

逻辑位于/admin/category/cate-del.php处:
image-20251022002304700

依旧没过滤,单引号闭合:

1
id=1' and sleep(5)#

image-20251022002544946

第三处:新增分类insert注入

image-20251022002651714

定位到/admin/category/cate-add-run.php文件:
image-20251022002807714

1
id=nC5vNLGQ8E",database(),1,1)#

image-20251022003620821

image-20251022003527679

第四处:文章修改update注入

定位到/admin/article/article-edit-run.php
image-20251022003921725

image-20251022004356305

第五处:文章删除delete注入

定位到/admin/article/article-del.php

image-20251022004610065

image-20251022004726384

第六处:新增文章insert注入

定位到/admin/article/article-add-run.php

image-20251022004923713

image-20251022012634601

image-20251022012654589

第七处:普通用户写评论insert注入

定位到/resource/enteranswer.php处:

image-20251022010514142

image-20251022013047433

image-20251022013117475

第八处:普通用户点赞处update注入

定位到/resource/addgood.php:

image-20251022013406964

第九处:删除评论处delete注入

定位到/admin/article/article-chat-delete.php
image-20251022013708608

第十处:修改用户密码update注入

定位到/admin/user/user-move-run.php

image-20251022014013326

第十一处:删除用户delete注入

定位到/admin/user/user-del.php

image-20251022014110992

越权

水平越权

定位到/admin/user/user-move-run.php方法

image-20251022015454601

这里并没有对cookie做任何的验证,即用户能够修改任意用户的密码:

image-20251022015700072

垂直越权

同理,定位到/admin/admin_user/run-movepass.php
image-20251022020006227

在修改管理员密码时同样未对cookie进行任何检验:

image-20251022020056650

任意目录删除

在插件处存在任意文件删除:

image-20251022020236676

定位到/admin/function/plugin-del.php方法:

image-20251022020538868

这里在删除目录时并没有对我们的id作任何的过滤,那我们就能通过路径穿越实现任意目录删除,比如删除admin目录:

1
id=../admin

登录逻辑绕过

定位到/resource/runlogin.php
image-20251022103223139

这里会对密码进行验证然后设置cookie,但这里是可以绕过的,因为$password11 = md5(sha1(md5($password)));中password可控,而$pa是通过$result$str的查询结果,而$name可控,所以我们可以利用联合注入获取我们可控的password的加密值来绕过:

1
1' union select '021c6cd3a69730ac97d0b65576a9004f'#

image-20251022104126263

image-20251022103948158

这样在检验时由于返回了1的加密值021c6cd3a69730ac97d0b65576a9004f使比较结果为true

image-20251022104314516

成功绕过

管理员用户修改逻辑一样的

XSS

第一处:更新版本XSS

定位到/admin/system/update-run.php

image-20251022105208903

version可控且没有任何过滤,直接XSS:

1
http://127.0.0.1/admin/system/update-run.php?version=<script>alert(1)</script>

image-20251022105249437

第二处:修改用户密码XSS

定位到admin/user/user-move.php

image-20251022110218344

1
http://127.0.0.1/admin/user/user-move.php?username=111"><script>alert(/xss/)</script><"

image-20251022110832153

image-20251025210500234