实习第六天报告(9.2)

目录

知识点

CSRF

概述

原理

攻击方式

攻击步骤

防御方法

Token

与XSS区别

手工构造POST型页面方法

SSRF

攻击特点

攻击目标

攻击常见方式

攻击条件

防御方式

拓展

伪协议

任意域理解

Gopher

Curl

File_get_contents

靶场实战

Pikachu靶场

CSRF(GET)

CSRF(POST)

CSRF Token

SSRF(curl)

SSRF(file_get_content)


知识点

CSRF

概述

CSRF(Cross-Site Request Forgery),也被称为One-Click Attack或Session Riding,即跨站请求伪造攻击。它是一种挟制用户在当前已登录的Web应用程序上执行非本意操作的攻击方法。攻击者可以盗用用户的登录信息,以用户的身份模拟发送各种请求,对服务器来说这些请求是完全合法的,但却完成了攻击者所期望的操作,如以用户的名义发送邮件、消息,盗取账号,添加系统管理员,甚至进行购买商品、虚拟货币转账等。

原理

CSRF攻击的原理主要基于以下几点:

用户信任网站:用户已经登录了某个受信任的网站A,并在本地记录了Cookie。

浏览器自动发送Cookie:在用户没有登出网站A的情况下,如果访问了恶意网站B,而网站B包含了对网站A的恶意请求,用户的浏览器会自动携带网站A的Cookie向网站A发送请求。

网站无法区分请求来源:网站A接收到请求后,由于Cookie是有效的,会根据用户的权限处理该请求,导致恶意操作被执行。

攻击方式

CSRF攻击的方式多种多样,主要包括以下几种:

通过图片标签:攻击者可以在恶意网站中嵌入一个<img>标签,其src属性设置为向目标网站发送请求的URL。当用户访问恶意网站时,浏览器会自动加载这个图片,实际上是向目标网站发送了请求。

通过表单:攻击者可以创建一个隐藏的表单,并通过JavaScript自动提交这个表单,从而向目标网站发送请求。

通过JavaScript的XMLHttpRequest:攻击者可以使用JavaScript的XMLHttpRequest对象直接向目标网站发送请求。

攻击步骤

CSRF(跨站请求伪造)攻击是一种网络攻击方式,攻击者通过诱导用户在已登录的Web应用程序上执行非预期的操作。CSRF攻击的步骤通常可以归纳如下:

1. 用户登录受信任网站:用户通过浏览器打开并登录一个受信任的网站A,如网上银行或电子邮件服务 --> 网站A在用户验证通过后,会生成一个Cookie信息并返回给用户的浏览器,以便之后的请求验证。

2. 用户访问恶意网站:在用户未退出网站A的情况下,用户在同一个浏览器标签页或新开标签页中访问了一个恶意网站B,这个网站由攻击者控制。

3. 恶意网站发送攻击请求:网站B在用户不知情的情况下,通过嵌入的攻击性代码(如隐藏的表单、JavaScript脚本等)构造一个针对网站A的恶意请求,这个请求可能会伪装成用户在网站A上的正常操作,如转账、发送邮件等。

4. 浏览器携带Cookie发送请求:浏览器在接收到网站B的攻击性代码后,会根据这些代码的指示,自动携带网站A的Cookie信息,向网站A发送请求 --> 由于请求中包含了有效的Cookie,网站A会认为这是一个来自用户的合法请求,并按照请求的内容执行相应的操作。

5. 网站A执行恶意操作:网站A在接收到请求后,会根据Cookie中的用户信息执行请求中的操作,如转账、发送邮件等,而这些操作实际上是攻击者通过诱导用户访问恶意网站而间接执行的,用户对此毫不知情。

防御方法

针对CSRF攻击,可以从服务端和客户端两方面进行防御,但主要还是在服务端进行防御。以下是一些常见的防御方法:

