BUUCTF-GoOss 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

posted @ 2022-01-16 17:07  Yhck  阅读(300)  评论(0编辑  收藏  举报