花时间 写一下SSRF 凑合看吧 2020/3/24 14.26
漏洞原理
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成并由服务端发起恶意请求的一个安全漏洞。
正是因为恶意请求由服务端发起,而服务端能够请求到与自身相连而与外网隔绝的内部网络系统,所以一般情况下,SSRF的攻击目标是攻击者无法直接访问的内网系统。
ssrf csrf 重放攻击 换行注入
漏洞成因
SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF漏洞可以利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器
存在的点
社交分享功能:获取超链接的标题等内容进行显示
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览 分辨率
在线翻译:给网址翻译对应网页的内容
图片加载/下载:例如富文本编辑器中的点击下载图片到本地、通过URL地址加载或下载图片
图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
数据库内置功能:数据库的比如mongodb的copyDatabase函数
邮件系统:比如接收邮件服务器地址
编码处理、属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
未公开的api实现以及其他扩展调用URL的功能:可以利用google语法加上这些关键字去寻找SSRF漏洞。一些的url中的关键字有:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
从远程服务器请求资源
危害:
对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等。
80
攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
攻击内外网的Web应用,主要是使用HTTP GET/POST请求就可以实现的攻击,(比如Struts2漏洞利用
url .do .acrion ,SQL注入等)
利用file协议读取服务器本地文件等。
进行跳板攻击等。
漏洞验证
-
因为SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的,从而来判断是否存在SSRF漏洞
-
在页面源码中查找访问的资源地址 ,如果该资源地址类型为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cdPKSbbj-1616829346679)(file:///C:\Users\12550\AppData\Local\Temp\ksohtml45828\wps1.jpg)][www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞 4[1](http://www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞 4[1)
相关函数和类
- file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。
- readfile():输出一个文件的内容。
- fsockopen():打开一个网络连接或者一个Unix 套接字连接。
- curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。
- fopen():打开一个文件文件或者 URL。
此外,PHP原生类 SoapClient
在触发反序列化时可导致SSRF
相关协议
-
file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
-
http/s协议:探测内网主机存活
-
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
-
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
协议简述
file协议->读取内网文件
ssrf.php?url=file:// /etc/passwd
ssrf.php?url=file:// /var/www/html/flag.php
http/s协议-> 探测内网存活主机
目标主机的网络配置信息
arp -a
目的就是说:获得目标主机的内网网段并进行爆破
域网IP地址范围分三类,以下IP段为内网IP段:
- C类:192.168.0.0 - 192.168.255.255
- B类:172.16.0.0 - 172.31.255.255
- A类:10.0.0.0 - 10.255.255.255
然后 可以上bp 对内网网段进行爆破
扫描内网端口(http/s和dict协议)
简单举例一些常用的服务
Redis 6379
FPM 9000
Smtp 25
Mysql 3306
如果 服务器 它开了 这个 服务 它会报错
如果没有开的话,会有一个那个 Bad Requset 那个回显请求
同样也是 可以借助 bp 去爆破 这些服务
Gopher协议
这个协议的简单总结就是 在SSRF中很吃香
- Gopher协议格式
URL: gopher://<host>:<port>/<gopher-path>_后接TCP数据流
注意:
gopher协议支持多行。因此要在传输的数据前加一个无用字符。
比如 gopher://ip:port/_ 通常用 _ 并不是只能用 _ ,gopher协议会吃掉第一个字符
这个字符 可以随意
- gopher的默认端口是70
- 如果发起POST请求,回车换行需要使用
%0D%0A
来代替%0A
- 如果多个参数,参数之间的&也需要进行URL编码
这个 下面 有用到 到时候 再讲
SSRF的限制:
限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
限制域名只能为http://www.xxx.com
限制不能访问内网的IP,以防止对内网进行攻击。
屏蔽返回的详细信息。
SSRF漏洞绕过方法:
1.@ http://abc.com@127.0.0.1
2.添加端口号 http://127.0.0.1:8080
3.短地址 https://0x9.me/cuGfD
4.可以指向任意ip的域名 xip.io
5.ip地址转换成进制来访问 192.168.0.1=32322
扩展起来 讲一下
利用HTTP基本身份认证的方式绕过
如果目标代码限制访问的域名只能为 http://www.xxx.com,那么我们可以采用HTTP基本身份认证的方式绕过。即
@:[http://www.xxx.com@www.evil.com](http://www.evil.com/)
利用302跳转绕过内网IP
绕过对内网ip的限制我们可以利用302跳转的方法,有以下两种。
(1)网络上存在一个很神奇的服务,网址为 http://xip.io,当访问这个服务的任意子域名的时候,都会重定向到这个子域名
举个例子:
当我们访问:http://127.0.0.1.xip.io/flag.php时,实际访问的是http://127.0.0.1/1.php。
像这种网址还有http://nip.io,http://sslip.io
(2)短地址跳转绕过,这里也给出一个网址 https://4m.cn/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhSqt4Ze-1616829346682)(C:\Users\12550\AppData\Roaming\Typora\typora-user-images\1616809835527.png)]
进制的转换绕过内网IP
可以使用一些不同的进制替代ip地址,从而绕过WAF
这里贴一个php脚本可以一键转换
<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip