3x05SSRF
漏洞学习实战
文章目录
3x05 `SSRF` 漏洞学习实战一.ssrf漏洞概念二.原理三.SSRF漏洞的危害四.漏洞检测点五.ssrf漏洞绕过六.ssrf漏洞的利用1.相关函数(1)`file_get_contents`(2)`fsockopen`(3)`curl_exec`2.相关协议 七.pikachu靶场之ssrf七.ssrf防御补充知识一.ssrf漏洞概念
ssrf(Server-Side request Forgery):服务器端请求伪造。
二.原理
服务端允许从其他服务器上下载图片,读取图片,读取文件,却不对请求的目标url进行过滤和限制。攻击者利用这一特性,以web应用作为代理攻击远程或者本地服务器,。一般来说,ssrf攻击的目标通常都是外网访问不到的内部系统
三.SSRF漏洞的危害
对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
攻击运行在内网或本地的应用程序(通过构造payload)。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
利用file等协议读取本地文件等(其他协议:http协议,gopher协议,dict协议)。
四.漏洞检测点
1.使用抓包查看发起的请求url是否由服务端发起,如果是:/a.php?image=地址
就很有可能是存在ssrf漏洞
2.文章/图片分享功能,如果有,且没有对超链接进行限制,就很有可能存在ssrf漏洞
3.图片加载/下载功能,如果有,没有对url参数进行过滤,也有可能存在ssrf漏洞
4.文章/图片收藏功能,如果有,没有对文章地址进行过滤,也可能存在漏洞
5.在线翻译
6.转码服务
7.邮件系统服务
五.ssrf漏洞绕过
1.绕过限制为某种域名
如果限制为:,可以使用http基本身份认证绕过的方式,变为:
@对应的url
2.绕过限制不为内网网址
1.转化为短网址
2.加上端口:如:变为
:8080
3.用句号分隔:127.0.0.1
改为127。0。0。1
4.采用302跳转
5.进制转换:如将127.0.0.1
:八进制:0177.0.0.1
;十六进制:0x7f.0.0.1
;十进制:2130706433
6.[::]
可被解析为http://[::]:80/
会解析为http://127.0.0.1
3.绕过限制请求只为http协议
1.使用302跳转
2.采用短地址
六.ssrf漏洞的利用
漏洞利用的相关函数
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
1.相关函数
(1)file_get_contents
把整个文件读入一个字符串中
PHP file_get_contents() 函数详细介绍
(2)fsockopen
打开一个网络连接或者一个套接字连接,返回一个文件句柄
fsockopen
函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据
fwrite:PHP fwrite() 函数
PHP fsockopen函数详解
(3)curl_exec
执行一个curl会话
2.相关协议
(1)file:在有回显的情况下,利用 file 协议可以读取任意内容
(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
(4)http/s:探测内网主机存活
七.pikachu靶场之ssrf
1.ssrf:curl_exec
我们前文已经知道curl_exec的作用是执行一个curl会话
(1)源码
if(isset($_GET['url']) && $_GET['url'] != null){//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF$URL = $_GET['url'];$CH = curl_init($URL);curl_setopt($CH, CURLOPT_HEADER, FALSE);curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);$RES = curl_exec($CH);curl_close($CH) ;//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAPecho $RES;
(2)
假如生活欺骗了你作者:普希金假如生活欺骗了你,不要悲伤,不要心急!忧郁的日子里须要镇静:相信吧,快乐的日子将会来临!心儿永远向往着未来;现在却常是忧郁。一切都是瞬息,一切都将会过去;而那过去了的,就会成为亲切的怀恋。
当我们点击它时,出现了一首诗,这时的url为url:http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
出现了url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
由此,我们就可以利用这个ssrf漏洞了,由于curl_exec没有进行过滤,我们可以读取我们本地的一些文件,也可以把它链接到任意的url
读取本地文件:http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=file:///文件路径
(注意:需要读取的文件路径及名称最好都是英文)
链接到其他url:http://localhost/pikachu/vul/ssrf/ssrf_curl.php? url=你想要链接的url
2.ssrf:file_get_contents
我们前文已经知道:file_get_contents的作用是读取文件
(1)源代码
if(isset($_GET['file']) && $_GET['file'] !=null){$filename = $_GET['file'];$str = file_get_contents($filename);echo $str;}
(2)我们点击链接后,仍然看到了一首诗
我爱这土地—艾青假如我是一只鸟,我也应该用嘶哑的喉咙歌唱:这被暴风雨所打击着的土地,这永远汹涌着我们的悲愤的河流,这无止息地吹刮着的激怒的风,和那来自林间的无比温柔的黎明……——然后我死了,连羽毛也腐烂在土地里面。为什么我的眼里常含泪水?因为我对这土地爱得深沉……
此时的url:http://localhost/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php
可以看到,此时的==php?==是file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php
所以,我们也可以利用它来读取我们本地的文件(或者远程文件)http://localhost/pikachu/vul/ssrf/ssrf_fgc.php?file=文件路径
七.ssrf防御
1.禁止一些不常用的协议,只允许访问http/https请求
2.禁止访问内网IP
3.屏蔽返回的详细信息
4.对请求地址设置白名单和黑名单
5.统一错误信息,避免用户可以根据返回的错误信息判断远程主机的端口状态
6.限制请求的端口为常用端口:比如80,443,8080,8090
补充知识
banner:欢迎语的意思,在其中可能包含了一些敏感信息:
软件开发商 软件名称服务类型版本号(可以通过版本号来发现已知的漏洞和弱点,这是最重要的)
网络扫描:分为端口扫描和主机扫描
端口扫描:扫描端口是否开启服务
主机扫描:扫描主机是否存活
参考自
文章1
文章2