目录
1.CSRF和XSS区别
CSRF(跨站请求伪造)和XSS(跨站脚本攻击)是两种常见的网络安全攻击方式,它们在原理、目标、攻击方式和防御策略上存在显著差异。
1. 原理不
- CSRF:CSRF是一种依赖web浏览器的、被混淆过的代理人攻击。攻击者构造一个请求,诱导用户在当前已登录的网站上执行该请求,由于该请求看起来像是用户自愿发出的,因此网站会执行该请求,导致用户的信息被泄露或进行不期望的操作。CSRF主要利用了网站对用户标识(如cookie)的信任。
- XSS:XSS则是攻击者向目标网站注入恶意的JavaScript代码,当其他用户浏览这些被注入的代码时,恶意代码会在用户的浏览器中执行,从而达到攻击用户的目的。XSS主要利用了网站对用户输入内容缺乏严格的过滤和验证。
2. 目标不同
- CSRF:CSRF的目标主要是冒充用户在站内的正常操作,利用用户对网站的信任,执行不期望的操作,如转账、发送恶意信息等。攻击的目标是用户,但实际上是利用了网站的信任机制。
- XSS:XSS的目标是用户的浏览器,通过执行恶意代码来窃取用户的敏感信息(如cookie、会话令牌等),或者进行其他恶意操作(如重定向到恶意网站、安装恶意软件等)。
3. 攻击方式不同
- CSRF:CSRF攻击通常不需要用户主动点击链接或提交表单,而是可以通过自动加载的页面元素(如IMG标签)来触发GET请求,或者通过JavaScript等脚本语言来模拟用户操作。攻击者需要构造一个看似无害的请求,诱导用户在已登录的网站上执行。
- XSS:XSS攻击则需要攻击者将恶意代码注入到目标网站中,这通常是通过在用户输入的内容中插入恶意代码实现的。当用户浏览这些被注入恶意代码的内容时,浏览器会执行这些代码。
4. 防御策略不同
- CSRF:为了防止CSRF攻击,网站可以采取以下策略:
- 在请求中添加CSRF令牌(token),并确保该令牌在每次请求时都是唯一的且难以预测。
- 验证请求的来源地址,确保请求来自可信的源。
- 使用安全的HTTP头(如
SameSite
cookie属性)来限制cookie的发送范围。
- XSS:为了防止XSS攻击,网站可以采取以下策略:
- 对用户输入的内容进行严格的过滤和验证,确保不会注入恶意代码。
- 使用安全的编码和转义机制来处理用户输入的内容。
- 设置合适的
Content-Type
头部,确保浏览器以正确的方式解析响应内容。
2.CSRF攻击步骤
CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击是一种网络攻击方式,攻击者通过诱导用户在已登录的网站上执行非本意的操作,以此达到攻击目的。
1. 用户登录受信任网站
- 用户C打开浏览器,访问受信任的网站A(如银行网站、社交媒体等),并输入用户名和密码进行登录。
- 网站A验证用户信息后,生成Cookie信息并返回给浏览器。此时,用户C成功登录网站A,可以正常发送请求到网站A。
2. 用户访问恶意网站
- 在用户C未退出网站A之前,在同一浏览器中,用户C打开一个新的标签页或窗口,访问攻击者构建的恶意网站B。
3. 恶意网站发送请求
- 网站B接收到用户C的请求后,返回一些攻击性代码(如HTML表单、JavaScript脚本等)。
- 这些攻击性代码会构造一个请求,要求浏览器访问第三方站点A(即用户C已登录的受信任网站)。
4. 浏览器携带Cookie发送请求
- 浏览器在接收到这些攻击性代码后,会根据网站B的请求,在用户C不知情的情况下,携带网站A的Cookie信息,向网站A发出请求。
- 由于浏览器之前已经认证过网站A,并且Cookie中包含了用户的会话信息,因此网站A会认为这是用户C的合法请求,并据此执行相应的操作。
5. 恶意请求被执行
- 网站A根据用户C的Cookie信息,以C的权限处理该请求,导致来自网站B的恶意代码被执行。
- 攻击者可以借此执行各种恶意操作,如发送邮件、修改账户信息、资金转账等,从而对用户C造成损失。
3.CSRF手工构造POST型页面方法
CSRF(跨站请求伪造)攻击中,手工构造POST型页面是一种常用的攻击手段。
一、明确攻击目标
首先,攻击者需要明确攻击的目标,即哪个网站存在CSRF漏洞,以及希望以哪个已登录用户的身份执行哪些操作。
二、分析请求参数
- 捕获正常请求:使用浏览器开发者工具(如Chrome的DevTools)或抓包工具(如Burp Suite)捕获目标网站的正常POST请求。
- 分析请求参数:分析捕获到的请求,了解哪些参数是必需的,哪些参数是可以被攻击者控制的。特别是那些可能改变服务器状态的参数,如转账金额、接收方账号等。
三、构造表单页面
- 创建HTML文件:使用HTML语言创建一个新的页面文件,该文件将包含一个表单(form)。
- 设置表单属性:
method
属性设置为POST
,以匹配目标网站的请求方式。action
属性设置为目标网站的URL,即存在CSRF漏洞的页面。
- 添加输入字段:根据分析得到的请求参数,在表单中添加相应的输入字段(input)。对于敏感或重要的参数,攻击者可以预设这些字段的值,以执行期望的攻击操作。
- 隐藏表单:为了使攻击更加隐蔽,攻击者可以将表单设置为隐藏(通过CSS样式或JavaScript),或者将表单嵌入到一个看似无害的页面中。
四、添加自动提交机制
- 使用JavaScript:在HTML文件中添加JavaScript代码,以在页面加载时自动提交表单。这可以通过监听
window.onload
事件或设置表单的onsubmit
事件为自动触发来实现。 - 确保隐蔽性:为了使攻击更加难以被用户察觉,攻击者可以确保表单提交时不会跳转到新的页面或显示任何明显的提示。
五、诱导用户访问
- 发送恶意链接:攻击者通过电子邮件、社交媒体、即时通讯工具等方式向目标用户发送包含恶意表单页面URL的链接。
- 利用社会工程学:攻击者可能会使用各种欺骗手段,如伪装成合法网站的链接、声称有重要消息需要查看等,以诱导用户点击链接并触发CSRF攻击。
4.token类CSRF利用方法
Token类CSRF(跨站请求伪造)利用方法主要是基于Token(令牌)的随机性和不可预测性来增强安全性,防止攻击者伪造用户请求。
一、Token的生成与存储
- 生成Token:当用户登录成功后,服务器会生成一个随机且唯一的Token,这个Token通常包含复杂的字符组合,以确保其难以被预测。
- 存储Token:生成的Token会被存储在服务器端的会话(Session)中,同时也会通过某种方式(如Cookie)传递给客户端浏览器,以便在后续的请求中进行验证。
二、Token的传递与验证
- 传递Token:
- 对于GET请求,Token可以作为URL的一个参数传递,如
http://example.com/page?token=xxx
。 - 对于POST请求,Token通常会作为一个隐藏的表单字段(hidden input)包含在表单数据中,如
<input type="hidden" name="token" value="xxx">
。 - 另一种方式是将Token放在HTTP请求头中,通过自定义的HTTP头字段(如
X-CSRF-TOKEN
)传递。
- 对于GET请求,Token可以作为URL的一个参数传递,如
- 验证Token:
- 当请求到达服务器时,服务器会从请求中提取出Token(无论是从URL参数、表单数据还是HTTP请求头中)。
- 然后,服务器会检查这个Token是否与当前会话中存储的Token相匹配。
- 如果Token匹配,服务器会认为这是一个合法的请求,并继续处理;如果不匹配,服务器会拒绝该请求,认为它可能是CSRF攻击。
三、Token类CSRF利用方法的优势
- 随机性和不可预测性:Token的随机性和不可预测性使得攻击者难以伪造有效的Token,从而增加了攻击的难度。
- 与会话绑定:Token与会话绑定,确保了只有当前会话的用户才能使用有效的Token,进一步增强了安全性。
- 灵活性:Token可以通过多种方式传递和验证,可以根据具体的应用场景和需求进行选择,提供了较高的灵活性。
四、注意事项
- Token的保密性:虽然Token是通过客户端传递给服务器的,但应确保Token在传输过程中不被泄露。通常,Token会存储在HTTP请求的加密部分(如HTTPS的加密通道)中。
- Token的时效性:为了提高安全性,Token可以设置一定的有效期。一旦Token过期,用户需要重新登录或进行其他身份验证操作以获取新的Token。
- Token的存储方式:Token在客户端的存储方式也需要注意安全性。例如,避免将Token存储在容易被XSS攻击窃取的地方(如JavaScript变量中)。
5.SSRF常用伪协议
SSRF(Server-Side Request Forgery,服务器侧请求伪造)是一种安全漏洞,攻击者可以利用该漏洞,通过服务器向内部网络或不受信任的系统发起请求,从而获取敏感信息或执行恶意操作。在SSRF攻击中,常用到一些伪协议来构造请求。
- file://:
- 用途:用于从服务器的文件系统中读取文件内容。
- 示例:
file:///etc/passwd
可以读取服务器上的/etc/passwd
文件,该文件通常包含系统用户的账户信息。 - 应用场景:通过读取敏感文件,如配置文件、日志文件等,攻击者可以获取到服务器的内部信息。
- dict://:
- 用途:字典服务协议,用于访问字典资源或进行端口扫描。
- 示例:
dict://ip:6739/info
可以用来查询字典资源或进行简单的网络扫描。 - 应用场景:攻击者可以利用该协议进行端口扫描,以发现内网中开放的端口和服务。
- ftp:// 和 sftp://:
- 用途:FTP(文件传输协议)和SFTP(安全文件传输协议)用于文件的上传和下载,但在SSRF中,它们更多被用于网络端口扫描。
- 示例:通过构造指向不同端口的FTP或SFTP请求,观察响应来判断哪些端口是开放的。
- 应用场景:与dict协议类似,ftp和sftp协议也可以用于端口扫描,但可能效率较低,且不如dict协议直观。
- ldap://:
- 用途:轻量级目录访问协议,用于访问和维护分布式目录信息服务。
- 应用场景:在SSRF中,ldap协议可能被用于探索和利用LDAP服务器的漏洞,但相比其他伪协议,其使用场景较为特定。
- tftp://:
- 用途:简单文件传输协议,用于在局域网中传输文件。
- 应用场景:虽然tftp协议在SSRF攻击中不如其他协议常用,但攻击者仍可能利用它来传输恶意文件或执行其他操作。
- gopher://:
- 用途:分布式文档传递服务协议,在SSRF攻击中被广泛用于构造复杂的请求,如GET和POST请求。
- 特点:gopher协议可以构造出几乎任何类型的HTTP请求,因此其利用范围非常广。
- 应用场景:攻击者可以利用gopher协议来绕过某些安全限制,执行更复杂的攻击操作,如内网渗透、命令执行等。
- http:// 和 https://:
- 用途:超文本传输协议和安全超文本传输协议,用于在Web上传输数据。
- 应用场景:在SSRF中,http和https协议通常被用于构造指向内网资源的URL,以尝试访问内部网络中的敏感信息或执行恶意操作。然而,需要注意的是,直接使用http和https协议进行SSRF攻击可能受到较多限制,因为许多服务器都会对外部请求进行过滤和限制。
6.SSRF pikachu靶场通关
1.SSRF(curl)
点击,读诗:
好,读完诗后尝试修改一下url访问百度:
成功:
也可以用来访问本地文件:
2.SSRF(file_get_content)
照例,读诗:
读后修改一下file后的参数即可,比如再读一读第一关的诗:
或者访问百度:
或者访问本地文件:
7.SSRF靶场通关时根据源代码说明漏洞成因(加分项)
在PHP中,curl_exec()、file_get_contest()等函数若被用来处理用户输入的URL,并且没有进行适当的过滤和校验,就可能成为SSRF漏洞的源头。这些函数能够发起网络请求或读取文件,如果它们接收了未经验证的用户输入,就可能被利用来执行恶意请求。
以pikachu靶场中curl_exec()函数的使用为例,可能存在以下漏洞的源代码:
<?php
$url = $_GET['url']; // 直接接收用户输入的URL
$ch = curl_init($url); // 初始化curl会话
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置curl参数,将结果作为字符串返回
$result = curl_exec($ch); // 执行curl会话
curl_close($ch); // 关闭curl会话
echo $result; // 输出结果
?>
在上述代码中,$_GET['url']直接用于初始化curl_init()函数,而没有进行任何过滤或校验。如果攻击者构造一个恶意的URL(如指向内网服务器的敏感资源),服务器就会向该URL发送请求,并返回请求结果给攻击者。