SSRF 漏洞学习实战

3x05 SSRF 漏洞学习实战

一.ssrf漏洞概念

ssrf(Server-Side request Forgery):服务器端请求伪造。

二.原理

服务端允许从其他服务器上下载图片,读取图片,读取文件,却不对请求的目标url进行过滤和限制。攻击者利用这一特性,以web应用作为代理攻击远程或者本地服务器,。一般来说,ssrf攻击的目标通常都是外网访问不到的内部系统

在这里插入图片描述

三.SSRF漏洞的危害

对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。

  • 攻击运行在内网或本地的应用程序(通过构造payload)。

  • 对内网Web应用进行指纹识别,识别企业内部的资产信息。

  • 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。

  • 利用file等协议读取本地文件等(其他协议:http协议,gopher协议,dict协议)。


四.漏洞检测点

1.使用抓包查看发起的请求url是否由服务端发起,如果是:http://www.xxx.com/a.php?image=地址就很有可能是存在ssrf漏洞

2.文章/图片分享功能,如果有,且没有对超链接进行限制,就很有可能存在ssrf漏洞

3.图片加载/下载功能,如果有,没有对url参数进行过滤,也有可能存在ssrf漏洞

4.文章/图片收藏功能,如果有,没有对文章地址进行过滤,也可能存在漏洞

5.在线翻译

6.转码服务

7.邮件系统服务

五.ssrf漏洞绕过

1.绕过限制为某种域名

如果限制为:http://www.xxx.com,可以使用http基本身份认证绕过的方式,变为:http://www.xxx.com@对应的url

2.绕过限制不为内网网址

1.转化为短网址

2.加上端口:如:http://www.xx.com变为http://www.xxx.com:8080

3.用句号分隔:127.0.0.1改为127。0。0。1

4.采用302跳转

5.进制转换:如将127.0.0.1:八进制:0177.0.0.1;十六进制:0x7f.0.0.1;十进制:2130706433

6.[::]可被解析为http://[::]:80/ 会解析为 http://127.0.0.1

3.绕过限制请求只为http协议

1.使用302跳转

2.采用短地址

六.ssrf漏洞的利用

漏洞利用的相关函数

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

1.相关函数

(1)file_get_contents

把整个文件读入一个字符串中

PHP file_get_contents() 函数详细介绍

(2)fsockopen

打开一个网络连接或者一个套接字连接,返回一个文件句柄

fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据

fwrite:PHP fwrite() 函数

PHP fsockopen函数详解

(3)curl_exec

执行一个curl会话

2.相关协议

(1)file:在有回显的情况下,利用 file 协议可以读取任意内容

(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等

(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

(4)http/s:探测内网主机存活

七.pikachu靶场之ssrf

1.ssrf:curl_exec

我们前文已经知道curl_exec的作用是执行一个curl会话

(1)源码

if(isset($_GET['url']) && $_GET['url'] != null){

   //接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
   $URL = $_GET['url'];
   $CH = curl_init($URL);
   curl_setopt($CH, CURLOPT_HEADER, FALSE);
   curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
   $RES = curl_exec($CH);
   curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
   echo $RES;

(2)

假如生活欺骗了你

作者:普希金

假如生活欺骗了你,
不要悲伤,不要心急!
忧郁的日子里须要镇静:
相信吧,快乐的日子将会来临!
心儿永远向往着未来;
现在却常是忧郁。
一切都是瞬息,一切都将会过去;
而那过去了的,就会成为亲切的怀恋。

当我们点击它时,出现了一首诗,这时的url为url: http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

出现了url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

由此,我们就可以利用这个ssrf漏洞了,由于curl_exec没有进行过滤,我们可以读取我们本地的一些文件,也可以把它链接到任意的url

  • 读取本地文件:http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=file:///文件路径

(注意:需要读取的文件路径及名称最好都是英文)

  • 链接到其他url:http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=你想要链接的url

2.ssrf:file_get_contents

我们前文已经知道:file_get_contents的作用是读取文件

(1)源代码

if(isset($_GET['file']) && $_GET['file'] !=null){
    $filename = $_GET['file'];
    $str = file_get_contents($filename);
    echo $str;
}

(2)我们点击链接后,仍然看到了一首诗

我爱这土地—艾青

假如我是一只鸟,
我也应该用嘶哑的喉咙歌唱:
这被暴风雨所打击着的土地,
这永远汹涌着我们的悲愤的河流,
这无止息地吹刮着的激怒的风,
和那来自林间的无比温柔的黎明……

——然后我死了,

连羽毛也腐烂在土地里面。
为什么我的眼里常含泪水?
因为我对这土地爱得深沉……

此时的url:http://localhost/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php

可以看到,此时的==php?==是file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php

所以,我们也可以利用它来读取我们本地的文件(或者远程文件)http://localhost/pikachu/vul/ssrf/ssrf_fgc.php?file=文件路径

七.ssrf防御

1.禁止一些不常用的协议,只允许访问http/https请求

2.禁止访问内网IP

3.屏蔽返回的详细信息

4.对请求地址设置白名单和黑名单

5.统一错误信息,避免用户可以根据返回的错误信息判断远程主机的端口状态

6.限制请求的端口为常用端口:比如80,443,8080,8090

补充知识

banner:欢迎语的意思,在其中可能包含了一些敏感信息:

  • 软件开发商
  • 软件名称
  • 服务类型
  • 版本号(可以通过版本号来发现已知的漏洞和弱点,这是最重要的)

网络扫描:分为端口扫描和主机扫描

端口扫描:扫描端口是否开启服务

主机扫描:扫描主机是否存活


参考自

文章1

文章2

猜你喜欢

转载自blog.csdn.net/qq_63087425/article/details/125266869
今日推荐