SSRF

​ 服务端请求伪造(Server Side Request Forgery, SSRF)指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统,即内网。

SSFR中URL的伪协议

  • file:///

//从文件系统中访问文件,获取文件内容

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

  • sftp://

//与SSH打包在一起的单独协议

  • ldap://或ldaps://或ldapi://

//轻量级目录访问协议

  • tftp://

//允许从远程主机获得文件或者把文件传到远程主机

  • gopher://

//分布式文档传递服务

常见绕过方式

1、@

//限制域名为http://www.xxx.com时

http://www.baidu.com@10.10.10.10与http://10.10.10.10的请求是相同的

2、短网址绕过

//网上有工具

3、进制转换

IP地址是一个32位的二进制数,通常被分割为4个8位二进制数。通常用“点分十进制”表示成(a.b.c.d)的形式,所以IP地址的每一段可以用其他进制来转换。

4、点分割符号替换(钓鱼邮件常用于绕过检测)

在浏览器中可以使用不同的分割符号来代替域名中的.分割,可以使用。来代替:

eg:http://www。qq。com

5、本机回环地址的多种表示形式

127.0.0.1,通常被称为本地回环地址(Loopback Address),指本机的虚拟接口,一些表示方法如下(ipv6的地址使用http访问需要加[]):

1
2
3
4
5
6
7
8
9
10
http://127.0.0.1 
http://localhost
http://127.255.255.254
127.0.0.1 - 127.255.255.254
http://[::1]
http://[::ffff:7f00:1]
http://[::ffff:127.0.0.1]
http://127.1
http://127.0.1
http://0:80
6、重绑定攻击

利用服务器两次解析同一域名的短暂间隙,更换域名背后的ip,极其类似条件竞争。

7、特殊域名绕过

xip.io nip.io sslip.io

8、利用不存在的协议头绕过指定的协议头

file_get_contents()函数的一个特性,即当PHP的file_get_contents()函数在遇到不认识的协议头时候会将这个协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。(include()函数也有类似的特性)//路径穿越的原理

若上限制了url只能是以https开头的路径,我们就可以:

让file_get_contents()函数遇到了不认识的伪协议头“httpsssss://”,将他当做文件夹,然后再配合目录穿越即可读取文件

9、URL解析差异

readfile和parse_user函数解析差异绕过指定端口

1
2
3
eg:http://127.0.0.1:11211:80
readfile()函数获取的端口是最后冒号前面的一部分(11211)
parse_url()函数获取的则是最后冒号后面的的端口(80)
10、利用[::]

可以绕过localhost

eg: http://[::169.254.169.254]