Pikachu靶场之SSRF服务器端请求伪造

SSRF漏洞介绍

什么是SSRF漏洞

SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。

SSRF漏洞原理

SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

SSRF漏洞利用手段

  • 可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
  • 攻击运行在内网或本地的漏洞程序(比如溢出);
  • 可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
  • 攻击内网或外网有漏洞的Web应用;
  • 使用file://协议读取本地文件(或其他协议)

SSRF漏洞防御手段

  • 禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
  • 过滤返回信息,验证远程服务器对请求的返回结果,是否合法
  • 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
  • 设置URL白名单或限制内网IP
  • 限制请求的端口为http的常用端口,或者根据业务需要开放远程调用服务的端口
  • catch错误信息,做统一的错误信息,避免黑客通过错误信息判断端口对应的服务

SSRF漏洞常见出现点

  • 分享:通过URL地址分享网页内容
  • 转码服务(通过URL地址把原地址的网页调优,使其适合手机屏幕的浏览)
  • 在线翻译
  • 图片加载与下载:通过URL地址加载或下载图片
  • 图片、文章收藏功能
  • 未公开的API实现及调用URL的功能
  • 从URL关键字中寻找

第一关 SSRF(curl)

第一关进入后如图所示,按照提示点击下图红框里面的连接。
在这里插入图片描述
然后就得到了下图红框里带参数的url,参数名是url,参数值是一个url。

在这里插入图片描述
注:如果这里使用的带端口域名进行访问,则url后面也要跟上相关域名才能正常访问。

由于这关题目所说使用curl函数,所以根据菜鸟教程中的文档介绍

PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
PHP中使用cURL实现Get和Post请求的方法
这些函数在PHP 4.0.2中被引入。

1.file协议查看本地文件

输入payload:

http://www.pikachu.com:90/vul/ssrf/ssrf_curl.php?url=file:///c:/windows/system32/drivers/etc/hosts

可以查看文件C:\Windows\System32\drivers\etc\hosts的内容
在这里插入图片描述

2.ftp协议查看内网ftp服务器上的文件

再来看一个ftp协议。

如果192.168.171.128这台pc可访问另一台pc(比如192.168.171.130)上的ftp服务,就可以通过这个ssrf漏洞结合ftp协议阅读ftp目录下的内容。

先在192.168.101.130上起一个ftp协议(我用的wftpd32,挺方便),新建用户,用户名和密码都是caker,目录也要设置一下

在这里插入图片描述
设置完后点击Done。
然后在桌面写入一个2.txt文件上传到ftp服务器上
在这里插入图片描述
1.登录ftp服务器
ftp 192.168.171.130
在这里插入图片描述
2.进入到待上传文件的本地目录
命令ftp>lcd C:\User\caker\Desktop
在这里插入图片描述
在这里插入图片描述
输入命令:ftp!dir可以查看本地目录中的文件和文件夹
在这里插入图片描述
输入命令:ftp>pwd检查ftp当前目录
在这里插入图片描述
上传文件
单文件上传:ftp>put name.txt

多文件上传:ftp>mput *.txt (上传目录下所有.txt文件),多文件上传需要将交互模式设置为关,使用命令:ftp>prompt
在这里插入图片描述
上传好文件后然后用另外一台虚拟机进行模拟攻击,输入payload

http://192.168.171.128:88/vul/ssrf/ssrf_curl.php?url=ftp://caker:caker@192.168.171.130/2.txt.txt

可以读到内网ftp服务器上的文件内容。(不知道为啥结尾多个1,这么一看,上面file协议读取的文件内容结尾也多个1)
在这里插入图片描述

3.dict协议扫描内网主机开放端口

使用dict协议可以获取内网主机开放端口相应服务的指纹信息,比如内网主机192.168.171.130上开了ftp服务的话,就可以通过payload

http://192.168.171.128:88/vul/ssrf/ssrf_curl.php?url=dict://192.168.171.130:21

获取相关服务信息
在这里插入图片描述
在实际中我们可以通过这个方法,使用burpsuit中的Intruder模块对0-65535端口进行爆破,来查看目标主机开放了那些服务。

代码分析

在这里插入图片描述

第二关 SSRF(file_get_content)

进入第二关还是一个连接,点击看看吧
在这里插入图片描述
同样的流程,同样的套路,又得到一个带参数的链接,参数名file,参数值是个url,或者说,是个文件路径
在这里插入图片描述
根据题目提示我们知道这里使用的是file_get_content()函数,所以我们需要先了解这个函数。

file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

主要用来读取文件的

1.file读取本地文件

一说到读文件首先就想到file协议了,先来试一下payload:

http://192.168.171.128:88/vul/ssrf/ssrf_fgc.php?file=file:///C:windows/win.ini

在这里插入图片描述
读取成功

如果对伪协议不是很了解的话,可以查看我的这篇文章查看相关伪协议命令
文件包含漏洞全面详解

2.php://filter/读取php源代码

php伪协议中可以通过php://filter来读取文件源码,比如我们想读取WWW目录下中的inclue.php文件,需要跨三层目录。
在这里插入图片描述
使用payload:

http://www.pikachu.com:90/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=../../../include.php

得到源码的base64编码
在这里插入图片描述
复制出来之后网上解码
在这里插入图片描述

3.http协议请求内网资源

通过phpstudy在192.168.171.130的pc上搭建了一个http服务,并在服务器写入了一个1.txt的文件,文件内容为hello world。
在这里插入图片描述
然后浏览器输入payload:

http://192.168.171.128:88/vul/ssrf/ssrf_fgc.php?file=http://192.168.171.130/1.txt

成功读取到1.txt的内容
在这里插入图片描述

3.ftp读取内网上传文件

试了下ftp,没有成功
payload和上一关一样

http://192.168.171.128:88/vul/ssrf/ssrf_fgc.php?file=ftp://caker:caker@192.168.171.130/2.txt.txt

在这里插入图片描述
输入后没有反应

到wftpd32的界面对比后发现。这一关的请求发送后比上一关多了一个/,不知道怎么产生的。
在这里插入图片描述

代码分析

源代码如下,这关主要想要告诉我们,使用file_get_contert函数后,肯定能用php://filter伪协议进行一个源码读取,还有就是http服务进行一个内网请求。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46467017/article/details/126456236