目录
CSRF
简介
CSRF,即跨站请求伪造(Cross-Site Request Forgery),是一种常见的 Web 应用程序安全漏洞。
它通常发生在用户在某个信任的网站上保持登录状态,而同时访问了恶意网站的情况下。攻击者利用用户浏览器的自动发送请求功能,诱导用户在不知情的状态下,以其在信任网站上的合法身份执行恶意操作。
CSRF 攻击的特点在于它利用了用户已经通过身份验证的会话,使得服务器误以为是合法用户发起的请求。这些恶意请求可能包括修改用户个人信息、进行转账、发布非法内容等,从而给用户和网站带来严重的损失。
原理
CSRF(跨站请求伪造)的原理可以概括为以下几个关键步骤:
-
用户登录受信任的网站 A,并在浏览器中建立会话,会话信息通常以 Cookie 等形式存储在浏览器中。
-
此时,用户未退出网站 A,会话仍然有效。
-
攻击者在恶意网站 B 上构造一个精心设计的请求,该请求的目标是网站 A 上的某个敏感操作,例如修改密码、转账等。
-
攻击者通过各种手段诱导用户访问恶意网站 B,可能是发送恶意链接、在其他网站上嵌入恶意内容等。
-
当用户访问恶意网站 B 时,浏览器会自动携带网站 A 的会话 Cookie 等认证信息,向网站 A 发送请求。
-
网站 A 的服务器接收到这个请求,由于请求中包含有效的会话信息,服务器误以为这是用户的合法操作,从而执行了攻击者构造的敏感操作。
简单来说,CSRF 利用了用户浏览器在发送请求时自动携带会话信息的特性,以及网站服务器对请求来源验证的不足,使得攻击者能够以用户的身份在用户不知情的情况下执行非法操作。
利用方式
CSRF 主要有以下几种常见的利用方式:
-
更改用户信息:攻击者可以构造请求来修改用户的个人资料,如用户名、邮箱地址、联系电话等。
-
进行资金操作:例如诱导用户进行未经授权的转账、支付、提现等涉及资金的行为。
-
执行恶意操作:比如删除用户的重要数据、发布不良信息等。
-
修改密码:强制更改用户的登录密码,从而获取对用户账户的完全控制权。
-
社交工程诱导:通过发送欺诈性的电子邮件或消息,诱使用户点击包含 CSRF 攻击的链接。
为了防范 CSRF 攻击,网站通常会采用多种安全措施,如添加验证码、验证请求来源、使用令牌等。
防范
为了防范 CSRF 攻击,常见的措施包括:
- 在关键请求中添加验证码,要求用户手动输入,增加攻击的难度。
- 验证请求的来源,通过检查 HTTP 请求头中的 Referer 字段或 Origin 字段来判断请求是否来自合法的源。
- 为每个请求添加不可预测的令牌(Token),服务器端验证令牌的有效性,确保请求是合法的。
SSRF
简介
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种攻击者利用服务端的漏洞,构造请求并让服务端发起请求的攻击方式。攻击者可以控制服务端向其他服务器发送请求,从而达到攻击内网或其他不可直接访问的目标的目的。
SSRF 形成的原因通常是服务端提供了从其他服务器获取数据的功能,但没有对目标地址进行充分的过滤与限制。例如,服务端可能允许用户通过提交 URL 来获取网页内容、加载图片、下载文件等,如果没有对用户提交的 URL 进行严格验证,攻击者就可能构造恶意的 URL 来利用此漏洞。
漏洞场景
以下是一些可能存在 SSRF 漏洞的常见场景:
- 图片加载与下载:通过 URL 加载或下载图片,如果开发者对图片进行了额外处理(如加水印、压缩等),可能导致 SSRF 问题。
- 在线翻译:通过 URL 翻译对应文本的内容。
- 转码服务:将网页内容通过相关手段转为适合手机屏幕浏览的样式。
- 分享功能:通过 URL 分享网页内容,类似于获取 URL 地址中标题以及文本的内容作为显示。
- 未公开的 API 实现以及其他调用 URL 的功能:如某些网站通过 API 获取远程地址的 XML 文件来加载内容,或者类似 360 网站评分等功能。
- 数据收集处:收集用户输入的可能涉及 URL 或 IP 地址的地方。
常见的伪协议及利用方式
一些常见的可用于 SSRF 攻击的函数在不同编程语言中都可能存在,例如 PHP 中的file_get_contents
、fsockopen
、curl_exec
等函数,如果使用不当,可能导致 SSRF 漏洞。
当发现 SSRF 漏洞后,可以测试各种可用的 URL 伪协议来进一步利用该漏洞。
常见的伪协议及利用方式如下:
- file 协议:可用于读取服务器本地的文件。例如,
?url=file:///etc/passwd
(在 Linux 系统中)或?url=file://c:\windows\system32\drivers\etc\hosts
(在 Windows 系统中)。但通常无法读取内网其他机器的文件。 - dict 协议:可以用来探测内网的主机存活与端口开放情况,还能泄漏安装软件的版本信息等。例如,
dict://ip 地址:端口
。不过,该协议不支持换行符,一次只能执行一条命令,不能用于攻击需要交互的应用。 - http/https 协议:通过发送 http 或 https 请求来探测内网主机是否存活。比如,
?url=http://127.0.0.1/flag.php
。由于 get 请求的参数直接加在 url 里,所以可探测那些使用 get 请求即可攻击的内网应用。 - gopher 协议:gopher 协议比较强大,支持发出 get、post 请求,可用于构造各种请求包来攻击内网应用,甚至可用于反弹 shell。但使用时需注意一些细节,例如它会吃掉第一个字符,回车需表示为
%0d%0a
,直接发%0d%0a
可能会出现问题,需编码为%250d%250a
等。
危害
SSRF 攻击的危害包括但不限于:
- 端口扫描:探测内网中其他服务器开放的端口。
- 内网 Web 应用指纹识别:识别内网应用使用的框架、平台、模块以及 CMS 等,为后续的渗透测试提供信息。
- 攻击内网 Web 应用:利用内网安全薄弱点,如溢出、弱口令等,攻击内网应用或本地机器,获取 shell 或其他敏感信息。
- 读取本地文件:通过
file://
协议读取服务器本地的文件。
防范
为了防范 SSRF 攻击,可以采取以下措施:
- 限制协议:仅允许
http
和https
等必要的协议。 - 限制 IP:避免应用被用于获取内网数据或攻击内网。
- 限制端口:将请求的端口限制为
http
常用的端口,如 80、443、8080、8090 等。 - 过滤返回信息:对远程服务器返回的响应进行验证和过滤,防止敏感信息泄露。
- 统一错误信息:避免用户根据错误信息推断出远端服务器的端口状态等信息。
- 严格验证用户输入:对用户提交的 URL 或其他涉及请求的参数进行严格的验证和过滤,确保其符合预期的格式和范围。
- 实施访问控制:对服务端与其他系统之间的通信进行细粒度的访问控制,只允许必要的请求。
在实际应用开发中,需加强对服务端代码的安全审查和测试,及时发现并修复可能存在的 SSRF 漏洞,以降低安全风险。同时,要保持对新的攻击手法和漏洞的关注,不断更新和完善防御措施。
CSRF和SSRF的区别
CSRF(跨站请求伪造)和 SSRF(服务器端请求伪造)虽然都属于安全漏洞,但在以下方面存在明显区别:
-
攻击方向
- CSRF:是从浏览器端(客户端)发起的攻击,利用用户在浏览器中已有的会话和认证信息,诱使用户在不知情的情况下向目标网站发送恶意请求。
- SSRF:是从服务器端发起的攻击,攻击者操纵服务器向其他服务器或内网发起请求。
-
利用对象
- CSRF:针对用户与网站之间的交互。
- SSRF:针对服务器本身的功能和权限。
-
攻击目标
- CSRF:主要用于执行用户权限范围内的操作,如修改用户信息、进行交易等。
- SSRF:可以用于访问内网资源、探测端口、攻击内网服务等。
-
利用难度
- CSRF:相对较容易,通常只需要诱导用户点击恶意链接或访问恶意页面。
- SSRF:需要找到服务器端存在漏洞的功能点,利用难度相对较高。
-
危害范围
- CSRF:一般局限于用户自身的数据和操作权限。
- SSRF:可能对整个服务器所在的内网环境造成较大威胁。
-
防御方式
- CSRF:常见的防御方法包括添加验证码、验证请求来源、使用令牌等。
- SSRF:主要通过限制服务器能访问的地址范围、禁止使用危险协议、严格过滤输入等方式防御。