利用JavaScript's eval()方法

Exploiting JavaScript's eval() method

本文关键字:eval 方法 JavaScript 利用      更新时间:2023-09-26

许多开发人员认为应该避免使用JavaScript的eval()方法。从设计的角度来看,这个想法是有道理的。当有更简单、更好的选择时,它通常被用作一种丑陋的变通方法。

然而,我不理解人们对安全漏洞的担忧。当然,运行eval()使黑客能够运行任何可以运行的JavaScript代码。

但他们就不能这样做吗?至少在Chrome中,开发者工具允许最终用户运行自己的JavaScript。eval()如何比开发人员工具更危险?

正如B-Con所提到的,攻击者不是坐在计算机旁的人,因此可能会使用脚本中已有的eval()将恶意代码传递到您的网站,以某种方式利用当前用户的会话(例如,用户跟踪恶意链接)。

eval()的危险在于它在未初始化的值上执行,并可能导致基于DOM的XSS漏洞。

例如,考虑HTML中的以下代码(相当做作,但它展示了我希望的问题)

<script>
eval('alert("Your query string was ' + unescape(document.location.search) + '");');
</script>

现在,如果查询字符串是?foo,您只需得到一个警报对话框,其中说明以下内容:Your query string was ?foo

但是,该代码允许用户将用户从其网站重定向到一个URL,如http://www.example.com/page.htm?hello%22);alert(document.cookie+%22,其中www.example.com是您的网站。

这会将eval()执行的代码修改为

alert("Your query string was hello");
alert(document.cookie+"");

(为了清楚起见,我添加了新行)。现在,这可能比显示当前cookie值更恶意,因为所需的代码只是由攻击者的链接以编码的形式传递到查询字符串上。例如,它可能在资源请求中将cookie发送到攻击者的域,从而使身份验证会话被劫持。

这适用于用户/外部输入中未初始化并直接在eval()中执行的任何值,而不仅仅是此处显示的查询字符串。

攻击者无法访问用户浏览器的开发工具。攻击者很可能不是坐在电脑旁的用户。

eval()的危险在于,攻击者可能能够以其他方式操纵最终通过eval()运行的数据。如果eval()'d字符串来自HTTP连接,则攻击者可能会执行MITM攻击并修改该字符串。如果字符串来自外部存储,则攻击者可能已经操纵了该存储位置的数据。等等