[CTF/网络安全] 攻防世界 simple_js 解题详析

news/2024/5/19 22:54:49 标签: web安全, CTF, javascript, 网络安全, 代码审计

[CTF/网络安全] 攻防世界 simple_js 解题详析

    • 代码分析
    • 代码漏洞
    • 姿势
    • String[fromCharCode]
    • 总结

题目描述:小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )

在这里插入图片描述
页面源代码:

在这里插入图片描述

代码分析

function dechiffre(pass_enc){
    // 定义密钥,格式为 ASCII 码值的十进制数,以逗号分隔
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    // 将密文按逗号分隔,转换为数组形式
    var tab  = pass_enc.split(',');
    // 定义一些变量
    var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
    // 计算数组元素个数
    k = j + (l) + (n=0);
    n = tab2.length;
    // 循环第一部分密文
    for(i = (o=0); i < (k = j = n); i++ ){
        o = tab[i-l];
        // 将解密后的明文字符拼接到字符串 p 中
        p += String.fromCharCode((o = tab2[i]));
        if(i == 5)break;
    }
    // 循环第二部分密文
    for(i = (o=0); i < (k = j = n); i++ ){
        o = tab[i-l];
        // 将解密后的明文字符拼接到字符串 p 中
        if(i > 5 && i < k-1)
            p += String.fromCharCode((o = tab2[i]));
    }
    // 将最后一个明文字符拼接到字符串 p 中
    p += String.fromCharCode(tab2[17]);
    // 将明文密码赋值给变量 pass
    pass = p;
    // 返回明文密码
    return pass;
}

// 调用解密函数
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

// 弹出提示框,提示用户输入密码
h = window.prompt('Enter password');
// 调用解密函数,并将解密结果弹出提示框显示给用户
alert(dechiffre(h));

代码漏洞

在代码中,使用了以下语句将明文密码赋值给变量 pass:

// 将明文密码赋值给变量 pass
pass = p;

然而,在解密函数的开头,我们并没有定义变量 p。 因此,JavaScript 将自动为我们创建一个全局 p 变量,并将所有未声明的变量都放在全局作用域中。

这意味着,用户输入密码(密文)并调用解密函数时,虽然得到了正确的明文密码,但是该明文密码被存储在了全局变量 p 中。

因此,当我们再次调用解密函数时,它会使用全局变量 p 中存储的上一次解密结果而不是当前解密结果。

在解密函数 dechiffre()的最后一行

return p || "FAUX PASSWORD HAHA";

使用了逻辑或运算符 ||,如果变量 p 的值为假(如空字符串、null 或 undefined),则返回字符串 FAUX PASSWORD HAHA

由于代码在函数开始前并没有将全局变量 p 初始化,所以第一次运行时,变量 p 的值为 undefined,根据逻辑或运算符的规则,函数会返回字符串 FAUX PASSWORD HAHA。而从第二次开始,因为变量 p 被全局污染,函数每次都会返回上一次的解密结果(即字符串 FAUX PASSWORD HAHA )

姿势

综上所述,输入的密码赋值给h,但h经过dechiffre函数处理后只会返回FAUX PASSWORD HAHA到页面。

切入点应该在:

String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31
\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35
\x30"));

String[fromCharCode]

String["fromCharCode"] 是 JavaScript 中的一个特殊属性,它是 String 对象的静态方法 fromCharCode() 的一个引用。该方法接收一系列 Unicode 码值作为参数,然后将这些码值转换成对应的字符,并返回一个新字符串。

例如,我们可以将 Unicode 码值 65 和 66 传递给 fromCharCode() 方法,以获取对应的字符 A 和 B:

var str = String.fromCharCode(65, 66);
console.log(str); // 输出 "AB"

\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30

转换为ASCII码

const asciiString = "\\x35\\x35\\x2c\\x35\\x36\\x2c\\x35\\x34\\x2c\\x37\\x39\\x2c\\x31\\x31\\x35\\x2c\\x36\\x39\\x2c\\x31\\x31\\x34\\x2c\\x31\\x31\\x36\\x2c\\x31\\x30\\x37\\x2c\\x34\\x39\\x2c\\x35\\x30";
const asciiArray = eval(`[${asciiString}]`);

console.log(asciiArray); // 输出 [55, 56, 54, 79, 115, 69, 114, 116, 107, 49, 50]

再进行ASCII编码

const asciiArray = [55, 56, 54, 79, 115, 69, 114, 116, 107, 49, 50];
const charSequence = String.fromCharCode(...asciiArray);

console.log(charSequence); // 输出 "786OsErtk12"

结合题目要求,Cyberpeace{786OsErtk12}即为所求flag


总结

该题考察Javascript代码的解读不同数值类型的转换姿。
我是秋说,我们下次见,


http://www.niftyadmin.cn/n/346063.html

相关文章

2023上海市大学生网络安全大赛—ssql题解

Part1前言 上海市大学生网络安全大赛的一道 pwn 题目&#xff0c;题目用了双向链表&#xff08;猜到是 Unlink 漏洞&#xff09;。 还算比较简单&#xff0c;主要是分析代码比较复杂。分析完后漏洞限制条件少&#xff0c;题目给了 libc2.31&#xff0c;利用比较灵活。 这题白天…

Java【TCP 协议2】好多人都错了! 保证可靠传输的不是三次握手和四次挥手! 而是...

文章目录 前言一、确认应答1, 什么是确认应答2, 序列号和确认应答号 二、超时重传1, 什么是超时重传 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系…

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起&#xff0c;要么同时执行成功&#xff0c;一旦有一个操作执行失败&#xff0c;那么全部执行失败。这里给大家举个例子:比如A给B转账50元&#xff0c;而B没有收到这50元&#xff0c;此时A转账B这个操作也需要进行回滚&#xff0c;恢复到A给B没…

ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用

文章目录 序章&#xff1a;PDF版下载第一章&#xff1a;Java后端开发1.需求分析1.1 项目分析1.2 开发计划1.3 风险评估1.4 需求增强1.5 需求转情景 2.生成代码2.1 解析文件2.2 数据结构2.3 算法策略2.4 异步处理 3.Bug修改3.1 逻辑错误3.2 性能问题3.3 资源泄露3.4 死锁问题3.5…

【2023/05/21】simula

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第16天。 本文将讨论一个广泛关注的话题&#xff0c;即在信息安全领域中如何使用Simula工具进行攻击模拟和威胁情报分析。在这篇文章中&#xff0c;我们将介绍Simula的概念、原理和应用&#xff0c;评价其…

深入理解深度学习——正则化(Regularization):噪声鲁棒性

分类目录&#xff1a;《深入理解深度学习》总目录 在文章《正则化&#xff08;Regularization&#xff09;&#xff1a;数据集增强》中已经提出将噪声作用于输入&#xff0c;作为数据集增强策略。对于某些模型而言&#xff0c;向输入添加方差极小的噪声等价于对权重施加范数惩罚…

基于C#的餐厅点餐系统的设计与实现

摘 要 在深入研究中小餐饮企业工作流程的基础上&#xff0c;分析制约餐饮企业工作效率的各种因素&#xff0c;发现影响效率的主要因素是普遍使用手工登记菜谱的现象&#xff0c;本系统运用计算机系统来实现餐饮企业工作流的信息化管理&#xff0c;采用面向对象的开发方法以及C#…

Prometheus如何优化远程读写的性能

Prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题&#xff0c;我们一般在高可用监控架构中会使用远程存储&#xff0c;并通过配置prometheus的remote_write和remote_read来对接 远程写优化&#xff1a;remote_write 用户可以在Prometheus配…