漏洞定义和成因
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
漏洞危害
SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件。
内网服务防御相对外网服务来说一般会较弱,甚至部分内网服务为了运维方便并没有对内网的访问设置权限验证,所以存在SSRF时,通常会造成较大的危害。
可能出现的地方
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
危险函数
-
file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。
-
readfile():输出一个文件的内容。
-
fsockopen():打开一个网络连接或者一个Unix 套接字连接。
-
curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。
-
fopen():打开一个文件文件或者 URL。
-
......
利用方式
File
通过file协议可以进行任意文件的读取,ssrf中比较简单的利用方式
?file=file:///etc/passwd
HTTP
http协议的利用,即位向目标服务器发送http请求
对于某些服务使用的是get方式进行请求,即可以直接通过这种方式进行攻击
?url=http://baidu.com
与file协议的区别:
-
(1)file协议主要用于读取服务器本地文件,访问的是本地的静态资源
-
(2)http是访问本地的html文件,相当于把本机当作http服务器,通过http访问服务器,服务器再去访问本地资源。简单来说file只能静态读取,http可以动态解析
-
(3)http服务器可以开放端口,让他人通过http访问服务器资源,但file不可以
-
(4)file对应的类似http的协议是ftp协议(文件传输协议)
-
(5)file不能跨域
Dict
利用 Dict协议,可以探测端口的开放情况和指纹信息
利用方式:dict://ip:port/cmd 向目标服务器发送命令,并在末尾补上\r\n结束符,因此只能逐条执行命令
?url=193.168.6.33 # 主机发现 ?url=dict://193.168.6.40:80 # 端口探测.暴力破解 ?url=dict://193.168.6.33:3306 #
Gopher
Gopher协议是SSRF中最好用的协议,可以攻击内网的FTP、Telnet、Redis等,也可以发送GET和POST请求、还可以攻击内网未授权Mysql
gopher协议没有默认端口,所以需要指定web端口,而且需要指定post方法。回车换行使用%0d%a
。注意post参数之间的&分隔符也要进行url编码
在 gopher协议中发送 HTTP的数据,需要以下三步:
1、构造 HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送 gopher协议
GitHub - tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers
绕过
格式化IP地址:
IP地址十六进制、二进制、十进制转换-ME2在线工具
IP地址,十六进制,二进制转换在线计算器
将ip地址转化为其他进制,转化之后仍然可以访问
ip:192.168.0.1 十进制:3232235521 十六进制:0xC0A80001
使用省略模式,进行缩写
⚠️ IPV6的写法一定程度取决服务器是否进行解析
-
http://127.1/
-
利用ipv6绕过,http://[::1]/
-
http://127.0.0.1./
URL解析
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。
这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
http://www.baidu.com@10.211.55.6/ ⇒ 10.211.55.6
利用302跳转
所有指向nip.io的解析都会被解析为前面的ip地址
<http://10.211.55.6.nip.io/> => 10.211.55.6
当链接中的内网地址被匹配过滤的时候,可以使用短链进行绕过
短网址生成器 | LinkShortener
短地址生成器
https://github.com/LCTF/LCTF2017/blob/master/src/web/签到题/web签到题.md