SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造。
一般情况下,我们服务端请求的目标都是与该请求服务器处于同一内网的资源服务,但是如果没有对这个请求的目标地址、文件等做充足的过滤和限制,攻击者可通过篡改这个请求的目标地址来进行伪造请求,所以这个漏洞名字也叫作“服务器请求伪造”。
SSRF漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤
一般的防御措施是对URL参数进行过滤,或者使得URL参数用户不可控,但当过滤方法不当时,就存在Bypass的不同方式
1、可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
2、攻击运行在内网或本地的漏洞程序(比如溢出);
3、可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
4、攻击内网或外网有漏洞的Web应用;
5、使用file://协议读取本地文件(或其他协议)
1)分享:通过URL地址分享网页内容
2)转码服务
3)在线翻译
4)图片加载与下载:通过URL地址加载或下载图片
5)图片、文章收藏功能
6)未公开的api实现以及其他调用URL的功能
7)从URL关键字中寻找(wap,share,url,link,src,source,target,u,3g,display,sourceURl,imageURL,domain)
• 禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
• 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
• 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
• 设置URL白名单或者限制内网IP
• 限制请求的端口为http的常用端口,或者根据业务需要治开放远程调用服务的端口
• catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务


进来后发现 它使用的url读取文件
注:如果这里使用的带端口域名进行访问,则url后面也要跟上相关域名才能正常访问。
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中被引入。
file:/// – 本地文件传输协议,主要用于访问本地计算机中的文件
dict:// – 字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628
sftp:// – SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol)
ldap:// – 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议
tftp:// – 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机
gopher:// – 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前
尝试查看为本地文件C:\Windows\System32\drivers\etc\hosts的内容
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///C:\Windows\System32\drivers\etc\hosts

当在同一个内网中可以通过ftp协议进行读取对方ftp目录下的文件,前提开启了ftp服务
如果192.168.171.131这台pc可访问另一台pc(比如192.168.171.128)上的ftp服务,就可以通过这个ssrf漏洞结合ftp协议阅读ftp目录下的内容。
先在192.168.101.128上起一个ftp协议(可以用wftpd32搭建ftp服务器),新建用户,用户名和密码都是kaka,目录也要设置一下



然后Done就创建成功了
查看是否成功创建


192.168.171.128的pc中创建txt文件并且上传到ftp

为文件路径在属性中查看

在命令行中输入地址上传
使用命令lcd C:\Users\User\Desktop,并且使用dir查看ftp目录的文件

补充 上传文件
单文件上传:ftp>put name.txt多文件上传:ftp>mput *.txt (上传目录下所有.txt文件),多文件上传需要将交互模式设置为关,使用命令:ftp>prompt
上传好文件后然后用另外一台虚拟机,输入payload获取
?url=ftp://kaka:kaka@192.168.171.128/1.txt

?url=dict://192.168.171.128:21

利用这个我们可以使用burpsuit中的Intruder模块对0-65535端口进行爆破,来查看目标主机开放了那些服务。


同之前一样,但是题目提示我们使用file_get_content()函数
file_get_content()函数 【菜鸟教程文档】
1、file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
2、语法:file_get_contents(path,include_path,context,start,max_length)
与url一样的目的是为读取文件,不同的是它可以更加细致的读取文件
?file=file:///C:windows/win.ini

php伪协议中可以通过php://filter来读取文件源码,比如我们想读取WWW目录下中的inclue.php文件,需要跨三层目录。
php://filter/read=convert.base64-encode/resource=../../../hh.php

对获取到的编码进行base64解码

通过phpstudy在192.168.171.128的pc上搭建了一个http服务,并在服务器写入了一个1.txt的文件,文件内容为kaka


同之前的一样
但是我并没有获取到,但是原理是一样的。
192.168.171.131 pc

192.168.171.128 pc

同之前来看我们访问的地方不同多了/,后续我会查看。但是应该是会出结果的