验证HTTP Referer字段:HTTP协议中的Referer字段记录了请求的来源地址。通过验证Referer字段,可以判断请求是否来自受信任的源,但这种方法存在一定的局限性,因为Referer字段可以被伪造或禁用。

在请求中添加Token并验证:服务端在生成表单时,会同时生成一个随机的Token(通常是一个加密的字符串),并将其嵌入到表单中,用户提交表单时,Token会随请求一起发送到服务端;服务端在接收到请求后,验证Token的有效性。如果Token不正确或不存在,则拒绝该请求。这种方法比验证Referer字段更安全,因为Token是随机生成的,并且不存储在Cookie中,攻击者难以伪造,但在本次实习中,我们利用BP插件CSRF Token Tracker对Token令牌实现了抓取伪造

同源策略(Same-Origin Policy):浏览器的同源策略可以防止不同源的网页读取对方的Cookie、LocalStorage等敏感数据;因此,确保Web应用只处理来自同源请求的数据,可以在一定程度上减少CSRF攻击的风险。

使用HTTPS协议:通过HTTPS协议进行通信,可以确保请求和响应在传输过程中不被篡改或窃听;虽然HTTPS本身并不能直接防止CSRF攻击,但它增加了攻击的难度和成本。

限制Cookie的作用域:通过设置Cookie的Samesite属性,可以限制Cookie的发送范围,例如,将Samesite设置为Scrict,则Cookie只会在同源请求中发送,从而减少了CSRF攻击的风险。

Token

在CSRF攻击中,Token令牌是主要防御方式之一,其防御方法如下:

验证请求来源的合法性:CSRF攻击的核心在于攻击者能够伪造用户的请求,因为这些请求看起来像是用户自己发送的。我们可以通过在请求中加入一个随机的、不可预测的Token,服务器可以验证请求是否真正来自用户的合法操作,而不是由攻击者伪造的;当用户成功登录系统后,服务器端会随机生成一个Token(令牌),这个Token具有随机性和不可预测性。Token通常与用户的会话(Session)绑定,确保每个用户的Token是唯一的;Token生成后,会被存储在服务器端,通常与用户的Session相关联。同时,Token也会以某种形式(如通过Cookie或直接在表单中)发送给客户端,以便在后续的请求中使用。Token的随机性和不可预测性使得攻击者几乎无法猜测或伪造一个有效的Token,从而大大降低了CSRF攻击的成功率。

确保请求数据的完整性:通过Token的验证机制,服务器可以确保接收到的请求数据在传输过程中未被篡改,从而保护用户数据的完整性和安全性。

实现请求的双重验证:Token验证通常与其他验证机制(如Session验证、Cookie验证等)结合使用,形成多重防护,进一步提升系统的安全性。

避免在Cookie中传输敏感信息:为了防止Token被恶意利用,通常不会在Cookie中直接传输Token。相反,Token可能被存储在Session中,或者通过其他更安全的方式(如HTTPS传输)发送到客户端,在后续的请求中,客户端需要在请求数据或HTTP头信息中携带这个Token。在之后的靶场实战中,Token的传输位置更详细具象

实现自动化防御:服务器端可以设置一个拦截器或中间件来自动验证每个请求中的Token。当请求到达服务器端时,服务器端会提取请求中的Token,并与存储在Session中的Token进行比对。如果Token匹配成功,则认为请求是合法的;如果Token不匹配或不存在,则认为可能是CSRF攻击,从而拒绝该请求,而且为了提高安全性,Token通常会在每次请求后更新,或者在用户重新登录时生成新的Token,这样做可以防止Token被重复使用或泄露后造成的安全风险;而且Token可以设置过期时间,过期后需要重新生成和验证。这有助于减少因Token长时间未更新而可能带来的安全风险。从而实现自动化的CSRF防御,这也是为什么在之后的实战中,若不使用插件CTT,即使我们每次抓包都抓到了Token的值,但服务器仍然拒绝了我们修改密码的请求

