SSRF意为服务端请求伪造(Server-Side Request Forge)。攻击者利用SSRF漏洞通过服务器发起伪造请求,这样就可以访问内网的数据,进行内网信息探测或者内网漏洞利用。
SSRF漏洞形成的原因是:应用程序存在可以从其他服务器获取数据的功能,但是对服务器的地址并没有做严格的过滤,导致应用程序可以访问任意的URL链接。攻击者通过精心构造URL链接,可以利用SSRF漏洞进行以下攻击:
- 通过服务器获取内网主机、端口和banner信息。
- 对内网的应用程序进行攻击,例如Redis、JBoss等。
- 利用file://伪协议读取文件。
- 可以攻击内网程序,造成缓冲区溢出。
端口探测
url参数没有经过严格过滤,因此攻击者就可以构造任意的URL以利用SSRF漏洞。例如,可以通过http://127.0.0.1:3306来探测此服务器是否开启3306端口。
输入以下测试语句:
http://192.168.1.1/ssrf/1.php?url=http://127.0.0.1:3306
发现返回数据库的版本信息,就说明开放了3306端口,若没有数据返回或者返回时间延长较大,就说明3306端口没有开放。
读取文件
通过file://伪协议尝试读取常见的文件,例如/etc/passwd文件
输入以下测试语句:
http://192.168.1.1/ssrf/1.php?url=file:///etc/passwd
SSRF漏洞修复
- 过滤请求协议,只允许http或者https开头的协议
- 严格限制访问的IP地址,只允许访问特定IP地址
- 限制访问的端口,只允许访问特定的端口
- 设置统一的错误消息,防止造成消息泄露