什么是SSRF?
官方解释:
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种网络安全攻击技术,攻击者利用服务器上的程序向另一个服务器发送请求,通常是为了访问或操作攻击者自身无法直接接触的资源。
人话:隔山打牛
就是通过一个可以访问到的服务器去对另一个内网服务器发起攻击。
利用SSRF+为协议 来进行内网信息收集
file://伪协议
可以通过file:///proc/net/arp显示arp列表,加上bp扫描内网所有存活主机
具体:
先使用http://+ip去访问一个网段所有的ip,再使用file:///proc/net/arp显示所有存活主机。
dict:// 伪协议
可以通过dict://+ip,加上bp扫描内网所有主机开放的端口
http://伪协议
gopher:// 伪协议
作用:可以通过gopher伪协议让外部公网服务器向内网服务器发送post请求传入数据。(一般不单独使用,大多配合其他漏洞比如sql注入,XXE等需要使用公网服务网向内网服务器发起请求的场景)
利用时注意的要点:
1.bp提交需要经过两次url编码。
2.传入数据第一个字符不会被传输,所以一般添加一个"_“来占位。
gopher构造get请求:
gopher构造post请求:
POST /n&me.php HTTP/1.1
Host: 172.250.250.4
Content-Type: application/x-www-form-urlencoded
Content-Length:15
name=benben2222
302重定向绕过:
DNS重绑定绕过:
当服务器端使用这样的防护策略:
服务器端先检测url中的host,如果是域名将通过DNS协议解析得到ip,再进行判断是否为内网ip,如果是则不予访问,不是则服务端响应请求,响应过程会再次DNS解析,我们可以在第二次的DNS解析中放入内网地址实现访问。
原理:
利用服务器两次解析同一域名的间隙,更换域名背后的ip从而绕过SSRF的防御机制。
我们可以通过对一个域名设置两个记录,一个A内网地址,一个B外网正常地址,再访问的时候会随机访问这两条记录,这样就有机会成功实现:在务器两两次解析同一域名的间隙,更换域名背后的ip。
https://lock.cmpxchg8b.com/rebinder.html
注意:
此绕过方法存在运气成分,当DNS中的TTL越趋近于0,越容易成功。 (国内成功率很小,因为一般情况下的DNS的TTL最小一分钟)
利用SSRF漏洞,进行内网的sql注入
大体sql注入流程不在赘述只是要注意:
1.使用SSRF是在一个url栏输入,要想在目标内网主机成功解析执行,需要经过两次URL编码,所以使用sql注入应该将空格换成%20,注释符为:“--%20”,注释本质上是--空格。
2.直接在URL栏提交只需要做一次URL编码即可,若是利用hackbar,就要URL编码两次.原因是URL栏提交会自动编码一次,hackbar则不会编码。
利用SSRF漏洞,进行内网文件上传
场景:有一台可达公网服务器并且该服务器存在SSRF漏洞。另一台内网目标机存在文件上传漏洞,但是是内网服务器无法直接访问。
分析:首先是利用存在SSRF漏洞的服务器,访问内网包含文件上传漏洞的页面。
但是我们无法通过点击来选择文件并上传,这就很难受了,漏洞在面前,看得见却无法直接利用。
查看源码:
得到post属性:Content-Type:multipart/form-data
构造pyload:
POST /Pass-01/index.php HTTP/1.1
Host: 172.250.250.14
Content-Type:multipart/form-data;boundary=feng-ge-fu
Content-Length:305
--feng-ge-fu
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php'
Content-Type:image/jpeg
<?php phpinfo();?>
--feng-ge-fu
Content-Disposition:form-data;name="submit'
上传
--feng-ge-fu--
要点:
1.boundary=feng-ge-fu这段是定义分隔符,可以自己定义随便字符我这例子是:feng-ge-fu
2.分隔符使用的是--feng-ge-fu,在最后的结束符是--feng-ge-fu--
3.具体修改长度Content-Length:305