Rapidcms 1.3.1代码审计
安装
地址:https://github.com/OpenRapid/rapidcms
环境:
- php5.6.9
- Apache2.4.39
- MySQL5.7.26
分析框架
首先看目录结构
是一个无框架的cms,每个目录对应功能:
- admin:后台管理目录,包含管理员登录界面和后台管理功能
- article:文章模块目录,处理文章相关的业务逻辑,文章发布、编辑、删除等功能
- category:分类管理目录。管理文章分类、栏目分类,分类的增删改查操作
- install:系统安装目录,包含CMS的安装脚本和初始化程序
- plugin:插件目录,存放各种功能插件,可以扩展CMS的功能
- resource:资源文件目录,存放CSS、JavaScript、图片等静态资源,前端页面所需的样式和脚本文件
- template:模板目录,存放网站的前端模板文件,可以切换不同的网站主题
- upload:上传文件目录,用户上传的文件存储位置,包括图片、附件等
锁定接口代码文件我们可以通过burp抓包获取:
敏感信息泄露
我们前面安装的时候知道后台入口在/admin,那么我们先从入口动手:
这里包含了../resource/variable.php文件,然后使用file_get_contents读取读取了sql.json文件,然后连接数据库,进而步入登录逻辑代码,sql.json包含数据库的账号、密码等信息,那么我们能否直接访问这个数据库信息呢?
直接访问:
1 | http://127.0.0.1/install/sql-config/sql.json |
存在未授权漏洞
接着我们进入后台跟随其他功能点审计代码
文件上传
第一处:设置图标处
配置中基本配置下面有个上传文件:
上传文件逻辑定位到/admin/config/uploadicon.php:
这里对上传文件类型进行了验证,需要是jpg、gif或者png,但这里是通过文件头检验的,所以我们可以伪造jpg文件头:
1 | GIF89a |
第二处:新增文章处(失败)
文章->新增文章处能够上传图片
上传逻辑定位到/admin/article/upload.php:
这里获取文件扩展名,判断是否为jpg、png或gif,由于php版本是5.6.9,所以没办法截断
sql注入
第一处:查看分类update注入
分类->查看分类->修改处:
定位到/admin/category/cate-edit-run.php文件:
这里pic、num、id都是我们可控的且没有过滤,直接注入即可:
1 | id=1" and sleep(5)# |
第二处:查看分类delete注入
逻辑位于/admin/category/cate-del.php处:
依旧没过滤,单引号闭合:
1 | id=1' and sleep(5)# |
第三处:新增分类insert注入
定位到/admin/category/cate-add-run.php文件:
1 | id=nC5vNLGQ8E",database(),1,1)# |
第四处:文章修改update注入
定位到/admin/article/article-edit-run.php:
第五处:文章删除delete注入
定位到/admin/article/article-del.php:
第六处:新增文章insert注入
定位到/admin/article/article-add-run.php :
第七处:普通用户写评论insert注入
定位到/resource/enteranswer.php处:
第八处:普通用户点赞处update注入
定位到/resource/addgood.php:
第九处:删除评论处delete注入
定位到/admin/article/article-chat-delete.php:
第十处:修改用户密码update注入
定位到/admin/user/user-move-run.php:
第十一处:删除用户delete注入
定位到/admin/user/user-del.php:
越权
水平越权
定位到/admin/user/user-move-run.php方法
这里并没有对cookie做任何的验证,即用户能够修改任意用户的密码:
垂直越权
同理,定位到/admin/admin_user/run-movepass.php :
在修改管理员密码时同样未对cookie进行任何检验:
任意目录删除
在插件处存在任意文件删除:
定位到/admin/function/plugin-del.php方法:
这里在删除目录时并没有对我们的id作任何的过滤,那我们就能通过路径穿越实现任意目录删除,比如删除admin目录:
1 | id=../admin |
登录逻辑绕过
定位到/resource/runlogin.php:
这里会对密码进行验证然后设置cookie,但这里是可以绕过的,因为$password11 = md5(sha1(md5($password)));中password可控,而$pa是通过$result即$str的查询结果,而$name可控,所以我们可以利用联合注入获取我们可控的password的加密值来绕过:
1 | 1' union select '021c6cd3a69730ac97d0b65576a9004f'# |
这样在检验时由于返回了1的加密值021c6cd3a69730ac97d0b65576a9004f使比较结果为true
成功绕过
管理员用户修改逻辑一样的
XSS
第一处:更新版本XSS
定位到/admin/system/update-run.php:
version可控且没有任何过滤,直接XSS:
1 | http://127.0.0.1/admin/system/update-run.php?version=<script>alert(1)</script> |
第二处:修改用户密码XSS
定位到admin/user/user-move.php:
1 | http://127.0.0.1/admin/user/user-move.php?username=111"><script>alert(/xss/)</script><" |

























































