6.12ctf练习

[西湖论剑 2022]Node Magical Login

源码在这里:GitHub - CTF-Archives/2022-xhlj-web-node_magical_login: A web challenge in 2022 西湖论剑大赛打开

打开环境是个登录框,先进行了扫描和抓包都没有看见什么有价值的东西,看源码

大致连接到存在flag1和flag2


function LoginController(req,res) {
    try {
        const username = req.body.username
        const password = req.body.password
        if (username !== "admin" || password !== Math.random().toString()) {
            res.status(401).type("text/html").send("Login Failed")
        } else {
            res.cookie("user",SECRET_COOKIE)
            res.redirect("/flag1")
        }
    } catch (__) {}
}
function Flag1Controller(req,res){
    try {
        if(req.cookies.user === SECRET_COOKIE){
            res.setHeader("This_Is_The_Flag1",flag1.toString().trim())
            res.setHeader("This_Is_The_Flag2",flag2.toString().trim())
            res.status(200).type("text/html").send("Login success. Welcome,admin!")
        }
        if(req.cookies.user === "admin") {
            res.setHeader("This_Is_The_Flag1", flag1.toString().trim())
            res.status(200).type("text/html").send("You Got One Part Of Flag! Try To Get Another Part of Flag!")
        }else{
            res.status(401).type("text/html").send("Unauthorized")
        }
    }catch (__) {}
}

从这两部分代码中能够知道登录成功的条件是"admin/生成随机数转换为的字符串",爆破随机数这个不太可能,应该就要从别的地方入手

由于每次调用 Math.random() 都会产生一个新的随机数,密码验证几乎不可能成功,除非每次用户输入的密码恰好是 Math.random().toString() 的结果(这在实际情况下是不可能的)

看登录成功之后会生成一个名为user的cookie,值为SECRET_COOKIE,再重定向到flag1

在下一部分的代码中,当从客户端发送的cookie中user=admin就会返回第一部分的flag

所以直接抓包flag1修改cookie

接下来获取flag2

function CheckController(req,res) {
    let checkcode = req.body.checkcode?req.body.checkcode:1234;
    console.log(req.body)
    if(checkcode.length === 16){
        try{
            checkcode = checkcode.toLowerCase()
            if(checkcode !== "aGr5AtSp55dRacer"){
                res.status(403).json({"msg":"Invalid Checkcode1:" + checkcode})
            }
        }catch (__) {}
        res.status(200).type("text/html").json({"msg":"You Got Another Part Of Flag: " + flag2.toString().trim()})
    }else{
        res.status(403).type("text/html").json({"msg":"Invalid Checkcode2:" + checkcode})
    }
}

路由

app.post("/getflag2",(req,res)=> {
    controller.CheckController(req,res)
})

请求体中的checkcode长度要为16,并且在toLowerCase()转换为小写后字符串=="aGr5AtSp55dRacer"

在 Web 应用的安全性验证中,toLowerCase() 的验证逻辑如果没有针对输入的数据格式做严格的检查,可能会被利用 JSON 数据结构进行绕过

利用JSON数组来绕过

解释一下这个数组的构造思路

JSON数组的结构

{"数组名称":["a","b","c"]}

"aGr5AtSp55dRacer"在数组中为一个值,所以要满足长度为16,还需要添加除了预期字符串之外的一系列数字,验证代码简单地提取 checkcode 字段,而没有检查其类型,就直接使用整个数组,导致 toLowerCase() 等字符串操作被绕过

{"checkcode":["aGr5AtSp55dRacer",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}

记得把类型改为json,否则会报错

[NCTF 2018]Easy_Audit

源码

<?php
highlight_file(__FILE__);
error_reporting(0);
if($_REQUEST){
    foreach ($_REQUEST as $key => $value) {
        if(preg_match('/[a-zA-Z]/i', $value))   die('waf..');
    }
}

if($_SERVER){
    if(preg_match('/yulige|flag|nctf/i', $_SERVER['QUERY_STRING']))  die('waf..');
}

if(isset($_GET['yulige'])){
    if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige']))){         //日爆md5!!!!!!
        die('waf..');
    }else{
        if(preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun'){
            $getflag = file_get_contents($_GET['flag']);
        }
        if(isset($getflag) && $getflag === 'ccc_liubi'){
            include 'flag.php';
            echo $flag;
        }else die('waf..');
    }
}


?>

借这题也是比较清楚的认识了php的超级全局变量,现在开始一层一层分析源码

