CSRF(跨站请求伪造)和SSRF(服务端请求伪造)漏洞复现:风险与防护方法

这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 

环境准备

一、CSRF(跨站请求伪造)

示例:假设用户在银行网站A上登录并保持会话活动,同时他也在浏览其他网站。攻击者在一个不可信任的网站B上创建了一个恶意链接,当用户点击该链接时,会自动向银行网站A发送一个恶意请求,导致执行未经授权的操作,例如转账或更改密码。

攻击相关介绍:

CSRF漏洞指的是攻击者利用受害者的身份,在其不知情的情况下发送恶意请求给目标网站。由于目标网站无法区分恶意请求和正常请求,因此会执行该请求。这使得攻击者能够以受害者的名义执行一些不被授权的操作,例如更改密码、发表言论、转账等。

原理:

        CSRF漏洞的原理在于浏览器的自动提交机制。当用户在目标网站登录后,并保持了有效的身份认证信息(如Cookie),在不退出登录的情况下访问其他网站时,浏览器会自动发送与目标网站相关的请求,而这些请求是由攻击者精心构造的。由于浏览器会自动携带受害者的身份认证信息,目标网站无法区分请求的真伪。

使用方法:

        攻击者通常通过诱导受害者点击恶意链接、访问恶意网站或打开包含恶意代码的邮件等方式来利用CSRF漏洞。一旦受害者在浏览器中执行了攻击者精心构造的请求,攻击就会生效。

使用前提:

  • 受害者必须已经登录并且在目标网站上保持有效的身份认证。
  • 目标网站的请求没有采取预防CSRF攻击的措施。

防御方法:

  • 使用CSRF Token:为每个用户生成一个唯一的令牌,并将其嵌入到表单中,请求验证时校验该令牌。
  • 检查Referer头:服务器端检查请求头中的Referer字段,确保请求来源于合法的网站。
  • 使用验证码:在进行敏感操作之前,要求用户进行验证码验证。
  • 添加随机请求参数:向请求中添加随机生成的参数,使攻击者无法预测和构造合法的请求。
  • 限制用户权限:根据用户的权限级别限制其操作范围,减少潜在危害。

攻击复现

1、打开DVWA的相关靶场

2、查看Burp Suite抓包情况

截取更改密码的请求

3、生成CSRF的PoC

然后更改请求参数

例如:

<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->

<body>
  <script>history.pushState('', '', '/')</script>
  <form action="http://192.168.1.91/dvwa/vulnerabilities/csrf/">
    <input type="hidden" name="password&#95;new" value="aaaa" />
    <input type="hidden" name="password&#95;conf" value="aaaa" />
    <input type="hidden" name="Change" value="æ&#148;&#185;å&#143;&#152;" />
    <input type="submit" value="Submit request" />
  </form>
</body>

</html>

4、最后就是诱导受害者点击打开我们的攻击脚本的链接

不过我这里是测试就直接在浏览器打开脚本

复现成功,其他类型的攻击方式操作也是这样。 

二、SSRF(服务端请求伪造)

示例:攻击者通过在受害服务器上构造恶意请求,使其尝试访问内部资源或第三方服务。例如,攻击者可以构造一个请求,要求目标服务器读取敏感文件并将其内容返回给攻击者,从而获取敏感信息。

攻击相关介绍

介绍:

        SSRF漏洞指的是攻击者通过操纵目标Web应用程序中的请求来发起伪造请求。攻击者利用这种漏洞可以访问应用程序所在服务器上的本地资源,或者攻击内部网络中的其他系统,并执行恶意操作。

原理:

        SSRF漏洞的原理在于目标Web应用程序对外部资源的访问没有进行充分的过滤和验证。攻击者通过构造特定的请求,可以控制目标服务器向任意的内部或外部资源发起请求。这使得攻击者能够访问未授权的资源、窃取数据或发起其他恶意操作。

使用方法:

        攻击者通常通过向目标Web应用程序提交包含特殊URL的请求来利用SSRF漏洞。这些URL可能指向内部系统的地址、本地文件、外部服务器等。一旦目标应用程序未能正确过滤或验证这些URL,并将其用于发送请求,攻击就会生效。

使用前提:

  • 目标Web应用程序存在SSRF漏洞,未对外部资源的访问进行充分的验证和过滤。
  • 攻击者能够向目标应用程序提交恶意请求,并控制或影响请求中的参数。

防御方法:

  • 输入验证和过滤:对用户输入的URL进行严格的验证和过滤,确保请求的目标是合法的。
  • 白名单限制:限制目标URL只能访问特定的合法域名或IP地址,避免访问不受信任的资源。
  • 特权分离:降低应用程序对内部资源的访问权限,仅允许访问必要的资源。
  • 使用代理服务:通过使用代理服务器来隔离应用程序与外部资源之间的联系,限制请求的范围。
  • 加强访问控制:对敏感资源进行严格的访问控制,确保只有授权用户才能访问。