灵活适应不同请求类型:无论请求是GET、POST还是其他HTTP方法,Token都可以以适当的方式(如URL参数、表单字段等)被包含在请求中,从而实现对不同请求类型的灵活支持,对于GET请求,Token可以附加在URL的查询字符串中;对于POST请求,Token可以放在表单数据中或通过HTTP头发送。

与XSS区别

CSRF与XSS是两种常见的网络安全攻击方式,虽然名字中都存在“CS”(Cross Site,跨站),但它们在原理、攻击方式、目标和利用手段等方面却大相径庭,区别就在于除“CS”的部分,即“RF(Request Forgery)”和“S”(Script),一个是伪造请求,一个是注入恶意脚本,这是最基本的区别,更多具体的区别如下:

原理不同:CSRF是一种利用网站对用户标识的信任,通过伪造来自受信任用户的请求来攻击受信任网站的恶意利用方式。攻击者通过诱导用户访问一个恶意网站,该网站会发送一个伪造的请求到用户已登录的受信任网站,由于该请求携带了用户的身份认证信息(如Cookie),因此受信任网站会误认为该请求是用户自己发起的,从而执行相应的操作;而XSS则是通过向目标网站注入恶意脚本代码(类似SQLi),当用户浏览该网站时,这些脚本代码会在用户的浏览器中执行,从而达到攻击用户或网站的目的。XSS攻击的核心思想是在HTML页面中注入恶意代码,这些代码可以篡改页面内容、窃取用户信息或进行其他恶意操作。

攻击方式不同CSRF通常不需要用户直接参与,攻击者只需要构造一个恶意的请求链接,并诱导用户点击或自动加载该链接即可。由于该请求看起来像是用户自己发起的(伪造,Forgery),因此很难被用户察觉。XSS:XSS攻击需要攻击者将恶意脚本(Script)代码注入到目标网站的页面中,这通常可以通过留言板、评论区等用户可控的输入点实现。当用户浏览这些页面时,恶意脚本代码会在用户的浏览器中执行。

目标不同:CSRF的目标主要是受信任网站的用户数据或操作权限。攻击者通过伪造请求来执行用户原本不打算执行的操作,如转账、购买商品等;XSS攻击的目标则更加广泛,既可以是用户的数据(如Cookie、Session等),也可以是网站本身的安全性和稳定性。攻击者可以通过执行恶意脚本来窃取用户信息、篡改页面内容或进行其他恶意操作。

 利用手段不同:CSRF主要利用网站对用户身份认证信息的信任。攻击者通过伪造请求来绕过身份验证机制,从而执行恶意操作。XSS:则主要利用网站对输入内容的处理不当。攻击者通过注入恶意脚本代码来破坏网站的输入验证机制,从而在用户的浏览器中执行恶意操作。

手工构造POST型页面方法

CSRF(跨站请求伪造)攻击中,针对POST型请求的手工构造页面方法主要涉及创建一个看似无害的表单(form),但实际上会向目标网站发送恶意POST请求。以下是CSRF手工构造POST型页面的基本步骤:

确定目标:首先,需要明确CSRF攻击的目标网站,然后确定要执行的具体操作(如转账、更改密码等)。了解这些操作通常通过哪些POST请求完成,以及这些请求中包含了哪些关键参数。

构造表单:根据目标网站的POST请求格式,构造一个HTML表单(form),并根据需要调整表单的Content_type,表单中action指向的URL和目标POST请求的URL需要完全匹配,method属性设置为POST。

<form action="http://www.cqupt.edu.cn/***" method="POST"> 
<!-- 表单项 --> 
</form>

添加表单项:在表单中添加输入项<input>,这些输入项对应于目标POST请求中的参数。这些参数应该被设置为攻击者希望篡改的值。为了防止用户看到表单项,可以添加type = “hidden”

提交表单:通常,表单需要用户点击提交按钮<input type = "submit">才能发送请求。但在CSRF攻击中,攻击者希望用户在不知情的情况下触发请求。因此,可以通过JavaScript自动提交表单。或使用一个不可见的iframe来加载包含表单的HTML页面,并在加载完成后通过JavaScript触发表单提交。

