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/16​10.0.0.0/8​172.16.0.0/12​127.0.0.0/8​0.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绕过姿势的更多相关文章

  1. ssrf绕过总结

    前言 昨天忘了在公众号还是微博上看到的了,看到一个SSRF绕过的技巧,使用的是 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ 绕过的,自己也没遇到过.然后想想自己对SSRF绕过还是停留在之前的了解,也没学习过新的绕过方法, ...

  2. SSRF绕过IP限制方法总结

    SSRF绕过IP限制方法总结 - Summary of SSRF methods for bypassing IP restrictions -https://www.cnblogs.com/iAmS ...

  3. appcms SSRF 绕过漏洞[转载]

    漏洞 <?php if(isset($_GET['url']) && trim($_GET['url']) != '' && isset($_GET['type' ...

  4. SQL注入WAF绕过姿势

    (1)大小写绕过 此类绕过不经常使用,但是用的时候也不能忘了它,他原理是基于SQL语句不分大小写的,但过滤只过滤其中一种. 这里有道题 (2)替换关键字 这种情况下大小写转化无法绕过而且正则表达式会替 ...

  5. SSRF绕过filter_var(),preg_match()和parse_url()

    1.利用curl的变量解释符$ php版本 利用代码 /*ssrf.php*/<?php echo ]."n"; // check if argument is a vali ...

  6. Mysql注入绕过姿势

    1.内联绕过 2.编码绕过,如URLEncode编码,ASCII,HEX,unicode编码绕过 or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(9 ...

  7. ssrf绕过记录

    第一道题来自2018 上海市大学生网络安全大赛线上赛web01 if(isset($_POST['url']) && parse_url($_POST['url'])['host']= ...

  8. CDN绕过姿势小结

    公司的各业务主站都挂了CDN,总结一波CDN绕过技巧. 什么是CDN CDN的全称是Content Delivery Network,即内容分发网络. 其基本思路是尽可能避开互联网上有可能影响数据传输 ...

  9. xss绕过姿势

    #未完待续... 00x1.绕过 magic_quotes_gpc magic_quotes_gpc=ON 是php中的安全设置,开启后会把一些特殊字符进行轮换, 比如: ' 会被转换为 \' 再比如 ...

随机推荐

  1. [转]vue-router各个属性的作用及用法

    转自以下网址,当备忘使用:https://www.cnblogs.com/goloving/p/9211358.html vue-router是vue单页面开发的路由,就是决定页面跳转的! <r ...

  2. 「BZOJ 1698」「USACO 2007 Feb」Lilypad Pond 荷叶池塘「最短路」

    题解 从一个点P可以跳到另一个点Q,如果Q是水这条边就是1,如果Q是荷叶这条边权值是0.可以跑最短路并计数 问题是边权为0的最短路计数没有意义(只是荷叶的跳法不同),所以我们两个能通过荷叶间接连通的点 ...

  3. 【线性代数】3-4:方程组的完整解( $Ax=b$ )

    title: [线性代数]3-4:方程组的完整解( Ax=bAx=bAx=b ) categories: Mathematic Linear Algebra keywords: Ax=b Specia ...

  4. 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍

    这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...

  5. shell中命令代换$()与`` 、 变量代换${} 、 整数运算$(( )) 的区别

    命令代换$()与`` . 变量代换${} . 整数运算$(( )) 1.$( ) 与 ` ` (反引号) 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(comm ...

  6. 初学c++动态联编

    先看一下什么是C++联编? 我觉得通俗的讲,用对象来访问类的成员函数就是静态联编. 那什么是动态联编: 一般是通过虚函数实现动态联编. 看一个动态联编的例子: 我比较懒,所以直接粘贴了MOOC视频的图 ...

  7. LG2216 理想的正方形

    题意 有一个\(a \times b\)的整数组成的矩阵,现请你从中找出一个\(n \times n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小 思路 对于每一列,都用两个单调队列维护 ...

  8. Spring Boot ERROR StatusLogger No Log4j 2 configuration file found

    1. 问题描述 项目之前的 log4j2 配置没问题,把 pom 文件中的 spring-boot-starter-web 依赖删除后,然后启动项目就报错找不到 log4j2.yml 文件. 之前引用 ...

  9. C++ UFT-8和GB2312间的转换

    在这个帖子找到的代码 还蛮好用的 https://bbs.csdn.net/topics/391040755 #include <codecvt> #include <locale& ...

  10. centos-Hadoop集群 安装同步时间

    1.安装 yum search cache ntpdate xcall.sh "yum install -y ntpdate.x86_64" 2.同步 xcall.sh " ...