6.12ctf练习

news2025/1/12 22:52:37

[西湖论剑 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.coloradmin.cn/o/1819850.html

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

相关文章

因数与倍数 初级题目

最近又来更题了。这一次是《第三单元 因数与倍数第一部分》的初级题目。 参考答案见文尾 参考答案&#xff1a; CBDAABCBBACCCCCBCDCC

Airtest 使用指南

Airtest 介绍 准备工作 AirtestIDE 安装与启动: https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/ 电脑端的准备工作完成后,对于手机端只需要打开允许USB调试,当首次运行时会提示安装PocoService,同意即可。 界面介绍

仲恺ZK——信计专业《软件体系结构》24年试卷回忆

以下是我在总结的复习内容&#xff0c;有需要可以参考借鉴一下。我的主页还有另外一篇复习总结《仲恺ZK——信计专业《软件体系结构》&#xff0c;两者结合起来复习&#xff0c;帮助你轻松过考试&#x1f60a;。总的来说&#xff0c;考试不会太难&#xff0c;只要你了解了各类设…

2024 Java 异常—面试常见问题

目录 一、异常的分类 二、throw和throws都是异常处理的关键字&#xff0c;二者区别。 三、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#xff1f; 四、try-catch-finally 中哪个部分可以省略&#xff1f; 五、常见的 Runti…

如何基于Nginx配置代理服务器实现邮件告警

当代企业信息化系统建设中&#xff0c;将内网与公网进行隔离是一种非常常见的措施&#xff0c;它可以有效保护企业内部数据不被外泄&#xff0c;有助于企业构建一个更加安全的网络环境&#xff0c;保护企业资产和用户隐私。但另一方面&#xff0c;内网与公网隔离也会带来一些问…

本地无法连接linux上的MariaDB数据库

使用mysql -u root -p 输入密码&#xff1a; 进去之后没有user表&#xff0c;无法改user、host等信息。

安装Pygame

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Pygame是跨平台的Python模块&#xff0c;专为电子游戏设计&#xff08;包含图像、声音&#xff09;&#xff0c;创建在SDL&#xff08;Simple Direct…

QT day01

思维导图 QT编程 实现一个账号登录界面 代码&#xff1a; myweidget.h #ifndef MYWEIDGET_H #define MYWEIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QLineEdit> //行编辑器类 #include <QLabel> //标签类 #…

GROUP_CONCAT

– select 中可以查询的是 GROUP BY 后的&#xff0c;以及这类 MAX() GROUP_CONCAT(expr) 等 select su.* ,sd.dept_name deptName , sp.post_name postName ,GROUP_CONCAT(sr.role_name),GROUP_CONCAT(sr.id) from sys_user su LEFT JOIN sys_dept sd on su.dept_no sd.dept_…

QtScrcpy最出色的C++开源手机投屏控制软件

QtScrcpy是一款开源的跨平台屏幕录制和投屏工具 基本概述&#xff1a; 它基于Android的ADB&#xff08;Android Debug Bridge&#xff09;和Electron框架&#xff0c;为用户提供了简洁且功能强大的用户界面。 支持平台&#xff1a; QtScrcpy支持Windows、macOS和Linux三大…

Vue配置项之directives

Directives 首先说明一下&#xff0c;本人是前端小学生级别的菜鸡&#xff0c;吐槽的话请口下留情&#xff0c;在评论区指出错误或者补充不足&#xff0c;我会很喜欢&#xff0c;互喷不会进步&#xff0c;相互指点才会。。。。谢谢大家啦 目录 Directives 目录自己定义官网简…

摄影构图:如何处理对焦、快门、光圈、ISO 以及拍摄方式

写在前面 博文内容涉及摄影对焦模式、快门速度、光圈、ISO以及拍摄方式的简单介绍《高品质摄影全流程解析》 读书笔记整理理解不足小伙伴帮忙指正 &#x1f603; 生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真…

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习&#xff08;简单模拟tim界面&#xff09; 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

第P10周:Pytorch实现车牌识别

第P10周&#xff1a;Pytorch实现车牌识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在之前的案例中&#xff0c;我们多是使用datasets.ImageFolder函数直接导入已经分类好的数据集形成Dataset&#xff…

[面试题]Java【虚拟机】

[面试题]Java【基础】[面试题]Java【虚拟机】 因为 Java 并发涉及到的内容会非常多&#xff0c;本面试题可能很难覆盖到所有的知识点&#xff0c;所以推荐 《深入拆解 Java 虚拟机》 。 走近 Java 什么是虚拟机&#xff1f; Java 虚拟机&#xff0c;是一个可以执行 Java 字…

cilium关闭vxlan

说明 操作 启用标志 yum -y install net-tools.x86_64 ifconfig | grep vxlan cilium_vxlan: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500修改相关配置 ks get cm cilium-config -oyaml | grep -E tunnel|ipv4-native-routing-cidr|auto-direct-node-routes…

python310: pip install Could not install packages (HTTPSConnectionPool)问题

一、问题描述 在使用pip install安装包或者升级pip版本&#xff08;pip install --upgrade pip&#xff09;时遇到以下错误&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ReadTimeoutError(…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

为什么说掌握心理学知识成为产品经理一门必修课?

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

猫不喝水有什么危害?我想了这招,主食冻干、主食罐头骗水很实用

猫咪如果长期不喝水&#xff0c;一直处于缺水状态&#xff0c;可能会出现一些健康问题。首先&#xff0c;它们可能会出现便秘、上火等症状。在高温的夏季&#xff0c;缺水的猫还容易有脱水中暑的情况&#xff0c;严重的甚至可能死亡。另外&#xff0c;长期饮水不足的猫、很容易…