诱导用户访问:最后,攻击者需要诱导目标用户访问包含该表单的页面。这可以结合社会工程学,通过发送恶意链接、嵌入在广告中的iframe或利用网站的其他漏洞来实现。

例:

<html>
    <script>                                                                                                       <!-- 这个script是用来自动提交表单的 -->
        window.onload = function() {
        document.getElementById("submit").click();
        }
    </script>
    <body>
            <form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
                <input type="hidden" name="sex" value="boy" />
                <input type="hidden" name="phonenum" value="110" />
                <input type="hidden" name="add" value="重庆邮电大学" />
                <input type="hidden" name="email" value="110@qq.com" />
                <input type="hidden" name="submit" value="submit" />
	            <input id="submit" type="submit" value="Submit request" style="display:none"/>                    <!-- style设置为display:none起到隐藏submit按钮的作用 -->
            </form>
    </body>
</html> 

SSRF

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,利用存在缺陷的Web应用作为代理,让服务端发起请求的安全漏洞。简单来说,就是攻击者通过构造恶意的URL或其他网络请求,利用服务端的漏洞,使服务端向攻击者指定的目标服务器发起请求,从而实现对目标服务器的攻击或数据窃取。

攻击特点

利用服务端漏洞:SSRF攻击的核心在于利用服务端提供的从其他服务器获取数据的功能,但服务端没有对目标地址进行严格的过滤与限制。

代理攻击:攻击者将服务端作为代理,利用服务端的权限和网络环境,对目标服务器发起请求。

绕过防火墙:由于请求是由服务端发起的,因此可以绕过一些传统的安全防护措施,如防火墙等。

攻击目标

SSRF攻击的目标通常是与外网隔离的内部系统,包括内网中的服务器、数据库、文件服务器等。攻击者通过SSRF漏洞,可以实现对这些内部系统的访问和攻击。

攻击常见方式

端口扫描:攻击者可以利用SSRF漏洞对内网或外网的服务器进行端口扫描,获取目标服务器的开放端口信息。

文件读取:通过构造指向本地文件系统的URL,攻击者可以读取服务器上的敏感文件,如配置文件、数据库文件等。

内网应用测试:攻击者可以构造指向内网应用的URL,测试内网应用的漏洞和配置信息。

攻击内网服务:利用SSRF漏洞,攻击者可以绕过防火墙等安全设备,直接对内网服务发起攻击。

攻击条件

SSRF攻击是一种由攻击者构造请求,利用存在缺陷的Web应用作为代理,让服务端发起请求的安全漏洞。SSRF攻击条件主要包括以下几点:

Web应用存在缺陷:Web应用程序在处理用户提交的URL时,没有进行充分的验证和过滤。攻击者可以构造恶意的URL,利用这些漏洞来发起SSRF攻击;然后就是一些Web应用程序提供了代理功能,允许用户通过Web界面发起网络请求。如果这些代理功能没有实现正确的安全机制,攻击者可以利用它们来发起SSRF攻击;再者Web应用程序中的文件包含和重定向功能也可能存在漏洞,攻击者可以利用这些漏洞来读取敏感文件或执行恶意操作。

服务端提供了从其他服务器获取数据的功能:服务端可能提供了从其他服务器应用获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等,但又没有对目标地址做严格过滤与限制。这给了攻击者传入任意地址的机会,让后端服务器对其发送请求,并返回对该目标地址请求的数据。

应用程序对用户输入的URL校验不严格:应用程序允许用户输入用于发起请求的URL,如图片链接、文件下载链接、API请求地址等。如果应用程序没有对用户提供的URL进行充分的校验,或者校验不严格,就会给攻击者构造或修改请求的URL的机会。