第一层
if($_REQUEST){
    foreach ($_REQUEST as $key => $value) {
        if(preg_match('/[a-zA-Z]/i', $value))   die('waf..');
    }
}

foreach,一个遍历数组并把值赋给value,但是这个$_REQUEST是什么?

$_REQUEST 是 PHP 中的一个超级全局变量数组,用于收集通过 GET、POST 和 COOKIE 发送到当前脚本的请求数据。它整合了 $_GET$_POST$_COOKIE 三个数组中的数据。

同时$_REQUEST还具有一个特性,当同时通过POST和GET传参时,如果POST和GET中含有相同的变量时,只会获取POST传参的变量值

那么第一层就利用POST传参进行变量覆盖,且post传参的值中不能出现字母,绕过第一层的判断

第二层

if($_SERVER){
    if(preg_match('/yulige|flag|nctf/i', $_SERVER['QUERY_STRING']))  die('waf..');
}

$_SERVER也是一个超级全局变量, $_SERVER['QUERY_STRING']指获取get传参的变量和值

http://xxx.com?a=123
那么 $_SERVER['QUERY_STRING']就获取a=123

所以就限制了get传参中不能出现被正则过滤的变量,编码绕过就行

第三层
if(isset($_GET['yulige'])){
    if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige']))){         //日爆md5!!!!!!
        die('waf..');
    }else{
        if(preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun'){
            $getflag = file_get_contents($_GET['flag']);
        }
        if(isset($getflag) && $getflag === 'ccc_liubi'){
            include 'flag.php';
            echo $flag;
        }else die('waf..');
    }
}
一.md5强比较

GET传参yulige,截取前32位和md5加密后的值相同,其实就是一个md5的强比较,传入数组为空即成立

二.正则表达式的绕过

"$"表示正则匹配的位置,这里放在了末尾说明在字符串的末尾进行正则匹配,所以只要在"nctfisfun"前面加数字或者字母就行,只要末尾能匹配到要求字符串就行

三.php伪协议

file_get_contents读取$flag,赋值给getflag==='ccc_liubi',用data伪协议写入就行

所以完整的GET传参payload

yulige[]=1&nctf=1nctfisfun&flag=data://text/plain,ccc_liubi

POST传参

yulige=1&nctf=1&flag=1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode136只出现一次的数字

题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 解析 需要想到异或运算&#…

【BES2500x系列 -- RTX5操作系统】系列文章索引

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

如何将asf转换成mp4?教你3种轻松转换方法

如何将asf转换成mp4&#xff1f;ASF是一种视频格式&#xff0c;但在现代的视频编辑和播放中&#xff0c;MP4格式因其广泛的兼容性和高质量的压缩技术而备受欢迎。因此&#xff0c;将ASF转换为MP4格式的需求时常出现。MP4还采用了高效的压缩技术&#xff0c;能在保证视频质量的同…

前端JS必用工具【js-tool-big-box】学习,打开全屏和关闭全屏

这一小节&#xff0c;我们说一下 js-tool-big-box 工具库中&#xff0c;打开全屏和关闭全屏的方法学习。 我们知道&#xff0c;浏览器想打开全屏&#xff0c;按一下 F11 键就可以了&#xff0c;但一来这个功能不一定所有使用的用户都知道&#xff0c;二来在一些例如大屏的需求…

芯片封测从入门到精通

文章目录 &#x1f4d1;前言一、作者简介二、书籍亮点三、内容简介四、适读人群 &#x1f4d1;前言 在科技日新月异的今天&#xff0c;芯片作为现代电子设备的核心部件&#xff0c;其性能与可靠性直接决定了整个产品的竞争力。而芯片封测&#xff0c;作为确保芯片性能与可靠性…

《Windows API每日一练》4.3 点和线的绘制

理论上&#xff0c;所有的图形设备驱动程序所需要的就是SetPixel函数和GetPixel函数。其余的一切都可以使用在GDI模块中实现的更高层的例程来处理。例如&#xff0c;画一条线&#xff0c;GDI可以不停地调整x和y坐标&#xff0c;然后连续调用多次SetPixel函数来实现。 事实上&a…

了解压电传感器:压电效应

压电加速度计的个关键方面是压电效应。一般来说&#xff0c;压电材料在受到机械应力时可以产生电力。 相反&#xff0c;对压电材料施加电场可以使其变形并产生小的机械力。尽管大多数电子工程师都熟悉压电效应&#xff0c;但有时并没有完全理解这种有趣现象的细节。 更深入地…

