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

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

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


image.png

页面源代码:

image.png



代码分析

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代码的解读及不同数值类型的转换姿。

我是秋说,我们下次见,

目录
相关文章
|
3月前
|
存储 安全 JavaScript
云计算浪潮中的网络安全之舵探索Node.js中的异步编程模式
【8月更文挑战第27天】在数字化时代的风帆下,云计算如同一片广阔的海洋,承载着企业与个人的数据梦想。然而,这片海洋并非总是风平浪静。随着网络攻击的波涛汹涌,如何确保航行的安全成为了每一个船员必须面对的挑战。本文将探索云计算环境下的网络安全策略,从云服务的本质出发,深入信息安全的核心,揭示如何在云海中找到安全的灯塔。
|
3月前
|
缓存 网络协议 安全
【网络攻防战】DNS协议的致命弱点:如何利用它们发动悄无声息的网络攻击?
【8月更文挑战第26天】DNS(域名系统)是互联网的关键组件,用于将域名转换为IP地址。然而,DNS协议存在安全漏洞,包括缺乏身份验证机制、缓存中毒风险及放大攻击的可能性。通过具体案例,如DNS缓存中毒和DNS放大攻击,攻击者能够误导用户访问恶意站点或对目标服务器实施DDoS攻击。为了防范这些威胁,可以采用DNSSEC实现数字签名验证、利用加密的DNS服务(如DoH或DoT)、限制DNS服务器响应以及及时更新DNS软件等措施。理解并应对DNS的安全挑战对于确保网络环境的安全至关重要。
97 2
|
6月前
|
安全 网络安全 PHP
深入理解PHP的命名空间与自动加载机制网络安全与信息安全:防护之道与攻防之术
【5月更文挑战第29天】在PHP的开发实践中,命名空间和自动加载机制是两个重要的概念,它们共同构成了现代PHP代码组织的基础。本文将详细解释命名空间在PHP中的应用,探讨其解决代码冲突和提高代码复用性的能力,同时深入研究自动加载机制的原理及其在项目中的实际运用,帮助开发者构建更加高效、易于维护的PHP应用。
|
6月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:防护之道与攻防之策
【5月更文挑战第29天】在数字化时代,网络安全与信息安全已成为维护个人隐私、企业资产和国家安全的重要屏障。本文深入探讨了网络安全漏洞的成因、加密技术的应用以及提升安全意识的必要性,旨在为读者提供一个全面的安全防护知识框架。通过对当前网络威胁的分析,我们揭示了安全漏洞的本质及其对信息系统的潜在影响,并介绍了最新的加密技术如何作为防御工具来保护数据传输的安全。此外,文章还强调了培养全民网络安全意识的重要性,提出了一系列实用的安全建议和最佳实践。
|
3月前
|
安全 网络安全 数据安全/隐私保护
网络攻防演练需要注意哪些
【8月更文挑战第14天】
96 1
|
5月前
|
SQL 安全 网络安全
网络安全攻防实战:黑客与白帽子的较量
【6月更文挑战第29天】网络安全战场,黑客与白帽子的博弈日益激烈。黑客利用漏洞扫描、DDoS、SQL注入等手段发起攻击,而白帽子则通过防火墙、入侵检测、数据加密等技术防守。双方在技术与智慧的较量中,未来将更多融入AI、区块链等先进技术,提升攻防效率与安全性。面对网络威胁,提升技能与意识至关重要。
|
6月前
|
SQL 安全 算法
网络安全与信息安全:防护之道与攻防之术
【5月更文挑战第29天】 在数字化时代,数据成为了新的石油。然而,随之而来的网络威胁却如同无形的盗贼,时刻觊觎着这些价值连城的“黑金”。本文将深入探讨网络安全漏洞的本质、加密技术的进展,以及提升安全意识的重要性。我们将透过技术的视角,分析如何构建一道坚固的数字防线,并讨论攻防双方的策略变化。通过案例剖析和最新研究成果,本文旨在为读者提供一份全面的网络安全与信息安全知识图谱。
|
5月前
|
存储 网络协议 数据建模
程序与技术分享:2021年第一届“东软杯”网络安全CTF竞赛
程序与技术分享:2021年第一届“东软杯”网络安全CTF竞赛
|
5月前
|
安全 网络安全 数据安全/隐私保护
CTF竞赛:一场网络安全技术的盛宴
CTF竞赛:一场网络安全技术的盛宴
170 0
|
6月前
|
监控 安全 网络安全
网络安全与信息安全:防范之道与攻防之策
【5月更文挑战第29天】在数字时代,网络安全和信息安全是维护信息完整性、确保数据流通安全的关键。本文深入探讨了网络安全漏洞的产生机理及其影响,分析了加密技术的种类和作用,同时强调了提升个人和企业的安全意识在构建安全防线中的重要性。通过综合技术性措施与行为教育,我们旨在提供一套全面的信息安全防护策略。