网络配置和环境因素:在某些情况下,由于防火墙和网络安全设备的配置不当,可能会允许来自Web应用程序的请求绕过安全检查,从而增加SSRF攻击的风险;另外,内部网络架构的复杂性也可能为SSRF攻击提供机会。例如,如果内部网络中存在多个子网和不同的安全区域,攻击者可能利用SSRF漏洞作为跳板,进一步渗透和攻击内部网络。

防御方式

严格校验用户输入的URL:对用户提交的URL进行严格的校验和过滤,只允许特定的协议、主机和端口。

限制Web应用程序的网络访问权限:让远程资源访问功能使用单独的网络,避免与内网或其他敏感网络直接相连。

限制Web应用能够访问的URL范围:配置网络访问控制列表(ACL),限制Web应用只能访问指定的外部服务。

禁用不安全的协议:禁用除HTTP和HTTPS外的协议,如file://、gopher://、dict://等。

屏蔽返回的详细信息:在将返回结果展示给用户之前,先验证返回的信息是否符合标准,避免泄露敏感信息。

建立安全监控机制:对网站进行安全监测,及时发现和响应潜在的安全漏洞。

拓展

伪协议

伪协议是一种非标准化的、特殊的URL格式,它允许开发者或用户以一种不同于标准协议(如HTTP、FTP)的方式来访问和操作资源。这些伪协议看起来像是标准的URL,但实际上它们指向的是本地文件系统上的资源、内存中的抽象概念、数据流或其他非传统网络位置的资源。

SSRF中常用的伪协议

  1. file://:用于访问本地文件系统上的文件。它允许读取或写入文件,且在某些情况下不受PHP配置中allow_url_fopen和allow_url_include的影响。

  2. http:// 和 https://:虽然它们不是严格意义上的伪协议,但在这里提及是因为它们也是通过URL格式来访问网络资源。不过,当在特定上下文中(如文件包含漏洞)被用于非标准用途时,也可以被视为一种伪协议的应用。

  3. ftp://:使用FTP协议进行文件传输,允许通过FTP协议来下载或上传文件。

  4. php://:这是一个伪协议族,提供了多种与PHP输入/输出流相关的伪协议,如:

    php://input:用来读取来自HTTP请求的原始输入流,通常用于处理POST数据。php://output:用来写入响应的内容,相当于使用echo或print输出到浏览器。php://memoryphp://temp:分别用于创建内存流和临时文件流、在脚本中管理数据。php://filter:用于访问本地文件,并通过指定的过滤器进行数据处理,如编码转换等。
  5. dict://:字典服务协议,用于从远程服务器上查询词典或字典内容。

  6. zip:// 和 phar://:用于访问压缩文件和归档文件。zip://用于访问ZIP压缩文件中的文件,phar://用于访问PHP归档文件(PHAR)中的文件。

  7. data://:创建一个包含数据的只读字符串流。

  8. gopher://:早期互联网上的文档检索协议,虽然现在不常用,但在某些特定场景或历史遗留系统中仍可能存在。

伪协议的作用

访问本地资源:如通过file://伪协议访问本地文件系统上的文件。

处理数据流:如php://input和php://output伪协议允许开发者直接访问和操作HTTP请求的输入流和响应的输出流。

过滤和转换数据:如php://filter伪协议允许在读取数据之前对数据进行过滤和转换。

绕过安全限制:在某些情况下,伪协议可能被用于绕过特定的安全限制或过滤机制,例如在文件包含漏洞中读取或执行敏感文件。

