SSRF攻防
SSRF简介
ssrf原理
- SSRF(sever-side request forgery:服务器端请求伪造)是一种有攻击者构造形成由服务器端发起请求的安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所以可通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
形成的原因
-
服务器提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。
-
比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档等等。
-
简析
- SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法,然后服务器以他的身份来访问其他服务器的资源。
SSRF攻击结果由涵数本身来决定,涵数功能越强大,攻击成功的机会就越高,如:curl_init、file_get_contents
SSRF攻击分类
1、对外网、服务器所在的内网、本地端口扫描,获取一些服务的banner信息。
2、攻击运行在内网或本地的应用程序(比如溢出)
3、对内网web应用进行指纹识别,通过访问默认文件实现。
4、攻击内网的web应用,主要是使用get参数就可以实现的攻击(如struts2、sqli等)
5、利用file协议读取本地文件等
SSRF攻击出现的位置
1、分享:通过URL地址分享网页内容
2、转码服务
3、在线翻译
4、图片加载与下载:通过URL地址加载或者下载图片
5、图片、文章收藏功能
6、未公开的api实现以及其他调用URL的功能
7、从URL关键字中寻找
- share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURLdomain
SSRF绕过方法
更改IP地址写法
-
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP
- ^10(.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
- ^172.([1][6-9]|[2]\d|3[01])(.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
- ^192.168(.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
-
绕过方法
-
8进制编码
- 0300.0250.0.1
-
10进制整数格式
- 3232235521
-
16进制编码
- 0xC0.0xA8.0.1
-
16进制整数格式
- 0xC0A80001
-
特殊的省略模式,例如10.0.0.1这个IP可以写成10.1
-
利用解析URL所出现的问题
- http://www.oldboyedu.com@192.168.0.1/
SSRF常用的后端实现
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的
ssrf攻击可能存在任何语言编写的应用
攻防实验
端口探测
任意地址访问
内网访问
文件内容读取
内网攻击
bwapp环境测试
- 任务1:使用远程文件包含进行端口扫描(内网探测)
- 任务2:使用XXE获取敏感文件中的内容(文件读取)
- 任务3:使用XXE进行SmartTV的拒绝服务漏洞的利用(漏洞利用)
SSRF知识拓展
file协议应用
- http://192.168.163.150/test.php?url=file:///etc/passwd
gopher协议应用
- 基本协议格式:URL:gopher://:/
- http://192.168.0.100/ssrf1.php?url=gopher://192.168.0.105:8080/_POST%20/test.php%20HTTP/1.1%250d%250aHost:%20192.168.0.105:8080%250d%250aUser-Agent:%20curl/7.43.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250aid=1
dict协议应用
- dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议那么就可以轻易的获取目标服务器端口上运行的服务版本等信息。
- http://192.168.163.150/test.php?url=dict://192.168.163.1:3306/info 可以获取目标主机的3306端口上运行着mysq-l5.5.55版本的应用
防范方法
防护措施
(黑名单)
- 1、过滤内网地址(10.0.0.0/172.0.0.0/192.168.0.0)localhost 私有地址、IPV6地址
- 2、过滤file:/// gopher:// ftp:// http:// https:// php:// 危险schrma
- 3、对返回的内容进行识别
- 4、内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)
最佳防护
- 1、白名单过滤
- 2、对返回内容进行识别
- 3、需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况,首先禁用CURLOPT_FOLLOWLOCATION:然后通过域名获取目标IP,并过滤内部IP;最后识别返回的内容是否与假定内容一致