Day8SSRF绕过(gopher)

    科技2026-04-03  10

    SSRF绕过肯定要使用各种协议 今天主要学习的是gopher协议

    什么是gopher协议

    定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它。

    gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议 限制:gopher协议在各个编程语言中的使用限制 注意:gopher协议中的curl低版本不支持 curl --version可以查看版本以及支持的协议

    gopher协议格式

    URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流

    如果发起post请求,回车换行需要使用**%0d%0a**,如果多个参数,参数之间的&也需要进行URL编码

    gopher发送http get请求

    本地监听,Ubuntu发送请求 如果要在gopher中发送http的数据需要三步:

    构造HTTP数据包URL编码、替换回车换行为%0d%0a发送gopher协议
    构造HTTP包

    首先打开我们写的一个PHP代码

    <?php echo "Hello ".$_GET["name"]."\n" ?>

    GET /php/ssrf/test.php HTTP/1.1 Host: 192.168.43.225

    gopher编码后

    curl gopher://192.168.43.225:80/_GET%20/php/ssrf/test.php%3fname=QLNU%20HTTP/1.1%0d%0AHost:%20192.168.43.225%0d%0A

    注意点:

    1、问号(?)需要转码为URL编码,也就是%3f 2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a 3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束) POST包也和GET类似,主要就是编码问题 一般使用gopher协议来打redis,比如有一个redis未授权漏洞的话,dict协议就是一条一条的执行命令,而gopher协议则是一条命令就可以执行成功,不过gopher协议有很多的限制,在不支持gopher的情况下可以使用dict。

    参考链接:https://zhuanlan.zhihu.com/p/112055947

    Processed: 0.022, SQL: 9