访问网络资源:虽然这不是伪协议的主要用途,但某些伪协议(如ftp://)允许通过特定的协议访问网络资源。

减少磁盘I/O:如php://memory和php://temp伪协议允许在内存中读写数据,减少了对硬盘的依赖和I/O压力。

任意域理解

在SSRF漏洞中,“对任意域发送请求”的“任意域”是一个很抽象的概念,它大概指的是攻击者可以通过构造的恶意请求,诱使存在漏洞的服务器向几乎任何域名或IP地址发起HTTP请求。AI说这里的“任意”主要体现在以下几个方面:

不受限制的域名:攻击者可以指定任何外部或内部的域名,只要该域名或IP地址能够通过服务器的网络访问。这意味着,如果服务器没有对目标地址进行适当的过滤和限制,攻击者可以尝试访问任何可达的域名或IP。

内部网络访问:由于SSRF漏洞是由服务端发起的请求,因此它能够绕过一些网络边界的限制,访问到与外网隔离的内部系统。这些内部系统可能包含敏感信息或重要服务,是攻击者重点关注的目标。

伪协议和特殊地址:除了标准的HTTP/HTTPS协议外,攻击者还可以利用一些特殊的伪协议(如file://、gopher://等)和特殊地址(如localhost、127.0.0.1等)来绕过安全控制,访问服务器本地文件或执行未授权的操作。

端口扫描和服务探测:攻击者可以通过构造包含不同端口的URL,对目标网络进行端口扫描,以发现开放的服务和潜在的攻击面。

绕过防御措施:一些开发者可能会尝试通过简单的IP地址过滤来防御SSRF攻击,但攻击者可以通过IP地址进制转换、DNS解析绕过等方式来绕过这些防御措施。

Gopher

Gopher协议是一种早期的互联网协议,它主要用于在网络上获取文本信息。以下是对Gopher协议的详细解释及其作用:

定义:Gopher协议是一种将Internet上的文件组织成某种索引的信息查找系统,它能够方便地将用户从Internet的一处带到另一处。

起源:该协议于1991年提出,由明尼苏达大学的Anklesaria命名,旨在提供一种简单、高效的方式来浏览和访问文件。在WWW(万维网)出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点。

作用

信息检索:Gopher协议使用类似于文件系统的层次结构来组织数据,每个项目都有一个唯一的标识符。用户可以通过Gopher客户端软件浏览目录,选择下载或查看文件。Gopher服务器可以提供文本文件、图像文件、二进制文件等多种类型的文件。

协议格式:Gopher协议的URL格式通常为gopher://hostname:port/gopher-path,其中hostname是服务器的主机名,port是端口号(默认为70),gopher-path是访问的具体路径。

SSRF中的作用

Gopher协议可以发送GET、POST等HTTP请求,因此它成为了SSRF攻击中一种重要的利用手段。攻击者可以利用Gopher协议构造恶意的HTTP请求,从而绕过安全控制,对内部网络或敏感服务进行攻击。

Curl

curl命令是一种功能强大的命令行工具,用于在客户端与服务器之间传输数据。它支持多种协议,包括但不限于HTTP、HTTPS、FTP、FTPS、SMTP、POP3、IMAP等,使得curl能够完成多种网络操作任务。以下是curl命令的主要作用:

发送HTTP请求:curl可以发送GET、POST、PUT、DELETE等多种HTTP请求,并接收服务器返回的响应。这使得curl成为测试API接口、爬取网页数据等场景下的常用工具。

下载和上传文件:curl不仅支持下载文件(如使用-O选项),还支持上传文件(如使用-T选项)。此外,它还支持断点续传等功能,提高了文件传输的效率和可靠性。

设置请求头和响应头:curl允许用户通过-H选项添加自定义的HTTP请求头,以及通过-I-i选项获取HTTP响应头。这使得curl能够模拟不同的客户端请求,并处理复杂的HTTP响应。

处理cookies和session:curl支持cookies的发送和接收,使得它可以在需要维持会话状态的Web应用中发挥作用。用户可以通过-b选项发送cookies,通过-c选项保存cookies。

代理和认证:curl支持通过代理服务器进行网络请求,并支持多种认证方式(如基本认证、摘要认证等)。这使得curl能够绕过网络限制,访问受保护的资源。

详细输出和调试:curl提供了-v(详细模式)和--trace(跟踪模式)等选项,用于输出请求和响应的详细信息,帮助用户调试网络问题。

其他功能:curl还支持SSL/TLS加密传输、FTP上传下载、LDAP查询等多种功能,使其成为一个功能全面的网络工具。

作用

在SSRF攻击中,curl命令的作用至关重要。SSRF攻击允许攻击者利用服务器端的漏洞,以服务器的身份向内部或外部网络发送构造好的请求。curl命令作为HTTP命令行工具,其功能和灵活性使其成为执行SSRF攻击的关键工具之一。以下是curl命令在SSRF攻击中的具体作用:

发起请求:攻击者可以构造恶意的URL,并通过curl命令将其发送给存在SSRF漏洞的服务器。这些URL可能指向内网中的敏感资源或服务,如数据库、文件服务器或内部API;并且curl命令能够模拟客户端请求,包括设置请求头、使用不同的HTTP方法(如GET、POST、PUT等)以及发送请求体数据。这使得攻击者能够绕过一些基于客户端类型或请求特征的防护措施。

绕过限制:url命令支持多种协议,包括HTTP、HTTPS、FTP等。在SSRF攻击中,攻击者可能会尝试使用这些协议来绕过服务器的URL过滤机制;有时,服务器会对请求的IP地址进行限制。然而,curl命令可以通过代理服务器或其他技术来绕过这些限制,使攻击者能够访问目标资源。

探测和扫描:利用curl命令,攻击者可以发送请求到目标网络的不同端口,以探测哪些端口是开放的,并尝试识别运行在这些端口上的服务;通过发送特定的请求并观察响应,curl命令可以帮助攻击者进行Web应用的指纹识别,从而了解目标系统的详细信息,如使用的Web服务器、框架和插件等。

数据泄露和破坏:攻击者可以利用curl命令读取敏感文件或数据库内容,并将其传输回攻击者控制的服务器;在某些情况下,攻击者还可以使用curl命令发送恶意请求,以破坏目标系统的服务或数据。

攻击内部网络:由于SSRF攻击允许攻击者以服务器的身份发送请求,因此攻击者可以利用这一特性穿透防火墙或路由限制,访问内网中的敏感资源;一旦攻击者成功访问了内网中的某个系统,他们可能会尝试利用该系统上的漏洞或凭据来访问其他系统,从而实现横向移动。

在之后的靶场实践中,我们还会用到这个命令进行SSRF攻击

File_get_contents

file_get_contents(fgc)是 PHP 中的一个函数,它用于将整个文件读入一个字符串中。这个函数对于读取小文件或者当你需要文件内容作为一个字符串来进行处理时非常有用。

函数原型

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = 0 [, int $maxlen = null ]]]] )
  • $filename:规定要读取的文件的名称。
  • $use_include_path:如果需要在 include_path 中搜寻文件的话,可以将此参数设置为 '1' 或 TRUE。
  • $context:规定文件句柄的环境选项。
  • $offset:规定在文件中开始读取的位置。
  • $maxlen:规定读取的字节数。