电脑剪贴板历史记录查看,让你的信息管理更加有序!

剪贴板是电脑中一个非常实用的功能&#xff0c;允许用户在不同的应用程序之间复制和粘贴文本、图像、文件等内容。然而&#xff0c;默认情况下&#xff0c;剪贴板只能存储最近一次复制的内容&#xff0c;这可能会限制我们的工作效率。幸运的是&#xff0c;电脑剪贴板历史记录查…

水滴式粉碎机:玉米饲料加工的新篇章

在饲料加工业中&#xff0c;玉米作为一种重要的原料&#xff0c;其加工方式直接影响到饲料的品质以及动物对饲料的消化吸收率。近年来&#xff0c;随着科技的进步&#xff0c;越多的环保的饲料加工设备被引入到饲料生产中&#xff0c;其中&#xff0c;水滴式粉碎机以其独特的优…

系统安全(补充)

网闸的“代理”可看成数据“拆卸”&#xff0c;拆除应用协议的“包头和包尾”&#xff0c;只保留数据部分&#xff0c;在内/外网之间只传递净数据容灾技术的主要目的是在灾难发生时保证计算机系统能继续对外提供服务。根据保护对象的不同&#xff0c;容灾可以分为数据容灾和应用…

docker容器基本原理简介

一、docker容器实例运行的在linux上是一个进程 1&#xff09;、我们通过docker run 通过镜像运行启动的在linux上其实是一个进程&#xff0c;例如我们通过命令运行一个redis&#xff1a; docker run -d --name myredis redis2&#xff09;、可以看到首先我们本地还没有redis镜…

Aigtek功率放大器参数怎么选型的

功率放大器是电子系统中重要的组成部分&#xff0c;选型合适的功率放大器对系统的性能和可靠性至关重要。本文下面安泰电子将介绍如何选型功率放大器的关键步骤和考虑因素。 首先&#xff0c;确定应用需求。在选型功率放大器之前&#xff0c;确定应用需求是至关重要的第一步。了…

高中数学:数列-等比数列

一、概念 二、通项公式 1、与函数的关系 类似一个指数函数 2、重要性质 三、求和公式 错位相减法 四、练习 例题1 例题2

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

如何废掉一个项目经理?

1、缺乏明确的目标和方向&#xff1a; 一个项目经理如果没有清晰的目标和方向&#xff0c;就像一艘没有指南针的船&#xff0c;很容易迷失在茫茫大海中。 解决方案&#xff1a;项目经理需要与上级、客户和团队成员共同制定明确的项目目标&#xff0c;并确保这些目标被充分理解…

LORA、UNB无线网关物联网锁助力人才公寓智慧化管理

吸引和留住青年人才是城市持续发展的关键&#xff0c;解决青年人才住房问题又是其中重要一环。“人才跟着产业走、公寓跟着人才建”已成为全国各地新建及改造人才公寓的目标&#xff0c;“引才聚才”离不开人才公寓行业布局与发展。 人才公寓不同于普通的长短租公寓&#xff0c…

CSRF、XSS、盗链攻击解释

CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09; CSRF是什么 CSRF 是一种攻击方式&#xff0c;攻击者通过利用用户在已认证的应用程序中的身份&#xff0c;伪造用户的请求来执行未经授权的操作。 这种攻击可以导致用户在不知情的情况下完成…

工程设计问题---焊接梁设计

参考文献&#xff1a; [1] 吴擎, 徐惟罡, 张春江. 基于师生交流机制的改进类电磁机制算法[J]. 计算机集成制造系统, 2020, 26(4): 1033-1042.

深入理解 Java 中的 volatile 关键字

暮色四合&#xff0c;晚风轻拂&#xff0c;湖面上泛起点点波光&#xff0c;宛如撒下了一片星河。 文章目录 前言一、CPU 三级缓存二、JMM三、并发编程正确性的基础四、volatile 关键字五、volatile 可见性六、volatile 有序性6.1 指令重排序6.2 volatile 禁止指令重排6.3 vola…

六西格玛培训:一次学习,终身受益!

六西格玛培训&#xff0c;这个听起来就充满智慧的名字&#xff0c;其实是一种追求卓越的管理哲学。它的核心理念在于减少缺陷、降低变异&#xff0c;以提升企业的运营效率和质量水平。对于我们这些渴望在职场中更上一层楼的人来说&#xff0c;六西格玛培训无疑是一把打开成功之…