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服务进行一个内网请求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。