SSRF
漏洞学习实战ssrf(Server-Side request Forgery):服务器端请求伪造。
服务端允许从其他服务器上下载图片,读取图片,读取文件,却不对请求的目标url进行过滤和限制。攻击者利用这一特性,以web应用作为代理攻击远程或者本地服务器,。一般来说,ssrf攻击的目标通常都是外网访问不到的内部系统
对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
攻击运行在内网或本地的应用程序(通过构造payload)。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
利用file等协议读取本地文件等(其他协议:http协议,gopher协议,dict协议)。
1.使用抓包查看发起的请求url是否由服务端发起,如果是:http://www.xxx.com/a.php?image=地址
就很有可能是存在ssrf漏洞
2.文章/图片分享功能,如果有,且没有对超链接进行限制,就很有可能存在ssrf漏洞
3.图片加载/下载功能,如果有,没有对url参数进行过滤,也有可能存在ssrf漏洞
4.文章/图片收藏功能,如果有,没有对文章地址进行过滤,也可能存在漏洞
5.在线翻译
6.转码服务
7.邮件系统服务
1.绕过限制为某种域名
如果限制为:http://www.xxx.com
,可以使用http基本身份认证绕过的方式,变为:http://www.xxx.com@对应的url
2.绕过限制不为内网网址
1.转化为短网址
2.加上端口:如:http://www.xx.com
变为http://www.xxx.com: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.采用短地址
漏洞利用的相关函数
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
file_get_contents
把整个文件读入一个字符串中
PHP file_get_contents() 函数详细介绍
fsockopen
打开一个网络连接或者一个套接字连接,返回一个文件句柄
fsockopen
函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据
fwrite:PHP fwrite() 函数
PHP fsockopen函数详解
curl_exec
执行一个curl会话
(1)file:在有回显的情况下,利用 file 协议可以读取任意内容
(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
(4)http/s:探测内网主机存活
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以及LDAP
echo $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:///文件路径
(注意:需要读取的文件路径及名称最好都是英文)
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=文件路径
1.禁止一些不常用的协议,只允许访问http/https请求
2.禁止访问内网IP
3.屏蔽返回的详细信息
4.对请求地址设置白名单和黑名单
5.统一错误信息,避免用户可以根据返回的错误信息判断远程主机的端口状态
6.限制请求的端口为常用端口:比如80,443,8080,8090
banner:欢迎语的意思,在其中可能包含了一些敏感信息:
网络扫描:分为端口扫描和主机扫描
端口扫描:扫描端口是否开启服务
主机扫描:扫描主机是否存活
参考自
文章1
文章2