SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
第一关进入后如图所示,按照提示点击下图红框里面的连接。
然后就得到了下图红框里带参数的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中被引入。
输入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的内容
再来看一个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)
使用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端口进行爆破,来查看目标主机开放了那些服务。
进入第二关还是一个连接,点击看看吧
同样的流程,同样的套路,又得到一个带参数的链接,参数名file,参数值是个url,或者说,是个文件路径
根据题目提示我们知道这里使用的是file_get_content()
函数,所以我们需要先了解这个函数。
file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
主要用来读取文件的
一说到读文件首先就想到file协议了,先来试一下payload:
http://192.168.171.128:88/vul/ssrf/ssrf_fgc.php?file=file:///C:windows/win.ini
如果对伪协议不是很了解的话,可以查看我的这篇文章查看相关伪协议命令
文件包含漏洞全面详解
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
通过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
试了下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服务进行一个内网请求。