返回值:成功时返回文件作为字符串,或者在失败时返回 FALSE 并生成一条 E_WARNING 级别的错误信息。

示例

<?php 
// 读取文件内容 
$content = file_get_contents('example.txt'); 

// 输出文件内容 
echo $content; 

// 如果需要读取文件的一部分,可以使用 $offset 和 $maxlen 参数 
$partialContent = file_get_contents('example.txt', false, null, 10, 20); 
// 这将读取从第10个字节开始,长度为20个字节的内容 

echo $partialContent; 
?>

在之后的靶场实战中,我们同样也会用到这个函数

pikachu靶场实战

CSRF(GET)

使用提示的用户密码登录,这里我们使用kobe

登录后,开启BP拦截,修改kobe用户信息后,点击submit,在BP查看抓到的包

在BP中截取抓到的GET包中的URL,对其中的参数进行修改,就可以利用漏洞对kobe的信息进行修改

编写一个html网页,使用<a>标签植入修改后的修改用户信息的URL

打开制作的钓鱼网站,如果我们点击任意链接,就会访问对应的URL进而将kobe的用户信息修改为其中设置的参数值

分别点击1、2、3链接,kobe的用户信息就会修改为如下1、2、3图信息

CSRF(POST)

使用提示的用户密码登录,这里我们使用kobe

