【问题标题】:SQL Server : unsanitized user input with read only userSQL Server:具有只读用户的未经处理的用户输入
【发布时间】:2014-08-29 04:17:08
【问题描述】:

我使用 HTML/PHP 创建了一个简单的页面,其唯一目的是获取未经处理的用户输入。

位于:http://109.201.140.29/mssql/

我这样做只是为了好玩,我目前将此 Windows 服务器用于其他目的。

当用户只有(只读)访问数据库 test_db 时是否有任何风险?

它还记录失败/成功的查询、错误日志示例(如您所见,drop table 不起作用):

[2014-07-08 14:27:41] (query) Execution of query: "DROP TABLE users;" Failed.
     src IP: <snip>
     err: SQLSTATE[42S02]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot drop the table 'users', because it does not exist or you do not have permission.

来自成功查询日志的示例:

[2014-07-08 14:17:38] (query) Executed: "select * from users;".
     src IP: <snip>.
     Returned rows: 100.

[2014-07-08 14:17:45] (query) Executed: "select @@version;".
     src IP: <snip>.
     Returned rows: 1.

[2014-07-08 14:19:12] (query) Executed: "SELECT * FROM information_schema.tables".
     src IP: <snip>.
     Returned rows: 1.

我想是个简单的问题;但是这里有风险吗?除了将用户输入作为查询的明显缺陷..

正如我所说,该用户具有只读访问权限,并且不是任何数据库的所有者。

我问是因为这是我第一次使用 SQL Server,但从我的测试来看,至少查询似乎只允许读取 (SELECT),这对于此目的来说是可以的。

当然可以随意测试查询 - 因为可能有一些我不知道的查询。

【问题讨论】:

  • EXEC xp_dirtree 'C:\' 给了我一个结果.... 好一半的结果
  • 是的,我在错误日志中看到了,呵呵,编辑:我也在打印捕获的异常,无论它失败。因此有一半的结果:)
  • 当然有风险,攻击者可以看到您数据库中包含的所有数据。更不用说@ElectricLlama 已经有脏树了。
  • DOS算不算坏事? SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; SELECT * from users WITH (XLOCK); WAITFOR DELAY '23:59:59'
  • select * from sys.syslogins。这些东西本身没有任何作用,它们只是增加了“攻击面”

标签: sql sql-server security sql-injection


【解决方案1】:

安全性建立在机密性、可用性和完整性之上。 机密性显然会受到损害,因为您只需授予任何访问权限。 正如 Damien 所示,可用性受到影响,也可以使用其他方法。 完整性是“只读”权限实际上有助于保护的唯一内容,但它也是有限的。 您的数据库版本是 Microsoft SQL Server 2012 - 11.0.2100.60,总是有新的漏洞可以让服务器完全接管,如果您直接访问数据库,攻击者总是可以执行暴力攻击来猜测和冒充另一个更强大的用户或甚至管理员用户(例如,执行登录...)。 您永远无法关闭所有潜在漏洞,并且您永远不应该允许对您的数据库进行任何直接访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2011-05-31
    • 2011-06-07
    相关资源
    最近更新 更多