这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。
环境准备
一、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_new" value="aaaa" />
<input type="hidden" name="password_conf" value="aaaa" />
<input type="hidden" name="Change" value="改变" />
<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://协议来查询字典服务上的单词定义或其他信息。
示例:
- attacker.com/ssrf.php?url=dict://dict.org:2628/define:test
- 上述请求将在dict.org字典服务上查询单词"test"的定义。
- 如果没有对URL参数进行适当的验证和过滤,攻击者可以构造恶意请求并通过应用程序执行不受信任的操作。
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攻击的目标是访问服务器受限制的资源,可能导致服务器安全问题。
- 针对这两种漏洞,有不同的防御机制可供开发人员采取,以保护应用程序和服务器的安全性。