攻防世界Web新手区-simple_js

题目描述:

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

  1. 进入场景就弹了一个框,让输入密码

在这里插入图片描述

  1. 随便输入一个密码,提示假的密码

在这里插入图片描述
3. 根据题目描述得知此题和js有关,打开开发者工具,找到该网页的js代码

在这里插入图片描述
4. 我们对这段代码进行简单的审计

    function dechiffre(pass_enc){
        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 += String.fromCharCode((o = tab2[i]));
                                if(i == 5)break;}
                        for(i = (o=0); i < (k = j = n); i++ ){
                        o = tab[i-l];
                                if(i > 5 && i < k-1)
                                        p += String.fromCharCode((o = tab2[i]));
                        }
        p += String.fromCharCode(tab2[17]);
        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) );
  1. 首先是定义了一个函数dechiffre,然后看主程序,调用了String类的静态方法fromCharCode,而fromCharCode方法接收的参数是一系列的数字,即ascii码,然后返回ascii码对应的字符,就是将ascii码转换为字符。

在这里插入图片描述
6. 然后我们需要知道dechiffre函数的返回值,dechiffre函数就是传入一个字符串,然后进行一系列操作,返回字符串,
7. 下一行h = window.prompt('Enter password');是接收输入框里的内容并赋值给h
8. alert( dechiffre(h) );将内容进行dechiffre函数处理,再将返回值弹出来
9. 我们先尝试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"会返回什么,

在这里插入图片描述
10. 返回的英文意为假的密码,我们尝试输入其他字符串,发现结果还是一样。
在这里插入图片描述
10. 所以我们知道了,正是由于dechiffre函数作乱才导致我们拿不到真正的密码
11. String类的静态方法fromCharCode是返回一个字符串,但这里却没有输出出来,肯定有猫腻,这应该就是本题的关键点
12. 我们知道,fromCharCode函数的参数应该是一系列数字,但是这里却传了dechiffre函数的返回值,而dechiffre的返回值是一个固定的字符串,所以这里的参数有问题

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"));

  1. 再看这里dechiffre函数传入的是一个十六进制的字符串,观察一下容易发现,\x2c出现了很有规律,而\x2c对应ascii码表中的英文逗号(,),
    在这里插入图片描述

  2. fromCharCode函数参数正是一系列逗号分割的数字,然后将其最为ascii码,再转换为ascii码对应字符串,最后返回

  3. 所以,我们先将十六进制字符串转换为一系列的数字

- 这里有个小技巧,可以直接控制台输出该字符串就会自动转换为相应的字符
![在这里插入图片描述](https://img-blog.csdnimg.cn/4d10e42c04c540139d6ef3972b27b377.png)
  1. 最后,我们将这一系列逗号分割的数字作为fromCharCode函数的参数传进去,果然返回了一个神奇的字符串,格式化下就是我们要找的flag
    在这里插入图片描述
    在这里插入图片描述
  2. 本题完成
Web Python Template Injection 是一种常见的 Web 漏洞类型,通常缩写为 SSTI(Server Side Template Injection)。该漏洞是由于 Web 应用程序未正确处理用户输入导致的,攻击者可以通过构造恶意输入来执行任意代码或获取敏感信息。 Python 作为一种流行的 Web 开发语言,广泛应用于 Web 应用程序中。Python Web 框架(如 Flask、Django 等)通常使用模板引擎来生成动态内容。在模板引擎中,可以使用变量、表达式、条件语句、循环语句等功能来生成动态内容。然而,如果在模板引擎中直接使用用户输入作为变量或表达式的一部分,而没有对用户输入进行适当的验证和过滤,就可能导致模板注入漏洞。 例如,在 Flask 应用程序中,可以使用 Jinja2 模板引擎来生成动态内容。如果在模板中使用了用户输入的变量,攻击者可以构造恶意输入来执行任意代码。例如,以下代码中的 name 变量可能是用户输入的: ```python from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): name = request.args.get('name', '') return render_template('index.html', name=name) if __name__ == '__main__': app.run(debug=True) ``` 在 index.html 中,可以使用 {{ name }} 来显示用户输入的 name 变量。如果攻击者在 name 中注入了模板代码,就可能导致模板注入漏洞。例如,攻击者可以构造如下的输入: ``` {{ ''.__class__.__mro__[1].__subclasses__()[414]('/etc/passwd').read() }} ``` 这段代码在模板引擎中会被解释为调用 Python 的 subprocess.Popen 函数执行命令 /etc/passwd,并读取其输出。攻击者可以通过这种方式执行任意代码,获取敏感信息或者直接控制服务器。 为了防止 SSTI 漏洞,开发人员应该对用户输入进行严格的验证和过滤,避免在模板引擎中直接使用用户输入作为变量或表达式的一部分。可以使用 Python 的安全模板引擎(如 jinja2-sandbox、jinja2-timeout 等)来限制模板执行的权限,或者使用模板引擎提供的安全过滤器(如 escape、safe 等)来过滤用户输入。此外,还应该及时更新 Web 应用程序和相关组件,以避免已知的漏洞攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值