SSRF 基础介绍

Hello,大家好,好久不见。首先还是碎碎念环节,最近我也有在学 web 安全,也有记笔记,只是好多东西记得乱七八糟,懒得总结,就一直没发博客。

很长一段时间我都在自我怀疑,质问自己为啥还没挖到洞,说实话都有点焦虑了,哈哈。后来我意识到我还是积累的太少,投入的太少。于是我给自己设置了一个一千小时挑战,投入一千小时到 bug hunting,只做事,不问结果。现在过去了小六周了,因为是在下班后才能学会,我只学了九十不到一百个小时,投入的还是有点少呀。

这段时间里,我:

  • 看了五十篇漏洞报告/writeup;
  • 补充了一些基础知识(如 SOP, CSP, HSTS等);
  • 看了下 zseanos 的方法论;
  • 看了篇 Cookie 的论文。不过话说回来,都 4202 年了,CSRF 还是真实存在的嘛?
  • Hacker101 ctf 也拿到了 26 分,HackerOne 上说拿到 26 分会有 private program 邀请,不过我什么邀请也没收到,裂开;
  • 在 BugCrowd 上找了个目标,pinterest(话说有测过这个网站的小伙伴吗),但直到昨天才开始真正 hunting,研究了下修改个人信息模块,报文好多头部看不懂(呜呜)。

另外,我发现现在好多都在用 GraphQL,有人说 GraphQL 是另一个 PHP,遍地黄金,希望能稍稍抓住点机会吧。

其实我每周都会记一下进度,类似下图。如果有小伙伴想追踪我的学习进度或者想要加入这不值一提的小挑战,欢迎评论区留言哦。一个人学挺容易懈怠的。

请添加图片描述

Hack to learn, hacking for fun!


请添加图片描述

1 什么是 SSRF

SSRF,服务端请求伪造,英文全称 Server-side Request Forgery,是 web 服务端漏洞的一种,允许攻击者执行未授权的行为或访问内网服务、敏感数据等。某些情况下,SSRF 也可能升级为 RCE(远程代码执行)漏洞。

OWASP wstg5.0 将 SSRF 也归为注入攻击,原因是其跟 XSS、XXE 注入一样隶属输入有效性验证测试模块。我是持不同意见的,要这么说那 80% 的攻击都算注入攻击?但我没有合适的理由,就,fine 啦。

在 2021 版的 OWASP Top 10 中,SSRF 独占一栏,位列第十,而诸如 XSS、SQLi 等典型的注入攻击全部被包含在 “Injection” 条目中。

请添加图片描述

2 SSRF 原理

SSRF 攻击的核心就一个词:信任关系(trust relationships)。当攻击者使用 URL http://victim.com/admin 直接请求目标服务器的 admin 页面时,由于目标服务器与攻击者之间并不存在信任关系,会提示没有访问权限,访问失败。

倘若借服务器之手发送请求呢?假设该服务器存在 Open Redirect 漏洞或重定向功能,如:http://victim.com/?redirect=http://target.com。通过构造 URL http://victim.com/?redirect=http://localhost/admin,攻击者以 web 服务器的身份请求 http://localhost/admin。由于 victim.comtarget.com 间存在信任关系,target.com 正确响应,响应报文经 victim.com 返回给攻击者,从而执行未授权访问。在这个例子中,victim.comtarget.com 是同一个服务器。

请添加图片描述

3 测试方法

从宏观层面讲,各个漏洞的测试都大差不差,基本都是“三步走”:

  1. 识别 SSRF 注入点
  2. 测试该注入点是否可利用?有无 WAF?绕过?
  3. SSRF 利用:dump 敏感信息或执行其它攻击

3.1 识别注入点

如上所述,SSRF 攻击利用信任关系,借 vulnerable server 之手向其它(内部)服务器发送请求,从而获取敏感信息。所以,识别注入点时可以重点关注该服务器可能与其它服务器 “通信” 的功能模块,如,加载 HTML 页面、重定向等。

So,具体应该怎么做呢?看参数!服务器怎么知道要加载那个页面呢?参数!重定向到哪个 URL 呢?还是参数!下面这个 GET 请求,通过参数 page 将要加载的页面传递给服务器。

GET https://example.com/page?page=about.php

下面我列了几个可能会导致 SSRF 的参数,你可以添加到你的字典里。

url
u
src
endpoint
srcURL
remote_attachment_url
q
link
import_url
images
image[src]
image
id
html
ewsUrl
downloadpath
destination
consumerUri
add_imageurl
dest
redirect
uri
path
continue
url
window
next
data
reference
site
html
val
validate
domain
callback
return
page
feed
host
port
to
out
view
dir
show
navigation

3.2 exploitable?

在找出可能的注入点后,就要判断它是否真的存在漏洞了(废话了属于是)。

How to do? 可以将参数设置成其它 URL,如 https://www.google.com,如果能跳转,也只能说明其可能存在 Open Redirect 漏洞,要判断 SSRF 的话,可以设置成 http://localhost/admin 或其他内部服务器 IP。

GET https://example.com/page?page=http://localhost/admin
GET https://example.com/page?page=http://127.0.0.1/admin

所以为啥不直接测内部 IP?循序渐进啊,循序渐进!要是 https://www.google.com 都给你卡了,也别指望 SSRF 了。再换个角度讲,要是真能找到个 Open Redirect,起码有个保底赏金呀,别到头来白忙活啦,哥们!!!(题外话)

这里可能会涉及到一些 bypass,BUT,SSRF 的 bypass 方式多且杂,有些还有一定难度,我准备后续结合案例慢慢补充。当然,如果你现在就要看,可以先研读下 PayloadAllTheThings

3.3 exploit!& SSRF 危害

这里把利用和危害一并说了,攻击者的“利用” ≈ 受害人的“危害”。

  • 访问未授权页面
GET https://example.com/page?page=http://localhost/admin
GET https://example.com/page?page=http://127.0.0.1/admin
  • 访问本地文件
GET https://example.com/page?page=file:///etc/passwd
  • 访问 cloud metadata,如 AWS 敏感数据
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials
http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE NAME]
  • RCE
  • XSS
  • and so on …

4 举个栗子

老规矩,用 PortSwigger Web Academy 最简单的 lab 举个例子。

网站业务分析,一个线上商城,商品展示,查看商品详情与库存,且有登录页面,但题目并未提供可用用户。

请添加图片描述

首先识别可能的注入点,根据题干,将目标锁定在获取库存模块。点击 “Check stock”,并抓包

请添加图片描述

抓包之后,发现客户端请求报文中包括了一个 API 参数 stockApi ,逻辑可能是后端服务器在收到客户端请求后,不是直接返回结果,而是请求该 API 获取数据并返回。请求链接为: https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fstock.weliketoshop.net%3A8080%2Fproduct%2Fstock%2Fcheck%3FproductId%3D2%26storeId%3D1 URL 解码后是 http://stock.weliketoshop.net:8080/product/stock/check?productId=2&storeId=1

属于服务器与其它后端服务器/ URL 的通信,识别为可疑注入点。

请添加图片描述

思路:修改 stockApi 让服务端请求其他恶意 url 或未授权给用户的接口,如:http://localhost/admin。修改后可以进入 admin 面板,说明该注入点存在 SSRF 漏洞。

请添加图片描述

由于 Repeater 渲染后的页面无法进行其他操作,我们再次抓包,改包,并发送。

请添加图片描述

尝试删除用户 carlos

请添加图片描述

报错提示:“Admin interface only available if logged in as an administrator, or if requested from loopback” 该操作要求管理员登录或者请求来自回环地址(127.0.0.1 或 localhost)。

请添加图片描述

留意一下此时的 url, 也就是说删除用户请求的是这个接口 /admin/delete?username=carlos。我们回到 Repeater 或者再抓一个包,将 stockApi 改为 stockApi=http://localhost/admin/delete?username=carlos,也就是利用 SSRF 执行未授权操作。响应报文也是很配合地重定向到了 /admin 页面,说明删除成功。

请添加图片描述

5 工具

我基本不咋用工具,但还是放几个给有需要的小伙伴吧。

  1. swisskyrepo/SSRFmap
  2. tarunkant/Gopherus

6 参考资料

  1. PortSwigger: Server-side request forgery (SSRF)
  2. Testing for Server-Side Request Forgery
  3. Web安全学习笔记
### SSRF 攻击与 Redis 漏洞及其防御机制 #### 背景介绍 SSRF(Server-Side Request Forgery,服务端请求伪造)是一种允许攻击者诱使应用程序向其控制的目标发送HTTP或其他类型的请求的安全漏洞。当这种漏洞被用来访问内部网络中的资源时,它可能与其他安全问题相结合,比如Redis未授权访问漏洞,从而造成更大的威胁。 #### SSRF 和 Redis 的关联性 SSRF可以作为媒介帮助攻击者实现对内网服务的非法访问,其中就包括Redis数据库。如果Redis配置不当,例如开放公网访问而无身份验证,则容易遭受未授权访问攻击。一旦通过SSRF成功连接到这样的Redis实例,就可以执行各种恶意命令[^1]。 #### 利用过程概述 具体来说,在某些情况下,Discuz!等Web应用可能存在SSRF漏洞,这使得攻击者能够操控目标服务器去发起指向本地或局域网内的任意URL请求。假如该路径恰好指向一台暴露了管理接口却没有任何防护措施的Redis服务器,那么整个链条便形成了完整的攻击面: - **第一步**:找到具有SSRF缺陷的应用程序入口; - **第二步**:构造特定payload让受害主机尝试联系受控下的Redis节点; - **第三步**:在获取权限之后设置定时任务或者其他持久化手段以便后续远程控制[^2]. 以下是基于Python的一个简单示例脚本展示如何模拟这一流程的一部分: ```python import requests url = 'http://vulnerable-app.com/ssrf-endpoint' data = { 'target': 'http://localhost:6379', # Assuming Redis is running on port 6379 without auth. } response = requests.post(url, data=data) if response.status_code == 200: print('Request sent successfully.') else: print(f'Failed to send request. Status code: {response.status_code}') ``` 请注意上述代码仅为教学目的编写,并不应实际应用于任何非法活动之中! #### 防御策略建议 为了有效抵御此类复合型攻击行为的发生,可以从以下几个方面着手加强系统安全性: - 对所有外部输入进行全面校验并限制可接受范围,特别是涉及到URL解析部分更需谨慎处理[^3]; - 关闭不必要的服务端口以及调整默认监听地址至loopback-only模式; - 启用强密码保护机制并对重要操作实施二次确认逻辑; - 定期审查日志文件寻找异常现象及时响应处置. 综上所述,虽然单独存在的SSRF或者弱鉴权状态下的Redis各自带来的风险相对有限,但如果两者结合起来则会形成极具破坏力的组合拳效果。因此企业应当高度重视起基础架构层面的设计合理性同时保持持续监控态势以应对潜在危机状况发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值