登录后,开启BP拦截,修改kobe用户信息后,点击submit,在BP查看抓到的包

在BP中截取抓到的POST包中的URL,对其中的参数进行修改,就可以利用漏洞对kobe的信息进行修改

编写一个html网页,使用<input>标签依次修改参数

注意,由于pikachu靶场代码问题,这里需要修改配置文件csrf_post.php,将header("location:csrf get login.php");中的get改为post,否则刚才我们编写的html网站会出现404 not found的情况

点击访问编写的网站,发现成功修改用户信息,完成

CSRF Token

前两步和之前一样,修改用户信息后,点击submit,使用bp抓包,发现这次参数中多了一个token值,如果后台对提交的Token进行了验证,由于Token是随机的,我们就无法伪造URL了,这里我们借助BP插件CSRF Token Tracker

将抓到的包发送到重放器,启用重定向,配置CSRF Token Tracker并启用

此时我们就可以在重放器内修改参数值

点击发送,发现成功修改信息,且CSRF Token Tracker成功抓到Token值

SSRF(curl)

查看网页,点击链接后发现URL中存在curl关键字,因此我们可以借助其植入恶意URL链接

尝试植入www.baidu.com,结果如下

查看源代码,在这段代码中,SSRF漏洞的产生主要是由于未对从用户输入$_GET['url']获取的URL进行充分的验证和过滤。SSRF漏洞允许攻击者诱使服务器向攻击者指定的内部或外部系统发送请求,这可能泄露敏感信息、执行未授权操作或绕过安全措施。具体来说,这段代码中的SSRF漏洞源于以下几点:

未验证URL的合法性:代码直接使用了$_GET['url']的值作为curl请求的目标URL,而没有进行任何形式的合法性验证或过滤。这意味着攻击者可以构造恶意的URL,使服务器向不受信任或未授权的服务器发送请求。

禁用了SSL证书验证curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE); 这行代码禁用了SSL证书的验证。虽然这在某些情况下可能是出于绕过自签名证书错误的目的,但它也降低了安全性,因为服务器将不会验证目标URL的SSL证书是否有效,从而可能受到中间人攻击(MITM)。

缺乏URL过滤:即使$_GET['url']的值看起来是一个URL,也应该对其进行过滤,以确保它不会包含恶意的协议(如file://gopher://等),这些协议可能被用来访问本地文件或执行其他不受欢迎的操作。

SSRF(file_get_content)

与上一关类似,只不过url变为了fgc

同样可以尝试植入www.baidu.com

查看网页源代码,通过分析我们可知SSRF漏洞原因如下:

未经验证的URL使用:这段代码直接从$_GET['file']获取文件名(实际上是URL),然后将其用作file_get_contents()函数的参数。这允许攻击者通过构造恶意的URL来读取服务器上的文件,或者通过精心设计的URL来触发SSRF攻击,使得服务器向不受信任的第三方服务器发送请求。

缺乏输入验证:尽管代码检查了$_GET['file']是否存在且不为null,但它没有执行任何形式的URL验证或清理,比如检查URL是否以file://php://dict://等协议开头,这些协议可能会被用来访问本地文件或执行其他恶意操作。

本地文件包含(LFI)风险:尽管这个示例主要关注SSRF,但同样的代码片段也暴露了本地文件包含(LFI)的风险,因为file_get_contents()可以被用来读取服务器上的任意文件,只要攻击者能够构造出指向这些文件的URL。

远程文件包含(RFI)和SSRF风险:由于file_get_contents()支持URL作为输入,攻击者可以指定远程URL,从而触发远程文件包含(RFI)或SSRF攻击。虽然这里的示例没有直接展示RFI,但SSRF攻击是显而易见的,因为服务器会向攻击者指定的URL发送请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值