Jefff

目录

一、题目

二、思路

三、payload

3.1 方案一

3.2 方案二(官方)

 四、思考与总结

eval() 的替代方案

eval() 在严格模式下的行为


一、题目

<!-- Challenge -->
<h2 id="maname"></h2>
<script>
  let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
  let ma = ""
  eval(`ma = "Ma name ${jeff}"`)
  setTimeout(_ => {
    maname.innerText = ma
  }, 1000)
</script>

二、思路

在该源码中写有一个危险函数eval,它会执行或计算参数。我们可以控制的变量是jeff,并且被使用的地方也在eval中所以,从这里入手。

思路一:

在js中,横杠的两边都是表达式,所以我们可以传入jeff=1";alert(1337);//,那么eval中的参数就变成了

`ma = "Ma name 1";alert(1337);//"`,将前面的双引号闭合后,就可以执行自己的语句了,同时把后面的内容注释掉

思路二:

在js中-两边都是表达式,则可以执行代码。所以也可以将上面的分号改为横杠

三、payload

3.1 方案一

jeff=1";alert(1337);//

3.2 方案二(官方)

jeff="-alert(1337)-"

 四、思考与总结

不要使用eval(),因为从字符串执行JavaScript是一个很大的安全风险。

  • 使用eval(),恶意代码可以在未经许可的情况下在应用程序中运行。
  • 使用eval(),第三方代码可以看到应用程序的范围,这可能会导致可能的攻击。

eval() 的优势:

  1. 灵活性:eval() 允许在运行时动态执行代码,这在某些情况下可能非常有用。
  2. 简单性:对于一些简单的操作,使用 eval() 可能会比其他方法更直观。

eval() 的缺点和风险:

  1. 安全风险:如果 eval() 执行的字符串包含来自不可信来源的数据,可能会导致注入攻击。
  2. 性能问题:eval() 会导致性能下降,因为它需要调用 JavaScript 解释器。
  3. 调试困难:由于代码是动态生成的,使用 eval() 的代码通常很难调试。
  4. 作用域问题:在严格模式下,eval() 有自己的作用域,这可能会导致一些意外的行为。
  5. 可读性差:使用 eval() 的代码通常难以理解和维护。

使用 eval() 会导致性能下降,主要原因有:

  1. 代码解析:每次调用 eval() 时,JavaScript 引擎都需要解析和编译传入的字符串。
  2. 优化失效:使用 eval() 可能会使 JavaScript 引擎的某些优化失效。
  3. 作用域查找:eval() 需要在运行时确定变量的作用域,这比静态分析更慢。

使用 eval() 可能会带来严重的安全风险,尤其是当执行的代码包含用户输入时:

  1. 代码注入:恶意用户可能会注入危险的代码。
  2. XSS 攻击:如果 eval() 执行的代码包含用户提供的内容,可能会导致跨站脚本攻击。
  3. 数据泄露:eval() 可能会访问和修改敏感数据。

eval() 的替代方案

在大多数情况下,都有更好的替代方案来替代 eval():

  1. 使用 Function 构造函数:
let func = new Function('a', 'b', 'return a + b');
console.log(func(2, 3)); // 输出 5
  1. 使用 JSON.parse() 解析 JSON 数据:
let jsonString = '{"name": "John", "age": 30}';
let obj = JSON.parse(jsonString);
  1. 使用对象属性访问:
let obj = {a: 1, b: 2, c: 3};
let prop = 'b';

eval() 在严格模式下的行为

在严格模式(‘use strict’)下,eval() 的行为有一些重要的变化:

  1. eval() 不能创建变量或函数在包含作用域中:
'use strict';
eval('var x = 10');
console.log(x); // 抛出 ReferenceError
  1. eval() 有自己的词法作用域:
'use strict';
let x = 10;
eval('var x = 20; console.log(x);'); // 输出 20
console.log(x); // 输出 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏大橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值