漏洞原理---SSRF

# SSRF 漏洞

# 一、什么是 SSRF 漏洞

  • Server-Slde Request Forgery:服务器端请求伪造
  • 是一种由攻击者构造特殊形式的请求,并且由指定服务器端发起的恶意请求的一个安全漏洞,由于业务运行的服务器处于内外网边界,并且可通过利用当前这台服务器根据所在的网络,访问到与外部网路隔离的内网应用,所以一般情况下,SSRF 漏洞攻击目标是攻击者无法直接访问的内网系统
  • image-20230128145024760
  • 目标:从外网无法访问到内部系统
  • 原因:由于服务器提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制

# 二、如何挖掘

  • 分享:通过 URL 地址分享网页内容
  • 转码服务:通过 URL 地址把源地址的网页内容调优使其适合手机屏幕浏览
  • 在线翻译:通过 URL 地址翻译对应文本
  • 图片加载与下载:通过 URL 地址下载或加载图片
  • 图片,文章收藏
  • 未空开的 api 实现以及其他调用 URL 功能
  • URL 敏感参数:
    • share
    • wap
    • url
    • link
    • u
    • 3g
    • imageURL
    • domain

# 三、漏洞危害

  • 探测内网资产存活
  • 攻击内网资产:以内网的身份攻击内网
  • 任意文件读取
  • 检查 IP 是否是内网 IP
  • 如果存在漏洞,但是又找不到内网地址情况下 — 直接爆破!!!!

# 四、漏洞函数

# PHP (请求函数):
  • file_get_contents()
  • fsockopen()
  • fopen()
  • curl_exec()
  • curl()
  • read_file()
# JAVA(请求类):
  • imagel
  • HttpClient
  • OKHTTP
  • HTTPRequest

# 五、如何验证:

  • burp 抓包
  • 右键打开图片

# 六、如何绕过对方防御机制

  • 将 IP 地址转化为其他进制 — 黑名单 (http://0/)
  • @符号绕过 — 白名单 http://www.baidu.com@http😕/127.0.0.1
  • 短网址绕过 ----www.dwz.lc
  • 302 跳转绕过
    • 前提是服务器要允许 30x 跳转
    • 如果后端服务器在接收到参数后,正确的解析了 URL 的 host,并且进行了过滤,我们这个时候可以使用 302 跳转的方式来进行绕过。
    • 百度短网址服务,要钱的并且不支持 ip 形式 https://dwz.cn/
    • 这个支持,并且感觉很不错 http://a.topurl.cn/#/
    • (1)、在网络上存在一个很神奇的服务,http://xip.io 当我们访问这个网站的子域名的时候,例如 192.168.0.1.xip.io,就会自动重定向到 192.168.0.1。
    • (2)、由于上述方法中包含了 192.168.0.1 这种内网 IP 地址,可能会被正则表达式过滤掉,我们可以通过短地址的方式来绕过。经过测试发现新浪,百度的短地址服务并不支持 IP 模式,所以这里使用的是 http://a.topurl.cn/#/ 所提供的短地址服务.
    • 这里提一下 302 跳转和 307 跳转的区别,307 跳转回转发 POST 请求中的 数据等,但是 302 跳转不会.
  • DNS 重绑定 (再第二次发起攻击)
    • 使用 DNS 重绑定的前提:

      • 攻击者需要对 DNS 服务器有绝对控制,在上面运行自编的解析服务,使其每次返回的地址均不同
      • 攻击者需要有自己的域名,这个域名绑定了两条 A 记录
      • 将 TTL = 0,防止响应缓存 (一旦缓存,重绑定将无法生效)
    • 重绑定前提是先绑定,触发了之后在重新绑定,绑定的是 DNS 中的解析,解析是 A 记录 (IP 地址)

    • 在该网址中构建请求地址,获得临时域名

      • 防御检测代码会首先请求一次域名,判断 Ip 地址是否是白名单
      • DNS 服务器在收到首次请求的时候,返回允许的 IP 地址
      • 防御检测代码执行后,服务器真正发起 DNS 请求,请求资源,此时 DNS 记录以 0 毫秒的延迟 (TTL=0),修改 IP 地址为 127.0.0.1 达到绕过 SSRF 防护的作用

image-20230128150136439

  • 句号绕过 eg:http://127。0。0。1
  • Enclosed alphanumerics 绕过 (icon 符号)

# 七、伪协议

  • http 协议

    • 传统 HTTP 协议,用于探测端口
    • 可获取文件本身
    • eg: http://www.baidu.com
  • file 协议

    • 读取文件协议,可获取文件中的内容
    • eg: file://C:/window/win.ini
  • dict 协议

    • 字典服务器协议,用于探测端口
    • eg: dict://127.0.0.1:6379/info
    • banner:服务器指纹信息
    • 查看服务器信息
    • ip addre show
    • nc (网络猫):连接网络上的端口
      • apt install netcat
      • yum install netcat
      • kali 中输入 nc IP 地址 端口 ----> 显示服务器指纹信息
  • ftp 协议

  • FTP 文件服务器协议

  • gopher 协议

  • FastCGI 协议

# 八、防御漏洞

  • 限制协议为 HTTP/HTTPS
  • 禁止 30X 跳转
  • 设置 URL 白名单或者限制内网 IP (使用 gethostbyname () 判断是否为内网 IP
  • 服务端开启 OpenSSL 无法交互利用
  • 服务端需要认证交互
  • 把用于取外网资源的 API 部署在不属于自己的机房
  • 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果 web 应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  • 限制请求的端口为 http 常用的端口,比如 80、443、8080、8090
  • 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

# 备注:

  • CTFHub 中 10800 端口是一个映射端口,对应内网中的 80 端口
  • 一个域名扫描后发现开放 80 和 443 端口,此时 80 端口是一个网站,443 端口是另一个网站,只是页面内容看起来是一个网站。
  • 判断操作系统最简单的办法:大小写敏感测试,大写是 Linux 系统

漏洞原理---SSRF
https://rofgd.github.io/2022/03/18/漏洞原理---SSRF/
作者
ReadPond
发布于
2022年3月18日
许可协议