Eval 注入
Eval 注入 是什么?
Eval 注入代码注入的一种具体形式,起因于将不受信任的输入传递给动态求值原语(如 JavaScript eval() 或 Python eval/exec)。
Eval 注入是代码注入的具体子类:语言的动态求值函数——JavaScript 的 eval、new Function、字符串形式的 setTimeout,Python 的 eval/exec,Ruby 的 eval,PHP 中的等价物以及 VBA 的 Application.Run——被以直接或间接来自用户输入的数据调用。这些原语会将传入字符串当作宿主进程中的完整源码解释执行,因此利用后能获得语言级 RCE:可访问全部导入、全局变量、文件系统、环境变量以及子进程。缓解措施包括彻底移除动态求值、改用安全解析器(JSON.parse、ast.literal_eval)、在确实需要数学/表达式求值时使用严格白名单校验器,以及部署 vm2 等运行时沙箱或受限子进程。
● 示例
- 01
Python:result = eval(request.form['expr']) — 载荷 __import__('os').system('id')。
- 02
Node:new Function('return ' + req.query.f)() — 载荷 process.mainModule.require('child_process').execSync('id')。
● 常见问题
Eval 注入 是什么?
代码注入的一种具体形式,起因于将不受信任的输入传递给动态求值原语(如 JavaScript eval() 或 Python eval/exec)。 它属于网络安全的 攻击与威胁 分类。
Eval 注入 是什么意思?
代码注入的一种具体形式,起因于将不受信任的输入传递给动态求值原语(如 JavaScript eval() 或 Python eval/exec)。
Eval 注入 是如何工作的?
Eval 注入是代码注入的具体子类:语言的动态求值函数——JavaScript 的 eval、new Function、字符串形式的 setTimeout,Python 的 eval/exec,Ruby 的 eval,PHP 中的等价物以及 VBA 的 Application.Run——被以直接或间接来自用户输入的数据调用。这些原语会将传入字符串当作宿主进程中的完整源码解释执行,因此利用后能获得语言级 RCE:可访问全部导入、全局变量、文件系统、环境变量以及子进程。缓解措施包括彻底移除动态求值、改用安全解析器(JSON.parse、ast.literal_eval)、在确实需要数学/表达式求值时使用严格白名单校验器,以及部署 vm2 等运行时沙箱或受限子进程。
如何防御 Eval 注入?
针对 Eval 注入 的防御通常结合技术控制与运营实践,详见上方完整定义。
Eval 注入 还有哪些其他名称?
常见的别称包括: eval() 注入, 动态求值注入。
● 相关术语
- attacks№ 195
代码注入
一类漏洞,攻击者提供的数据被应用作为代码解释并执行,导致在应用上下文中实现任意执行。
- attacks№ 1009
服务端模板注入
将模板引擎语法注入到不可信输入中,导致模板渲染时在服务器上执行代码的攻击。
- attacks№ 202
命令注入
用户输入未经过滤就传入操作系统 shell,导致应用程序执行攻击者提供命令的攻击。
- vulnerabilities№ 539
不安全反序列化
应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。
- appsec№ 538
输入校验
在应用处理数据前,服务端检查所有不可信输入是否符合预期的类型、长度、范围、格式和取值集合。