SSRF
目录
简介
SSRF:服务端请求伪造
SSRF常出现在那些获取其他服务器上的资源又对用户的输入过滤不严的WEB应用
像获取网页内容、图片等
?url=
?image=
攻击者通过构造url以及image的参数,利用有SSRF漏洞的服务器发起自己构造的请求
危害
SSRF可以被用来:
1.获取服务器本地敏感文件(如源码、/etc/passwd等)
file://+要读取文件路径
2.探测内网的应用:
如dict://ip:port/info
比如常见的:redis默认的6379端口
用dict://ip:6379/info 根据回显查看是否有redis服务
进而确定是否存在redis未授权之类的漏洞
也可以使用http协议来探测
3.探测内网存活主机以及端口
向某主机某端口发送网络请求,根据响应来判断是否开放
相关函数
能够发起网络请求的一些函数,以php为例
curl_exec() :执行cURL会话
fsockopen():进行套接字连接
file_get_contents():获取指定文件或URL的内容,并将其作为字符串返回
...
...
相关协议
dict
该协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源
dict://ip:port/path
file
file协议用于访问本地文件,不能访问远程文件(远程用FTP协议)
格式:
file:///文件路径
如:file:///c:/flash/cd
这里为什么三个斜杠,而http这些协议都是两个斜杠
因为url格式为:
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
由于file访问本地文件没有host那一部分,所以是三斜杠
而http要有一个主机ip或者域名,所以两个斜杠
file协议不受allow_url_include和allow_url_fopen的影响
gopher
gopher://ip:port/_数据包
gopher数据包要求:
要进行url编码
多个参数要用&隔开
回车换行用%0d%0a
请求数据末尾要加%0d%0a
在http数据包基础上就把%0a变为%0d%0a就可以了
# 该脚本用于构造gopher数据包
# -*- coding: utf-8 -*
import urllib.parse
data = ''#http包
data1 = data.replace('%0A','%0D%0A')#gopher协议要求把http数据的换行符换为%0d%0a,换行符的16进制为0A
data1+='%0D0A'#gopher要求在http数据末尾加%0D%0A
print(data1)
一些绕过方式
对于有过滤的情况
主要还是根据源码中的过滤规则来进行绕过
点号绕过
把ip的.变为句号
127.0.0.1==>127。0。0。1
添加@
比如目标url:?url=http://127.0.0.1
payload:?url=http://666@127.0.0.1
会返回@后面的ip
进制转换
把ip地址进行进制转化(十六进制、八进制等)
xip.io
xip.io 是一个特殊的域名,它可以将 IP 地址映射到域名上。通过在 IP 地址后追加 xip.io,可以直接访问该 IP 地址对应的服务器。
使用xip.io常是在测试过程,因为用这个无需在DNS服务器中配置域名解析
目标url:?url=http://127.0.0.1
payload:?url=http://127.0.0.1.xip.io
短网址
转换为短网址再请求(找在线工具转换)