一、漏洞描述
ssrf(服务器请求伪造)漏洞是一种常见的网络安全漏洞,它通常发生在应用程序中存在对外部资源进行访问的功能时。攻击者可以利用这种漏洞来探测、修改或篡改服务器上的数据,也可以通过该漏洞使服务器执行任意命令。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
二、漏洞发现
发现通过url参数访问其他网站获取数据,可能存在ssrf
三、漏洞利用
可以获取host文件内容
和ssrf相关的函数
curl_exec() - 允许从远程服务器检索或提交数据,如果未正确验证输入,则可能导致SSRF攻击。
file_get_contents() - 允许读取文件或URL内容,读入一个字符串。
fsockopen() - 允许在指定主机和端口上打开一个网络套接字,并传输数据。它也可能被滥用进行SSRF攻击。
getimagesize() - 可以获取图像的大小,但是如果传递到URL地址,则可能会导致SSRF攻击。
get_meta_tags() - 允许从HTML文件中提取元标记信息,但是如果将URL作为参数传递,则可能会导致SSRF攻击
相关的伪协议(伪协议是一种特殊的 URL 方案,它允许您通过 URL 访问各种非标准的资源)
在php.ini中有两个重要的参数
allow_url_fopen参数
简介:是否允许将URL(HTTP,HTTPS等)作为文件打开处理
allow_url_include参数
简介:是否允许includeI()和require()函数包含URL(HTTP,HTTPS)作为文件处理
-----------------------------------------------------
file:// — 访问本地文件系统(条件:allow_url_fopen=off/On allow_url_include=off/on)
http:// — 访问 HTTP(s) 网址(条件:allow_url_fopen=On allow_url_include=on)
php:// — 访问各个输入/输出流(I/O streams)(条件:allow_url_fopen=off/On allow_url_include=仅php://input php://stdin php://memory php://temp 需要on)
php://filter用于读取源码,php://input用于执行php代码。
php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)
zlib:// — 压缩流(条件:allow_url_fopen=off/On allow_url_include=off/on)
data:// — 数据(RFC 2397)(条件:allow_url_fopen=On allow_url_include=on)
自php>=5.2.0起可以使用data://数据流封装器,传递相应的数据格式,通常可以执行php代码
http://127.0.0.1/include.php?file=data://text/plain,
phar:// — PHP 归档
-----------------------------------------------------
下面是ssrf的漏洞利用方式:
1.访问内网资源:攻击者可以构造一个特殊的URL请求服务器内网中的资源,如数据库等,然后获取敏感信息。
2.攻击外部系统:攻击者可以构造一个恶意URL,使服务器将HTTP请求发送到一个指定的目标主机,并且将响应内容返回给攻击者。攻击者可以通过这种方式攻击其他系统并盗取数据。
3.绕过访问控制:如果服务器使用SSRF来检查请求是否合法,则攻击者可以通过伪装请求的来源来绕过访问控制。
4.利用文件上传功能:攻击者可以向受害服务器上传一个包含恶意URL的文件,然后利用文件上传功能使服务器解析该URL,从而执行攻击。
5.利用协议特性:攻击者可以通过构造特殊的URL来利用协议的特性,例如file:///协议可以读取本地文件,gopher://协议可以执行任意代码等。
防御方式:
1.对所有传入的URL进行检查和过滤,只允许合法的URL被执行。
2.禁止服务器从不受信任的来源发起请求,限制服务器所能访问的网络范围。
3.使用白名单来限制服务器可以访问的IP地址和端口。
4.更新服务器软件以修复已知的SSRF漏洞,使用最新的安全补丁。
5.按照最小权限原则设置服务器的权限,确保服务器只能访问必要的资源