SSRF绕过姿势
0x00 什么是SSRF?
SSRF(Server-Side Request Forgery,服务器端请求伪造):是一种由攻击者构造形成由服务器端发起请求的一个漏洞。
SSRF 攻击的目标是从外网无法访问的内部系统
漏洞成因 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。
0x01 SSRF的危害
攻击者可利用SSRF绕过防火墙,接触内部网络
攻击者可以利用 SSRF 实现的攻击主要有 5 种:
可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
攻击运行在内网或本地的应用程序(比如溢出)
对内网 WEB 应用进行指纹识别,通过访问默认文件实现
攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 Struts2,sqli 等)
利用 file 协议读取本地文件等
0x02 SSRF出现场景
能够对外发起网络请求的地方,就可能存在 SSRF 漏洞
从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)
数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
Webmail 收取其他邮箱邮件(POP3、IMAP、SMTP)
文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)
0x03 常见防御及绕过方法
一、检查IP是否为内网IP
很多开发者认为,只要检查一下请求url的host不为内网IP,即可防御SSRF。
通常使用正则过滤以下5个IP段:
192.168.0.0/1610.0.0.0/8172.16.0.0/12127.0.0.0/80.0.0.0/8 #在Linux下,127.0.0.1与0.0.0.0都指向本地
这种防御方法通常可以用IP地址进制转换绕过
利用八进制IP地址绕过 0177.0.0.1
利用十六进制IP地址绕过 0x7f000001
利用十进制的IP地址绕过 2130706433
可以看到实际请求都是127.0.0.1,但他们一个都匹配不上正则表达式。
二、Host获取与DNS绕过
检查获取到的Host是否是内网IP防御SSRF
这种防御方法可以用DNS解析绕过
Host可能是IP形式,也可能是域名形式。
如果Host是域名形式,我们是没法直接比对的,只要其解析到内网IP上,就可以绕过。
网上有个神奇域名 http://xip.io (有墙),www.127.0.0.1.xip.io,会自动解析到127.0.0.1
三、通过各种协议
GOPHER:通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而攻击内网应用,例如Redis服务。
File:用File协议访问本地计算机中的文件,例如file:///etc/password.
四、利用URL解析器滥用问题
某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。
这时候可能会出现对URL参数解析不当,导致可以绕过过滤
http://www.baidu.com@127.0.0.1
当后端程序通过不正确的正则表达式,对上述URL的内容解析的时候
会认为访问URL的host为www.baidu.com,而实际上请求的是127.0.0.1上的内容
0x04 实验URL解析器滥用
搭建实验环境
Github上有一个SSRF防御的safe_code:https://github.com/chengable/safe_code/blob/master/ssrf_check.php
木有远程机器,本地搭建测试一下吧
将下面修改后的代码保存为index.php
<?php highlight_file(__FILE__);function check_inner_ip($url) { $match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url); if (!$match_result) { die('url fomat error'); } try { $url_parse=parse_url($url); } catch(Exception $e) { die('url fomat error'); return false; } $hostname=$url_parse['host']; $ip=gethostbyname($hostname); $int_ip=ip2long($ip); return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16; } function safe_request_url($url) { if (check_inner_ip($url)) { echo $url.' is inner ip'; } else { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); $result_info = curl_getinfo($ch); if ($result_info['redirect_url']) { safe_request_url($result_info['redirect_url']); } curl_close($ch); var_dump($output); } } $url = $_POST['url']; if(!empty($url)){ safe_request_url($url); } ?>
新建一个flag.php,写一串字符串当作flag
程序对用户传来的数据,会先使用 safe_request_url 函数对URL的合法性进行判断。
而在 safe_request_url 函数中,使用 check_inner_ip 函数判断用户请求的IP是否为内部IP地址
如果是内部IP,则拒绝该请求;否则使用curl进行请求,并将请求结果进行输出。
利用URL解析器之间的差异处理,参考Orange师傅的PPT
构造payload:
curl -d "url=http://foo@127.0.0.1:80@www.baidu.com/flag.php" "http://192.168.43.157"
SSRF绕过姿势的更多相关文章
- ssrf绕过总结
前言 昨天忘了在公众号还是微博上看到的了,看到一个SSRF绕过的技巧,使用的是 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ 绕过的,自己也没遇到过.然后想想自己对SSRF绕过还是停留在之前的了解,也没学习过新的绕过方法, ...
- SSRF绕过IP限制方法总结
SSRF绕过IP限制方法总结 - Summary of SSRF methods for bypassing IP restrictions -https://www.cnblogs.com/iAmS ...
- appcms SSRF 绕过漏洞[转载]
漏洞 <?php if(isset($_GET['url']) && trim($_GET['url']) != '' && isset($_GET['type' ...
- SQL注入WAF绕过姿势
(1)大小写绕过 此类绕过不经常使用,但是用的时候也不能忘了它,他原理是基于SQL语句不分大小写的,但过滤只过滤其中一种. 这里有道题 (2)替换关键字 这种情况下大小写转化无法绕过而且正则表达式会替 ...
- SSRF绕过filter_var(),preg_match()和parse_url()
1.利用curl的变量解释符$ php版本 利用代码 /*ssrf.php*/<?php echo ]."n"; // check if argument is a vali ...
- Mysql注入绕过姿势
1.内联绕过 2.编码绕过,如URLEncode编码,ASCII,HEX,unicode编码绕过 or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(9 ...
- ssrf绕过记录
第一道题来自2018 上海市大学生网络安全大赛线上赛web01 if(isset($_POST['url']) && parse_url($_POST['url'])['host']= ...
- CDN绕过姿势小结
公司的各业务主站都挂了CDN,总结一波CDN绕过技巧. 什么是CDN CDN的全称是Content Delivery Network,即内容分发网络. 其基本思路是尽可能避开互联网上有可能影响数据传输 ...
- xss绕过姿势
#未完待续... 00x1.绕过 magic_quotes_gpc magic_quotes_gpc=ON 是php中的安全设置,开启后会把一些特殊字符进行轮换, 比如: ' 会被转换为 \' 再比如 ...
随机推荐
- 解决CMD控制台乱码问题
在cmd控制台中出现乱码情况如下 解决方式1 在控制台中输入 CHCP65001 按enter回车键查看 注:CHCP是一个计算机指令,能够显示或设置活动代码页编号. 代码页 描述6500 ...
- @EnableScheduling
- EnumHelper.cs
网上找的,还比较实用的: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- mac 使用express -e ./
利用express构建一个简单的Node项目 命令: express -e ./ -e表示使用ejs作为模板 ./表示当前目录中 使用上面的命令之前我们应该使用npm安装express框架 sudo ...
- openstack导入镜像
本文以制作CentOS7.2镜像为例,详细介绍手动制作OpenStack镜像详细步骤,解释每一步这么做的原因.镜像上传到OpenStack glance,支持以下几个功能: 支持密码注入功能(nova ...
- CSS简单选择器的学习笔记
我们知道通过CSS定义页面样式的时候要用到各种各样的选择器,正确的使用选择器是我们能够正确使用CSS做页面样式的基础.下面是我学习选择器的一个简易笔记,举一些简单的例子. 为了方便展示,我选择在内部的 ...
- nginx变量与实列
nginx内置变量 内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的.总而言之,这些变量代表着客户端请求头的内容,例如$http_u ...
- shell练习1
题目 把ls -l 的输出按照属主分类,打印每个属住的文件名 ls -l |sed -n '2,$p'| awk ' {hash[$]=hash[$]} END{ for (user in hash) ...
- mysqldump 命令
[参考文章]:mysqldump命令详解 mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中. 1. 参数介绍 默认为 true:表示默认情况下 ...
- Java学习回顾总结
java-01初识Java见上一篇 Java-02 1.命名规范与规范: 标识符命名规则:首字母为字母|下划线|$ 其余部分数字|字母|下划线|$ 命名规范: 变量属性方法命名规范:第一个单词首字母小 ...