一、SSRF漏洞
1.xml回顾
2. SSRF的定义
1)例题#curl函数使用示例
- 代码示例:
ch=curlinit();curlsetopt(ch = curl_init(); curl_setopt(ch=curlinit();curlsetopt(
ch, CURLOPT_URL,
url);curlexec(url); curl_exec(url);curlexec(
ch);
curl_close(
ch); }
url =
GET[′url′];curl(_GET['url']; curl(GET[′url′];curl(
url);
?>
- **功能**: 该代码通过curl函数访问由GET请求参数`url`指定的URL。 2)引起的SSRF漏洞的函数 <timestamp>414000</timestamp> - curl_exec - **作用**: 执行cURL会话,可能发起对外部资源的请求。 - **风险**: 如果未对输入的URL进行过滤,可能导致SSRF漏洞。 - file_get_contents <timestamp>424000</timestamp> - **作用**: 将整个文件读入一个字符串。 - **风险**: 可读取本地或远程文件,若未对路径进行限制,可导致SSRF漏洞。 - fsockopen <timestamp>446000</timestamp> - **作用**: 打开一个网络连接或Unix套接字连接。 - **风险**: 可用于发起网络连接,若未对目标地址进行验证,易引发SSRF漏洞。 3)协议 <timestamp>491000</timestamp> - **支持协议**: - **file协议**: 用于查看文件。 - **dict协议**: 用于探测端口。 - **gopher协议**: 可用于反弹shell。 4)SSRF定义 <timestamp>671000</timestamp> - **定义**: SSRF(Server-Side Request Forgery)服务器端请求伪造,是一种由攻击者构造形成由服务端发起请求的安全漏洞。 5)危害 <timestamp>806000</timestamp> - **危害**: - **扫描资产**: 可探测内网端口和服务。 - **获取敏感信息**: 访问服务器本地文件或敏感数据。 - **攻击内网服务器**: 绕过防火墙,攻击内网其他服务器。 - **访问大文件**: 造成服务端内存溢出,导致服务崩溃。 - **通过Redis写入WebShell或建立反弹连接**: 利用Redis等服务提升权限或建立持久化控制通道。 二、知识小结 | 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 | | :--: | :--: | :--: | :--: | | **SSRF漏洞定义** | 服务端请求伪造漏洞,攻击者构造的由服务端发起请求的安全漏洞 | SSRF与CSRF的区别,SSRF是服务端发起请求,CSRF是跨站请求伪造 | ★★★ | | **SSRF漏洞发生原因** | 服务端提供了从其他服务器读取数据的功能,且未对读取地址进行过滤 | 理解服务端为何会发起对其他资源的请求,以及过滤机制的重要性 | ★★★★ | | **SSRF漏洞利用方式** | 扫描资产、获取敏感信息、攻击内网服务器、造成服务端内存溢出、利用gopher协议攻击等 | **如何构造payload进行利用,以及不同利用方式的适用场景** | ★★★★★ | | **SSRF漏洞防御方法** | 未直接提及,但可通过输入验证、限制访问资源、使用安全的库等方法进行防御 | **防御方法的全面性和有效性,以及如何根据具体情况选择防御策略** | ★★★★ | | **CURL函数与SSRF** | CURL函数是PHP中可能导致SSRF漏洞的典型函数 | 理解CURL函数的作用,以及为何它会导致SSRF漏洞 | ★★★ | | **其他可能导致SSRF的函数** | file_get_contents、fsockopen等 | **识别代码中可能导致SSRF的其他函数,并理解其工作原理** | ★★★ | | **SSRF支持的协议** | HTTP、HTTPS、FTP、FILE、DICT、GOPHER等 | **不同协议在SSRF漏洞中的利用方式和风险** | ★★★★ | | **DICT与GOPHER协议的理解** | DICT用于搭建在线字典服务,但可强行读取TCP协议内容;GOPHER是信息查找系统,已较少使用 | **理解这两个协议的工作原理,以及它们在SSRF中的特殊作用** | ★★★★★ |
一、SSRF常见场景
1. 社会化分享功能
- 定义: 社会化分享功能允许用户将网页内容分享到多个社交平台。
- 作用: 增加网站访问流量,方便用户分享精彩内容。
- 实现方式: 通过代码读取文章标题、介绍等内容,形成分享格式。
- 风险: 如果代码解析目标网址时未做限制,可能导致SSRF漏洞。
2. 转码服务
- 定义: 转码服务将不适配手机浏览的网页内容转换为适合手机浏览的格式。
- 提供方: 搜索引擎公司、浏览器厂商等。
- 实现方式: 解析网页地址,重新排版内容。
- 风险: 转码过程中解析目标网址可能导致SSRF漏洞。
3. 在线翻译
- 定义: 在线翻译服务可将网页内容从一种语言翻译成另一种语言。
- 提供方: 有道翻译、百度翻译等。
- 实现方式: 解析网页地址,提取内容并翻译。
- 风险: 解析目标网址以提取内容的过程可能导致SSRF漏洞。
4. 图片加载/下载功能
- 定义: 图片加载/下载功能允许用户上传或加载图片到服务器。
- 实现方式: 支持本地上传和远程图片链接上传。
- 风险: 远程图片链接上传时,解析图片地址可能导致SSRF漏洞。
5. 图片/文章收藏功能
- 定义: 图片/文章收藏功能允许用户收藏网页内容或图片。
- 实现方式: 解析收藏内容的地址,提取并保存内容。
- 风险: 解析目标网址以提取内容的过程可能导致SSRF漏洞。
6. 网站采集、网站抓取
- 定义: 网站采集、抓取功能允许用户输入网址,抓取网页内容并保存到本地或数据库。
- 实现方式: 解析目标网址,抓取内容。
- 风险: 解析并抓取目标网址内容的过程可能导致SSRF漏洞。
7. 实际案例
1)Wordpress 3.5.1以下版本
- 漏洞: xmlrpc.php中的pingback功能存在SSRF漏洞。
- 影响版本: Wordpress 3.5.1以下版本。
2)discuz!的SSRF
- 漏洞: 利用php的header函数绕过限制,通过302跳转实现协议转换,导致SSRF漏洞。
- 影响版本: 多个版本。
3)weblogic的SSRF
- 漏洞: weblogic中的某个功能存在SSRF漏洞。
- 验证方法: 通过提交地址并观察访问情况来验证漏洞是否存在。
- 影响版本: weblogic 10.3.6等版本。
二、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
SSRF漏洞概述 | 只要是网页或服务器代码读取/加载了其他地址内容,就可能导致SSRF漏洞 | SSRF漏洞产生条件 | ★★★☆☆ |
社会化分享功能 | 网站提供分享按钮,通过代码读取文章标题、介绍等内容并分享 | 分享功能需解析目标网址,易导致SSRF | ★★★★☆ |
转码服务 | 搜索引擎或浏览器厂商提供的手机网页适配服务 | 转码需解析并重新排版网页,存在SSRF风险 | ★★★☆☆ |
在线翻译服务 | 如有道翻译、百度翻译,可翻译整个网页内容 | 翻译需解析网址内容,易导致SSRF | ★★★★☆ |
在线图片加载/下载 | 网站支持上传远程图片,即读取远程机器图片 | 远程图片上传功能易导致SSRF | ★★★☆☆ |
图片/文章收藏功能 | 内容管理Web服务可收藏用户提供的地址,并解析内容 | 收藏功能需解析地址,存在SSRF风险 | ★★★☆☆ |
网站采集功能 | 用户输入地址,网站帮其抓取内容并保存 | 采集功能需抓取其他地址内容,易导致SSRF | ★★★★☆ |
实际案例分析 | WordPress 3.5.1以下版本SSRF漏洞、Discuss多个版本SSRF漏洞、WebLogic 10.3.6 SSRF漏洞 | 漏洞发现、验证及利用过程 | ★★★★★ |
一、发现SSRF漏洞
1. 检测思路
- 爬取地址: 首先需要爬取目标网站的所有请求地址或抓取通信数据,检查是否存在URL参数请求其他地址资源的情况。
- 分析请求: 重点分析是否存在社会化分享、WAP转码等可能包含SSRF漏洞的关键字请求。
2. Google语法搜索
- 关键词列表: 可使用share, wap, url, link, src, source, target, u, 3g, display, sourceURL, imageURL, domain等关键词进行搜索。
- 内部代码审计: 对于公司内部代码,可搜索特定语言的危险函数,如PHP的file_get_contents(), fsockopen(), curl_exec()等。
3. 检测工具
1)ssrf-testing
- 功能特点:
- 提供多种绕过技术:包括@符号绕过、302跳转绕过等
- 支持DNS攻击:利用DNS解析特性进行攻击
- 编码绕过:使用句号代替点、序号编号代替IP等技巧
- 协议支持:可攻击FTP、SMTP、Redis等服务
2)Gopherus
- 支持服务: MySQL(3306)、PostgreSQL(5432)、FastCGI(9000)、Memcached(11211)、Redis(6379)、Zabbix(10050)、SMTP(25)
- 安装使用:
3)SSRFmap
- 攻击模块:
- Redis RCE
- Github Enterprise RCE
- 云服务元数据读取
- FastCGI RCE
- Zabbix RCE
- MySQL命令执行
- Docker信息泄露
4. 靶场实践
1)Pikachu靶场
- 漏洞利用:
- 使用curl_exec()或file_get_contents()函数测试
- 可探测内网端口:如3306(MySQL)、80(HTTP)等
- 文件读取:通过file协议读取系统文件如/etc/passwd
- 源码泄露:使用php://filter读取PHP文件源码
2)实际攻击案例
- 端口探测: 通过dict协议探测内网服务
- 文件读取: 使用file协议读取系统文件
- 源码泄露: 使用filter读取PHP文件
5. 防御措施
- 禁用协议: 限制只允许HTTP/HTTPS协议
- 端口限制: 只允许访问业务需要的端口
- 白名单机制: 设置可访问的URL白名单
- 信息过滤: 过滤返回的敏感信息
- 统一错误: 使用统一的错误信息,避免信息泄露
二、SSRF漏洞的防御
1. 禁用协议
- 协议限制原则:根据接口实际用途严格限制允许的协议类型,如仅允许HTTP/HTTPS协议
- 禁用高危协议:明确禁止使用dict/gopher/FTP/file等可能引发安全风险的协议
- 防御效果:可有效防止攻击者利用非常规协议进行内网探测或攻击
2. 限制请求端口
- 端口白名单:仅开放业务必需的端口(如80/443/8080等Web服务端口)
- 典型限制:禁止访问数据库端口(3306)、Redis端口(6379)等敏感服务端口
- 实现方式:在代码中设置端口范围检查逻辑,拦截非常规端口请求
3. 设置URL白名单
- 精确控制:限定只能访问指定的目录或特定地址资源
- 实现要点:
- 维护合法的目标地址列表
- 请求时进行严格匹配验证
- 对不符合的请求立即阻断
- 优势:可精确控制资源访问范围,避免越权访问
4. 过滤返回信息
- 响应控制:即使请求成功,也要对返回内容进行严格过滤
- 过滤策略:
- 只返回预期类型的内容(如图片接口仅返回图片数据)
- 屏蔽敏感文件内容(如/etc/passwd等系统文件)
- 过滤协议交互信息(如Redis协议响应)
- 防御深度:作为最后一道防线,减少信息泄露风险
5. 统一错误信息
- 信息封装:对服务端错误信息进行统一标准化处理
- 实现要点:
- 避免暴露系统细节(如MySQL错误、端口信息等)
- 使用通用错误提示替代具体技术细节
- 记录详细错误日志到安全通道
- 典型案例:需要隐藏类似"3306"这样的数据库端口报错信息
- Redis攻击防范:特别防范通过SSRF对Redis服务的攻击(后续会有专门课程讲解)
三、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
SSRF漏洞原理 | 通过构造恶意URL参数,诱导服务器访问内部或第三方资源 | 协议滥用(如dict://、file://)、端口探测 | ⭐⭐⭐⭐ |
漏洞检测方法 | 1. 爬取站点请求地址分析URL参数; 2. Google语法搜索inurl:关键字; 3. 代码审计(如PHP的curl_exec、file_get_contents) | 关键函数识别:PHP中高危函数列表 | ⭐⭐⭐ |
利用工具 | SSRF Testing(1.7k★):绕过防御payload集; Gopherus(1.6k★):针对MySQL/Redis等7类服务的攻击; SSRFmap(1.5k★):多协议自动化攻击 | 工具对比:扫描型(SSRF Proxy)vs 利用型(Gopherus) | ⭐⭐⭐⭐ |
实战案例 | 1. 读取本地文件(file:///etc/hosts); 2. 端口扫描(dict://127.0.0.1:3306); 3. 源码泄露(Base64编码读取PHP文件) | 靶场环境:Pikachu漏洞演示(CURL/文件读取) | ⭐⭐⭐⭐ |
防御方案 | 1. 禁用非必要协议(如gopher); 2. 限制请求端口(仅开放80/443); 3. URL白名单校验; 4. 响应内容过滤; 5. 统一错误信息封装 | Bypass风险:特殊字符(@#?)、DNS重定向、进制/IP编码 | ⭐⭐⭐⭐ |