文章目录
一、什么是SSRF?
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,也就是内网。
利用一个可以发起网络请求的服务,当做跳板来攻击其它服务
二、SSRF成因
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。ssrf是利用存在缺陷的web应用作为代理去攻击远程和本地的服务器。
也就是说,对于为服务器提供服务的其他应用没有对访问进行限制,如果我构造好我的访问包,那我就有可能利用目标服务对他的其他服务器应用进行调用。
三、SSRF简析
SSRF漏洞就是通过篡改获取资源的请求发送给服务器;
但是服务器并没有检测这个请求是否合法的;
然后服务器以他的身份来访问其他服务器的资源。
四、PHP存在SSRF的风险函数
以下函数可以通过网络协议访问目标服务器上的资源:
-
file_get_ contents()
file_get_ contents函数可以读取本地和远程的文件,支持多种协议,如ftp,http,https还可以读取php源码;
如:php://filter/read=convert.base64-encode/resource=ssrf.php,就可以将后台当前目录下的ssrf.php文件的bs64编码返回。 -
fsockopen()
fsockopen函数是文件指针 -
curl_exec()
curl_exec函数将访问前端提交的url参数的网址。
五、后台源码获取方式
- 网上寻找开源的源码
- 利用漏洞攻击,获取源码
六、SSRF危害
- 可以对服务器所在内网、本地进行端口扫描,获取一些服务的信息等。例如:可以不断尝试对服务器的内网端口进行探测。
- 目标网站本地敏感数据的读取。例如:能读取服务器根目录下的敏感文件。
- 内外网主机应用程序漏洞的利用
- 内外网Web站点漏洞的利用
七、SSRF漏洞挖掘
从WEB功能上寻找,
- 分享功能。网站能进行超链接的标题等内容进行显示;
- 在线翻译,例如:通过URL地址翻译对应文本的内容;
- 图片加载与下载。加载远程图片地址此功能用到的地方很多,很大可能造成SSRF问题。例如:编辑器处,就会有远程文件加载。某些地方会进行远程加载头像。
- 转码服务。通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览。
- 未公开的API。API (应用程序编程接口)实现以及其他调用URL的功能等。此处类似的功能有360提供的网站评分,以及有些网站通过应用程序编程接口获取远程地址文件来加载内容。
SSRF通过远程加载来实现攻击。
从URL关键字中寻找
在对功能上存在SSRF漏洞中URL地址特征的观察,通过收集,大致有以下关键字:
如果利用google 语法加上这些关键字去寻找SSRF漏洞,耐心的验证,现在还是可以找到存在的SSRF漏洞。
一切要你输入网址的地方和可以输入ip的地方,都是ssrf的天下。
八、SSRF具体利用
ssrf常利用的相关协议
- http://:探测内网主机存活、端口开放情况
- gopher://:发送GET或POST请求;攻击内网应用
- dict://:泄露安装软件版本信息,查看端口,操作内网远程访问等
- file://:读取本地文件
#使用方法
内网访问:
使用http协议对内网的Web应用进行访问
?url=http://127.0.0.1/flag.php
PHP伪协议读取文件
PHP支持的伪协议:
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的
在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。
allow_url_fopen:默认值是ON。允许url里的封装伪协议访问文件;
allow_url_include:默认值是OFF。不允许包含url里的封装伪协议包含文件;
端口扫描
在SSRF中,dict协议与http协议可以用来探测内网主机存活与端口开放情况。
例如:
?url=dict://127.0.0.1:8000
?url=http://127.0.0.1:8080
九、SSRF存在的必要条件
- 必须要有交互;
- 请求资源没有做限制。
以下例子是不存在SSRF漏洞的,举例:
假如通过抓包,发现服务器请求地址是:www.baidu.com
或者右键查看图片的存放地址是:http://www.baidu.com/img/bd_logo1.png,这两种情况,是不存在
SSRF漏洞的。
因为请求的地址都是baidu的服务器,而URL里面的拼接地址也是baidu的地址。SSRF存在的前提是A让B帮忙访问C,现在这相当于是B发脾气,直接告诉A,C在哪里,让A直接访问C,这样子就不存在SSRF漏洞了。
十、SSRF防御
通常有一下 5 个思路:
- 过滤返回信息,验证远程服务器对请求的相应,是比较容易的方法。如果 Web 应用获取某种类型的文件,那么可以在把返回结果展示给用户之前先验证返回信息是否符合标准。
- 统一错误信息,避免用户根据错误信息来判断远程服务器端口状态。
- 限制请求的端口为 HTTP 常用端口,比如 80、443、8080、8090
- 黑名单内网 IP,避免应用被用来获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许HTTP和HTTPS请求。可以防止类似于file://、ftp://等引起的问题
十一、SSRF绕过技巧
利用@符号
SSRF绕过中我们通常使用@符号进行绕过
例如:http://example.com@127.0.0.1
添加端口号
SSRF绕过中我们通常使用添加端口号绕过
例如:http://127.0.0.1:8080
利用短地址
SSRF绕过中我们通常使用短地址进行绕过,把目标网页变成短地址。
利用特殊域名
SSRF绕过中我们通常使用特殊域名进行绕过
利用封闭式字母数字Enclosed Alphanumerics
例:ⓔ ⓧⓐ ⓜⓟ ⓛⓔ .ⓒ ⓞⓜ >>> example.com
清单:
利用。
绕过
SSRF绕过中我们通常使用。进行绕过
例如:http://127。0。0。1
利用进制转换
把IP地址转换成八进制、二进制、十六进制
利用其它协议
Dict:// dict://<user-auth>@<host>:<port>/d:<word>
SFTP:// ssrf.php?url=sftp://example.com:11111/
TFTP:// ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP:// ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
更加具体可以参考这个网页:https://www.secpulse.com/archives/65832.html
这里给出一个大牛的脚本,可以很方便的探测ssrf的网段以及每个网段的端口,甚至还有反弹shell的功能:
地址: https://github.com/NoneNotNull/SSRFX
十二、靶场参考
链接: pikache靶场通关——SSRF攻击
链接: ctfhub靶场练习——SSRF攻击