前言
这是很早就整理的笔记,今天想起来发到博客上,还是要保持写文章总结的习惯啊。 最近笔者在看讲SSRF、protocol smuggle、HTTP request smuggle、SSO任意跳转,Url解析不一致导致的安全问题。一方面由衷地佩服演讲人的脑洞和安全功底,另外一方面又在笔者又在反思,如果是我,我会怎么去发现此类漏洞,解决方案又是什么。本文不同于各大公众号千篇一律的复现、验证漏洞文章,会加入自己的思考和心得。鉴于文章会存在一些敏感内容,笔者会本着在删除敏感内容的前提下,尽量让大家都能看懂的标准去和大家一起探讨这方面的知识。
在学习前之前我会给自己提出来如下问题:
1.漏洞的本质到底什么
2.应该如何防御
3.如何发现同类漏洞,如何自动化找到此类漏洞甚至0day
什么是SSRF
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
$data =curl_exec($ch);
curl_close($ch);
echo $data;
?>
很多介绍SSRF的文章都会以这个作为演示Demo,可以看看curl支持哪些协议:curl-config –protocols
DICT
FILE
FTP
FTPS
GOPHER
HTTP
HTTPS
IMAP
IMAPS
LDAP
LDAPS
POP3
POP3S
RTSP
SMB
SMBS
SMTP
SMTPS
TELNET
TFTP
看到Orange Thai 在blackhat中发表的演讲《A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! 》中将讲解了fuzz思路和利用方法,结合本人的一些理解,将从按照协议走私的方式来分析利用方式。
利用gopher协议
gopher协议背景介绍
一、Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;二、地鼠Gopher(谷佛)是迪士尼卡通人物之一。
opher协议是个tcp/ip协议,通过gopher协议可以发送tcp stream做的事情。比如我们操作mysql,操作redis,甚至使用smtp协议发送邮件等等都可以通过转换成gopher协议达到一样的效果。
gopher protocol smuggle
gopher协议是万金油,通过protocol smuggle能执行转换成太多协议
攻击mysql
首先为了实验环境演示尽可能简单,mysql高于5.7需要关闭mysql tls,保证mysql为空密码,关闭tls方法如下
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
9 rows in set (0.00 sec)
编辑配置文件: /path/to/file/my.cnf
[mysqld]
...
skip_ssl
# disable_ssl
很多文章也介绍了如何通过wireshark 抓包然后转换成go