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

news/2025/1/8 3:07:56/

题目描述:小宁发现了一个网页,但却一直输不对密码。(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]);// 将明文密码赋值给变量 passpass = 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.ppmy.cn/news/1561443.html

相关文章

机器学习基础-卷积的计算

目录 1 掌握卷积计算的基本过程 1.1 单通道单卷积核 1.2 单通道多卷积核 1.3 多通道单卷积核 1.4 多通道多卷积核 其他计算 padding&#xff0c;stride的作用 填充 步幅 1 掌握卷积计算的基本过程 1.1 单通道单卷积核 如图3所示&#xff0c;现在有一张形状为[5,5,1]…

【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事?

【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事&#xff1f; 【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事&#xff1f; 文章目录 【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事&…

flutter 独立开发之笔记

1、# use: - [flutter_launcher_icons:] 每次修改完icon后&#xff0c;都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…

机器学习基础-线性回归和逻辑回归

目录 基本概念和定义 线性回归 逻辑回归 线性回归中的最小二乘法和梯度下降法 最小二乘法 梯度下降法 参数调整策略 梯度下降类型 梯度下降的调参的基本操作 数据归一化方法 1. 最小-最大归一化&#xff08;Min-Max Scaling&#xff09; 2. 白化变换&#xff08;Wh…

智慧农业应用场景|珈和科技高标准农田信息化监管平台解决方案

近年来&#xff0c;珈和科技持续深耕农业领域&#xff0c;深耕农业时空大数据服务。 珈和利用遥感大数据、云计算、移动互联网、物联网、人工智能等先进技术&#xff0c;搭建“天空地一体化”监测体系&#xff0c;并创新建设了150的全球领先算法模型&#xff0c;可为100多种农作…

NLP项目实战——基于Bert模型的多情感评论分类(附数据集和源码)

在当今数字化的时代&#xff0c;分析用户评论中的情感倾向对于了解产品、服务的口碑等方面有着重要意义。而基于强大的预训练语言模型如 Bert 来进行评论情感分析&#xff0c;能够取得较好的效果。 在本次项目中&#xff0c;我们将展示如何利用 Python 语言结合transformers库&…

potato-suncsr

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 h…

CloudDM 接入主流 OA 系统,简化工单审批流程

数据库数据管控平台在维护企业数据安全、数据库规范方面不可或缺&#xff0c;这一点毋庸置疑。但在实际使用数据库数据管理系统时&#xff0c;常常面临一个问题&#xff1a;工单审批流程集中在数据管理系统&#xff0c;然而并非所有员工都使用这个系统&#xff0c;导致审批困难…