SSRF:服务端请求伪造
前期概述
SSRF是一种安全漏洞,允许攻击者通过欺骗服务器执行未经授权的网络请求。攻击者可以利用服务器的信任关系,使其发出对内部网络或其他受信任服务的请求,可能导致敏感信息泄露或进一步的攻击。
产生原理
服务端没有对攻击者提供的url进行限制和检测,导致攻击者可以以此为跳板攻击内网或其他服务器
PHP中下面函数的使用不当会导致SSRF
file_get_contents()
:从用户指定的url获取内容,然后指定一个文件名
进行保存,并展示给用户fsockopen()
:打开一个网络连接或者一个Unix套接字连接curl_exec()
:用于执行指定的cURL会话
攻击目标
想要获取到目标总服务器的shell,但又无法进入到内网,那么这时就需要:
- 找该公司对外开放的服务,比如web服务,通过此服务攻击该公司内网
- 在上面寻找ssrf漏洞
查找方式
在web功能上找,有该漏洞的网站必定会读取上传的信息,跟注入攻击差不多,写个命令看看会不会执行,比如最简单的http://127.0.0.1
,看看页面有没有什么异常情况
- 文件上传
- 在线转码
- 在线翻译
攻击方式
利用伪协议攻击
-
file:在有回显的情况下,利用 file 协议可以读取系统文件
协议格式:
url=file://C:\\Windows\\System32\\config\\SAM
-
gopher:当探测内网或执行命令时需要发送 POST 请求,我们可以利用 gopher 协议
协议格式:gopher://<host>:<port>/<gopher-path>
-
dict:一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,能用来探测端口的指纹信息
协议格式:dict://<host>:<port>/<dict-path>
防御
- 禁用跳转
- 禁用不需要的协议
- 报错,回显统一信息,或不回显
- 输入验证和过滤
- 白名单控制
- 限制协议和端口