title: ssrf.md
date: 2022-07-02 08:20:45
tags:
ssrf基础知识
ssrf(server-side-request forgery,服务端请求伪造)是一种由攻击者构造请求,由服务器发起请求的安全漏洞,一般情况下,ssrf攻击的目标是外网无法访问的内网系统(因为是由于服务器发起的请求,所以服务器能够请求与自身相连而与外网隔绝的内部系统)。
ssrf的成因
ssrf漏洞形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址进行限制
ssrf种类
显示对攻击者的响应(basic):它显示对攻击者的响应
因此在服务器获取攻击者要求的url后,它将把响应发送给攻击者
发送给客户端,如传送一个url地址 会发挥这个网站的界面或者对应的html代码。
不显示响应(blind):和上面正好相反,不会返回结果到客户端
未从初次请求中获有关目标服务的任何信息
要在这种情况下确认漏洞,攻击者必须使用burp等工具
这些工具可以通过强制服务器向攻击者控制的服务器发出DNS或HTTP请求来确认服务器是易受攻击的。这种ssrf通常易于验证,但难以利用。
semi-ssrf:与blind相似,这种ssrf不会返回相关结果请求的所有详情信息,但是会暴露一些数据。
这可能是部分数据或错误信息,他们为攻击者提供了更多的信息。
有时,关于请求的元数据(例如响应时间)也可以视为Semi-ssrf,因为它们允许攻击者验证请求是否成功。这种ssrf通常足以验证漏洞,但并不总是能够提取敏感数据。
常见的内网ip段
局域网地址范围分为三类,以下ip段为内网ip段
C类:192.168.0.0 - 192.168.255.255
B类:172.16.0.0 - 172.31.255.255
A类:10.0.0.0 - 10.255.255.255
一些知识点
url的格式如下
scheme://user:pass@host:port/path?query=value#fragment
// 其中scheme 可以是gopher dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
当我们发现ssrf漏洞的时候,我们首先要做的事情就是测试所有可用的url伪协议
一些常用的url伪协议
file:/// -- 本地文件传输协议,主要用于访问本地计算机中的文件
dict:// -- 字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628
sftp:// -- SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol)
ldap:// -- 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议
tftp:// -- 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机
gopher:// -- 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前
gopher协议
gopher协议是一个在http协议诞生前用来访问internet资源的协议,可以理解为http协议的前身或者简化版,虽然很古老但现在很多库还支持gopher协议而且gppher协议功能很强大
他可是实现多个数据包整合发送,然后gopher服务器将多个数据包捆绑这发送到客户端,这就是他的菜单相应,比如使用一条gopher协议的curl指令就能操作mysql或者完成对redis的攻击等等
gopher协议使用tcp可靠连接
gopher url格式
gopher://<host>:<port>/<gopher-path>
port默认是70
如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
限制
gopher协议在各个编程语言中的限制
gopher协议格式
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
gopher协议在ssrf中的利用
出现ssrf的地方如果没有对协议,ip,端口这些东西做一些限制,则可以用来探测内网存活的ip及开放的端口、
读取任意文件、 利用phar 协议触发反序列化、攻击内网redis/memcache/mysql 及web 应用fastcgi 或其他服务等等。
这里gopher协议在其中占了很重要的角色
ssrf-lab basics
看一下导致产生ssrf的源码
<?php
// 创建一个新的curl资源
$ch = curl_init();
// set 设置访问的url
curl_setopt($ch, CURLOPT_URL, $_POST["handler"]);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
echo $output;
?>
curl_init()函数
如果他没有对我们输入的url进行一些过滤那么我们就可以攻击一下我们访问不到并且这个服务器可以访问的到的网站
这一关没有对我们输入的url进行任何的过滤
先测试一下http://127.0.0.1
看到利用curl函数产生的ssrf漏洞把网页代码返回给我们了
这里可以用file伪协议来查看本文件
advanced1
<?php
$handler = $_POST["handler"];
if (preg_match('#^https?://#i', $handler) !== 1) {
echo "Wrong scheme! You can only use http or https!";
die();
} else if(preg_match('#^https?://10.0.0.3#i', $handler) === 1) {
echo "Restricted area!";
die();
}
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $_POST["handler"]);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
echo $output;
?>
这里他进行了一些过滤
这里面他也过滤了10.0.0.3地址
来测试一下
Restricted area!
返回这个 就是被过滤了
但是ip地址有很多的表达方式,我们可以用那些表达方式来绕过。
我们先来看看ip地址的表达方式
众所周知ip地址是由四个字节组成的, 一旦包含了小数点,就必须考虑到大小端表示,因为这个会影响IP地址的解析。不过好在所有的网络地址都是大端表示法,只需要注意这一点即可,下面我们介绍IP地址的表达方式。
1 字符串:10.0.0.3
2二进制:00001010 . 00000000 . 00000000 . 00000011
3十六进制 :0A.00.00.03
4整数: 167772163
还可以用0x0A000003表示ip地址
其他常见绕过方法
DNS泛域名
xip.io和xip.name这两个dns泛域名,实现绕过对的方法是,你在你想访问的ip地址后面添加这两个泛域名,这两个域名会从发送的请求中提取真正想访问的ip地址,然后在响应报文中返回
标签:md,ssrf,协议,ip,gopher,攻击者,服务器 From: https://www.cnblogs.com/kkkkl/p/16748387.html