R0ot's Blog

分享代码,记录生活

0%

SSRF的学习

SSRF简介

SSRF(Server-Side Request Forgery)翻译过来是服务器端请求伪造,一般情况下,SSRF攻击的目标是外网无法访问的内部系统。如果服务器提供了从其它服务器请求数据的功能,攻击者就可以构造恶意的路径,例如,使服务器端向内网其他服务器发起请求,由于请求是由服务端发起的,所以服务端能够成功读取一些隔离文件,然后返回给攻击者,就造成了ssrf攻击

简单来说,利用一个可以发起网络请求的服务器当作跳板来攻击内部其他服务器。

与SSRF有关的协议

如果发现有ssrf漏洞,首先应该尝试有哪些协议可以使用,因为要使服务器发起恶意请求.首先我们得构造恶意的数据包

HTTP/S协议

http全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。https相比http更安全

  1. 参考博客
  2. 协议格式
    因为可能会需要构造数据包,所以必须要先知道数据包的格式

    需要特别注意的是,在http协议中的换行并不是\n,而是\r\n,url编码后是%0D%0A,如果在构造数据包时没有正确换行,数据包将无法解析
    协议头和正文之间的空行一定不能省略,用单独的\r\n表示即可

file协议

File协议主要用于访问本地计算机中的文件,完整的协议格式是file://ip地址/文件目录但是因为ip都为主机ip,所以可以省略成file:///,一般情况下使用此协议读取目录下的敏感文件,如file:///var/www/html/flag.php

gopher协议

gopher协议和http协议很相似,可以进行post或是get请求,有时http/s协议被过滤时,可以使用这个协议进行发请求
gopher协议的格式如下
gopher://ip地址:端口/_TCP/IP数据流例如gopher://127.0.0.1:80/_数据包
使用gopher协议发起请求时需要对数据包进行url编码,但是,我们需要让服务器端进行请求,在传参进入后端时,已经被url解码一次了,要保证数据还是url编码的形式,就要对数据包进行两次编码,在加上gopher协议的协议头
给出一个python脚本进行编码,注意要将编码后的\n换成\r\n

1
2
3
4
5
6
7
8
9
from urllib.parse import quote

first_code =""" """ #这里写入数据包

url_encoded = quote(first_code,safe='')
url_encoded = url_encoded.replace('%0A', '%0D%0A')
url_encoded = 'gopher://127.0.0.1:80/'+'_'+url_encoded
url_encoded = quote(url_encoded,safe='')
print(url_encoded)

过滤绕过

ip过滤绕过

ip转化为其他进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
$r += 4294967296;
}
echo "十进制:";
echo $r;
echo "八进制:";
echo decoct($r);
echo "十六进制:";
echo dechex($r);
?>