zoukankan      html  css  js  c++  java
  • BUUCTFGoOss wp

    GoOss wp

    0x01前言

    • 最近闲来无事,上buu找了道题目刷了一下,这道题目是go的ssrf,还挺有意思,记录一下(其实主要是为了更博客,哈哈)

    0x02过程

    • 点开题目,发现只返回了一个json数据,下意识觉得这题得扫目录,扫了一会就429了,忘了buu的题基本不用扫目录了233。于是在F12和返回包这些地方看了一下,都没发现东西,最后再看看题目发现有个下载按钮,那这题应该是道代码审计了,下载回来的文件夹如下:

    image

    • 第一眼看到php就觉得奇怪,go语言还夹杂着php,应该有问题,一点开发现php文件可以读取文件内容且没有任何过滤,那么应该就是通过php文件读取flag的值了

    image

    • 还有一个值得注意的地方是那行注释,php in localhost port 80,那么看来估计就是需要ssrf了

    • 点开go文件,从import处知道了使用gin框架,于是拉到最后面,看看有哪些路由,最后发现有中间件、vul、upload和/路由

    image

    • 既然有了/vul路由,那么就先看看vulController的代码

    image

    • vulController代码的重点主要在红框里面,第一个红框是判断,判断传入的json数据是否以http://127.0.0.1:1234/开头,如果不是的话就会403。第二个红框是如果绕过了上面两个判断,那么就可以对输入的url进行请求,也就是ssrf了,但是这个限制应该是绕不过的,于是再去看看其他的代码,看到fileMidderware中有一段302代码

    image

    • 如果满足fi是文件夹且c.Request.URL.String()不以"/"结尾的话,那么就会重定向到c.Request.URL.String()+"/"的页面,实质上是进行了一次请求,而c.Request.URL.String()是我们可控的,所以这里应该存在ssrf。但是直接在浏览器中构造,发现无论怎么构造最后解析的路由都是"/",无法利用,于是又把目光放到之前的/vul路由上。

    image

    • 这时看着这段代码,突然就有了思路,虽然这里的client.Get()限制了url必须以http://127.0.0.1:1234/开头,但是我们之前发现的那段302的代码不也正是这个端口的服务吗,我们可以试试通过这里的请求执行302跳转。最开始我试的是http://127.0.0.1:1234/https://baidu.com/..这样的payload,发现返回了404,猜测应该是把https://baidu.com/当作了文件夹的名字吧,后来想到//是http协议的简写,然后使用http://127.0.0.1:1234//127.0.0.1/..的payload,成功访问到80端口的php服务

    image

    那么这时候只需要通过get传一个文件名过去,就可以读到flag文件了,但是我们不能控制url的后半段,所以我们只能通过绝对路径来读flag文件,但是在最后加上..之后又会跳转,读不到文件,这时想到url带参数的符号是&,于是加了一个&试试,就读到flag了。

    image

  • 相关阅读:
    2016年3月9日~10日,杨学明老师为武汉某著名通信企业提供内训课程服务!
    打造高效率产品测试体系--产品测试管理(深圳,2016.3.18~19)
    互联网产品上线前,做些什么——产品、开发、测试的视角
    2016年1月16日,《互联网项目管理高级实务》内训在上海某高科技企业成功举办!
    用C++对C++语法格式进行分析
    mysql主从配置
    Windows Zip/CentOS/Radhat系统安装Mysql5.7.x方法
    c++预声明类引发的无法解析外部符号问题
    解决VS2015单元测试“未能设置用于运行测试的执行上下文”问题
    扩展Linux磁盘空间
  • 原文地址:https://www.cnblogs.com/Yhck/p/15810641.html
Copyright © 2011-2022 走看看