造成SSRF漏洞的常见函数

fsockopen():

  • fsockopen()函数用于打开一个网络连接,并返回一个文件指针。它可以用于与远程服务器进行通信,包括发起请求和获取响应。 

file_get_contents()

  • file_get_contents()函数用于读取文件的内容,并将其作为字符串返回。它可以用于获取远程文件的内容,包括通过URL获取内容。

curl_exec():

  • curl_exec()函数用于执行一个CURL会话,并返回执行结果。它可以用于发送HTTP请求,并获取响应。

在SSRF漏洞中,以下协议有不同的作用: 

dict://协议:

  • dict://协议用于访问字典服务(DICT)。
  • 攻击者可以使用dict://协议来查询字典服务上的单词定义或其他信息。

示例:

file://协议:

  • file://协议用于访问本地文件系统。
  • 攻击者可以使用file://协议来读取服务器上的文件,包括敏感文件或配置文件。

示例:

  • attacker.com/ssrf.php?url=file:///etc/passwd
  • 上述请求将尝试读取位于目标服务器上的/etc/passwd文件。
  • 如果应用程序没有正确限制文件协议的使用,攻击者可以访问和下载任意文件,导致信息泄露或系统安全受到威胁。

gopher://协议:

  • gopher://协议是一个早期的互联网协议,用于在客户端和服务器之间传输文本数据。
  • 攻击者可以使用gopher://协议来执行各种操作,如查询目录、读取文件等。

示例:

  • attacker.com/ssrf.php?url=gopher://example.com:70/_
  • 上述请求将尝试使用gopher协议连接到example.com的70端口。
  • 如果应用程序不对协议进行正确过滤和验证,攻击者可以利用gopher协议在目标服务器上执行未经授权的操作。

攻击复现

存在SSRF的脚本

将脚本存放在本地的phpStudy下的WWW目录下

<?php
$url = $_GET['url'];
$response = file_get_contents($url);
echo $response;
?>

解释:

这个脚本存在SSRF漏洞。原因在于它没有充分验证和过滤用户输入的URL参数$_GET['url'],攻击者可以通过构造恶意的URL参数,将请求发送到应用程序不受信任的目标地址上。

具体来说,攻击者可以通过向URL参数中添加如下payload,来进行SSRF攻击:

  • 添加错误的IP地址,以绕过IP地址验证
  • 添加危险的协议,如file://,以访问本地文件系统
  • 添加内网主机的IP地址或域名,以访问内部的敏感资源
  • 指定重定向URL,以执行钓鱼等攻击

举例来说,如果攻击者向URL参数中注入如下payload,就可以将请求发送到不受信任的目标地址上,进而发起一次SSRF攻击: Example Domain

为了防止这种攻击,开发人员必须对用户输入的URL参数进行严格的验证和过滤,确保只允许访问合法、安全可信任的URL。例如,可以使用白名单限制目标URL只能指向安全可信任的域名或IP地址,规避潜在的恶意资源。

file:// 协议
http://127.0.0.1/SSRF.php?url=file:///F:1.txt

复现成功

三、CSRF(跨站请求伪造)与SSRF(服务端请求伪造)漏洞主要区别

攻击对象:

  • CSRF攻击针对的是用户,利用用户已经身份验证的会话来执行未经授权的操作。
  • SSRF攻击针对的是服务器,通过欺骗服务器发起请求来访问内部资源或第三方服务。

目标:

  • CSRF攻击的目标是利用用户的身份和权限执行未经授权的操作,可能导致数据泄露、账户劫持、信息篡改等后果。
  • SSRF攻击的目标是访问服务器受限制的资源,可能导致内部系统暴露、敏感信息泄露、甚至远程命令执行等后果。

攻击方式:

  • CSRF攻击利用受信任用户的会话信息,诱使用户在已验证的网站上执行恶意请求,通过构造特殊的请求来执行攻击
  • SSRF攻击通过构造恶意请求,欺骗服务器发起请求到攻击者指定的目标,利用服务器信任的能力来获取敏感数据或执行其他操作

防御机制:

  • 针对CSRF攻击,常用的防御机制包括使用CSRF令牌验证、验证请求来源(Referer、Origin等)以及双重确认等措施。
  • 针对SSRF攻击,常用的防御机制包括使用白名单验证输入URL、限制访问服务器的网络连接和端口等。

总结:

  • CSRF攻击利用用户身份和会话执行未经授权的操作,而SSRF攻击利用服务器发起请求访问内部资源或第三方服务。
  • CSRF攻击的目标是利用用户权限,可能导致用户账户问题,而SSRF攻击的目标是访问服务器受限制的资源,可能导致服务器安全问题。
  • 针对这两种漏洞,有不同的防御机制可供开发人员采取,以保护应用程序和服务器的安全性。

猜你喜欢

转载自blog.csdn.net/weixin_43263566/article/details/132571542