本文主要是介绍SSRF以及CSRF漏洞初步了解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
ssrf基础介绍
函数简介
1.file_get_contents()
2.fsockopen()
3. curl_exec()
4.fopen()
5.file()和readfile()
攻击流程
防护措施
csrf基础介绍
函数简介
1.file_get_contents()
2.fsockopen()
3.curl_exec()
4.file_put_contents()
5.include()和require()
攻击流程
防护措施
ssrf基础介绍
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种网络攻击方式,攻击者通过伪造服务器向目标内部网络或其他受保护的资源发起请求。与CSRF(跨站请求伪造)不同,SSRF主要利用服务器的身份和权限,而不是用户的身份和权限。
SSRF攻击的核心思想是利用服务器端处理的请求,诱使服务器发起对攻击者控制的目标的请求。这些请求通常是在服务器内部或与服务器相关的网络中,这些资源通常是外部用户无法直接访问的。
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
函数简介
1.file_get_contents()
功能:file_get_contents()
函数用于读取文件或 URL 的内容,通常用于获取远程资源。
风险:当此函数用于访问用户提供的 URL 时,如果没有进行适当的验证和限制,攻击者可以利用它向内部服务发起请求。比如,攻击者可以通过设置恶意的 URL 访问内部的服务、文件或敏感信息。
防护措施:
1.验证和过滤:对用户输入的 URL 进行严格验证,确保只允许访问预定义的安全地址。
2.使用白名单:限制请求的目标只能是安全、可信的外部地址。
3.禁用 URL 访问:通过配置 php.ini
中的 allow_url_fopen
为 Off
,禁止通过 file_get_contents()
访问 URL。
2.fsockopen()
功能:fsockopen()
函数用于打开一个网络连接,支持 TCP、UDP 和 Unix 套接字。
风险:fsockopen()
允许通过指定的主机和端口发起网络连接。如果用户输入的主机和端口没有得到适当验证和限制,攻击者可以利用它访问内部网络中的服务或发起其它恶意请求。
防护措施:
1.验证和过滤:对用户输入的主机名和端口进行验证,确保其只能访问合法和安全的服务。
2.限制访问:通过配置网络访问控制和防火墙规则,限制对内部服务的访问。
3. curl_exec()
功能:curl_exec()
函数用于执行一个 cURL 会话,可以用来发送 HTTP 请求,支持多种协议。
风险:curl_exec()
可以用于发起任意的 HTTP 请求。如果没有对 URL 进行适当的验证和限制,攻击者可以利用它向内部服务发起请求。
防护措施:
1.验证和过滤:对用户输入的 URL 进行严格验证,确保只允许访问安全、可信的地址。
2.使用白名单:只允许请求到预定义的、安全的外部地址。
3.配置 CURLOPT_RESOLVE
:使用 CURLOPT_RESOLVE
选项来避免 DNS 请求,直接指定主机的 IP 地址,减少对不可信域名的依赖。
4.fopen()
功能:打开一个文件或 URL 指定的资源,用于读取或写入。
风险:当 fopen()
用于处理用户提供的 URL 时,攻击者可以利用它发起请求,尤其是当服务器可以访问内部服务时。
5.file()和readfile()
功能:file()
读取整个文件到数组中;readfile()
直接输出文件内容。
风险:这些函数也可能被用于读取远程资源,如果用户提供的 URL 没有经过严格验证,可能导致 SSRF。
攻击流程
-
发现漏洞:攻击者首先识别出一个应用程序的漏洞,该漏洞允许其在服务器上发起请求。这些请求可以是HTTP、HTTPS、或其他协议。
-
伪造请求:攻击者向应用程序提交一个特制的请求,其中包含伪造的目标地址。通常,攻击者可以通过参数、URL重写、表单数据等方式注入这些伪造的请求。
-
请求内部资源:由于请求是从服务器发出的,攻击者可以利用服务器的网络权限访问内部系统、敏感数据、或本地服务。
-
获取响应:攻击者通过应用程序的响应获取内部资源的信息,这些信息可以包括内部服务的敏感数据、网络拓扑信息等。
防护措施
-
验证和过滤输入:对用户输入的URL或请求参数进行严格验证和过滤,确保请求只指向允许的和可信任的目标。
-
限制内部网络访问:通过配置服务器的网络访问控制,限制对内部网络和本地资源的访问。例如,使用防火墙规则或网络策略,阻止对本地地址(如
127.0.0.1
、localhost
或内网IP
)的访问。 -
白名单和黑名单:实施白名单机制,只允许访问预定义的、安全的外部资源。也可以使用黑名单机制,阻止已知的恶意IP地址或域名。
-
安全配置:确保应用程序和服务器的配置安全,例如禁用不必要的网络服务或接口,定期更新和修补漏洞。
-
使用安全库和框架:许多现代开发框架和库提供了内建的安全功能,可以帮助避免SSRF漏洞。了解并正确使用这些工具可以提高安全性。
-
监控和日志:实施有效的监控和日志记录机制,及时发现和响应异常的网络请求和活动,帮助检测和防止SSRF攻击。
csrf基础介绍
CSRF(Cross-Site Request Forgery:跨站请求伪造)是一种网络攻击方式,通过利用受害者的身份来发起未授权的操作。攻击者诱使受害者的浏览器在不知情的情况下向受害者已经认证过的网站发起请求,进而执行一些操作(如修改账户设置、转账、提交表单等)。
函数简介
1.file_get_contents()
功能:读取文件或 URL 的内容,适用于从远程地址获取数据。
风险:如果用于处理请求数据时,允许用户提供 URL,可能会发起未授权的请求。虽然这个函数本身不直接导致 CSRF,但其配置和使用不当可能暴露服务器到 CSRF 风险。
2.fsockopen()
功能:打开一个网络连接,支持 TCP、UDP 和 Unix 套接字。
风险:如果攻击者可以控制主机名或端口,可能利用该函数发起恶意请求,尤其是当服务器能够访问内网服务时。
3.curl_exec()
功能:执行一个 cURL 会话,用于发送 HTTP 请求。
风险:如果允许用户提供 URL 并用于 curl_exec()
,攻击者可以发起伪造请求,尤其是当应用程序向内网服务发起请求时。
4.file_put_contents()
功能:将数据写入文件。
风险:虽然 file_put_contents()
本身不直接导致 CSRF,但如果通过它写入敏感数据或配置文件,并且没有正确的验证和权限控制,可能间接引发安全问题。
5.include()和require()
功能:包含和执行指定的 PHP 文件。
风险:如果用户可以控制被包含文件的路径,并且应用程序没有正确的验证,攻击者可能利用这些函数执行恶意代码。
攻击流程
- 受害者认证:受害者登录了某个网站,网站在浏览器中存储了认证信息(如Cookie)。
- 攻击者诱导:攻击者创建一个恶意网站,并诱使受害者访问这个网站。
- 恶意请求:当受害者访问恶意网站时,攻击者通过HTML表单、JavaScript或其他手段在后台发起一个请求,这个请求使用了受害者的身份信息(如Cookie),并发送到受害者登录的合法网站。
- 执行操作:由于合法网站认为请求是由受害者发起的(因为请求携带了有效的身份验证信息),于是执行了恶意操作。
防护措施
-
CSRF Token:①在每个敏感操作的请求中,服务器生成一个唯一的CSRF Token,并将其嵌入到HTML中。②当用户提交表单或进行操作时,浏览器会将这个Token一同提交给服务器。③服务器验证Token是否正确,以确保请求是合法的。
-
SameSite Cookie 属性:将Cookie的
SameSite
属性设置为Strict
或Lax
。这样,浏览器不会将Cookie发送到跨站请求中,从而减少了CSRF攻击的可能性。 -
Referer/Origin Header 检查:检查HTTP请求中的
Referer
或Origin
头部,确保请求来自合法的来源。虽然这不是完全可靠的防护措施,但可以作为补充手段。 -
用户验证:对于高敏感操作(如资金转移),要求用户重新进行身份验证(例如输入密码或进行双因素认证)。
-
使用安全框架或库:许多现代Web框架和库都内置了CSRF保护机制,可以简化开发者的工作,如Django、Rails等。
这篇关于SSRF以及CSRF漏洞初步了解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!