漏洞原理---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

七、伪协议

  • 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日
许可协议