
前言
很多人跟我说过,SSRF漏洞在面试过程中,会被问出“花样”,并且在了解我的伙伴们在面试中被问到的这些问题后,发现我个人对SSRF漏洞利用手法已经攻击构造都不是很深入,随即对这个漏洞以及扩展的攻击面、攻击手法做了比较仔细的研究,秉承“分享”原则,哈哈哈,当然也是为了练练文笔,随即准备开几篇分析利用文出来,方便新入门的和了解不太深入的小伙伴门参考。当然,如果哪位大佬有时间看到了我的文章,也欢迎指导批评!
一、定义与成因
SSRF(Server-side Request Forgery):服务器端跨站伪造,顾名思义,该漏洞就是由于服务器端接收输入功能位置处未对参数做严格的过滤,从而导致由攻击者构造形成服务器端发起请求的一个安全漏洞
【漏洞成因】
- 从外网无法访问的内部系统(正是因为SSRF漏洞是由服务器端发起的,所以它能够请求到与它相连而外网隔离的内部系统)
- 由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。攻击者通常利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务(访问读取内网文件、探测内网主机存货、扫描内网端口开放、攻击内网其他应用。。。),而这些服务或攻击手段是正常来说通过外部访问访问不到的、无法利用的,即请求由服务端发起!
二、不同语言利用难度
SSRF在php中危害较大,php中的相关函数file_contents()、readfile()、curl_exec()、fopen()、fsockopen()等一旦使用不当就会产生SSRF漏洞
SSRF在python和java中相对来说,利用会有一定的难度,因为很多常用的协议在库中不支持,并且还有语言版本的限制因素存在。但是还是可以利用的,只要路子野。。。(具体怎么野法,后续再讲,本期就bb清楚SSRF漏洞原理层面就好了)
三、SSRF常用协议
【file协议】:在有回显的情况下,利用file协议可以读取任意文件的内容
作用:主要是用于访问本机计算机中的文件(file://文件路径)
利用它可以直接读取系统文件,例如
ssrf.php?url=file:///etc/passwd
ssrf.php?url=file://c://boot.ini
与http/s协议的区别:
①file协议用于静态读取,http/s可用于动态解析
File访问的是服务器的一个静态的文件,而http/s访问的是服务器的html这种资源文件,即多了一个把访问的机器当作http服务器,解析请求后再去访问资源的过程
②file是不能跨域读取的而通过http/s可以访问的服务器则可以把自己当成http服务器,开放端口供他人访问的
【Gopher协议】:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。Gopher协议是SSRF利用中一个最强大的协议(俗称万能协议)。可以用于反弹shell
Gopher协议是在http协议诞生前用来访问Internet资源的协议,可以理解为http协议的前身或简化版,虽然很古老但现在很多库还支持Gopher协议而且Gopher协议功能很强大
使用一条gopher协议命令可以完成复杂的操作,比如实现对mysql、Redis的攻击,这是由于Gopher允许数据包整合发送,这一点,与dict协议形成了对比
Gopher支持GET和POST请求
格式:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
Eg:curl gopher://129.168.2.203:9999/_lcx 对面会接收到lcx(需要在正式要传递过去的数据前增加一个无用字符,否在第一个字符会接收不到)
或者传递
Curl gopher://192.168.25.203:9999/_hello%0alcx
对面会接收到
Hello
Lcx
注:如果用url访问需要再进行一次url编码
常见攻击例子:用gopher干redis,还可以攻击mysql、structs2、fastcgi、ftp。。。
【Dict协议】:泄露安装软件版本信息,查看端口,操作内网redis服务等
Gopher协议虽然是最好的,但是使用有环境限制,必要的时候可以尝试使用dict代替
Dict://serverip:port/命令:参数
Eg:dict://192.168.25.203:6379/get:name(当然也可以没有命令与参数)
相比gopher协议的允许集合成一条命令执行,dict需要一条一条的执行,且向服务器的端口请求为【命令:参数】时,会在末尾自动补上\r\n(CRLF)为漏洞利用增添了便利
常用例子:干redis
Dict://192.168.25.203:6379/info
Dict://192.168.25.203:6379/get:user
dict://192.168.25.203:6379/flushall
或者
反弹shell
【http/s协议】:探测内网主机存活
四、SSRF可能存在的功能位置
1.未公开的api实现以及其他扩展调用URL的功能
2.编码、属性信息、文件处理
3.邮件系统
4.数据库内置功能
5.网站采集、网站抓取的位置
6.图片/文章收藏位置
7.图片加载/下载位置
8.在线翻译
9.转码
10.社交分享
11.从远程服务器请求资源
……
五、漏洞验证及利用
【漏洞验证】
排除法
Dnslog等工具进行测试,看是否被访问
抓包分析发送的请求是不是由服务器端发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务器的内网地址
直接返回的Banner、title、content等信息
bool型SSRF
【利用方式】
让服务器访问相应的网址
让服务器访问自己所处内网的一些指纹文件来判断是否存在相应的CMS
可以使用file、dict、gopher、ftp等协议进行请求访问相应的文件
攻击内网web应用
判断内网主机是否存活以及端口开放程度
Dos攻击
总结
好了,关于SSRF基础知识,这篇文章就总结到这里好了,本人水平有限,有什么还需要补充的,欢迎各位来指点!共同进步哈!溜了溜了溜了,再见再见再见!
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)