Windows 服务中的 SQL 注入?

Posted

技术标签:

【中文标题】Windows 服务中的 SQL 注入?【英文标题】:SQL injection in Windows Services? 【发布时间】:2019-08-16 01:08:52 【问题描述】:

我有许多只在服务器端运行的 Windows 服务。它对数据库(mysql)执行很少的 CRUD 操作。

有一个客户端应用程序允许用户通过它上传文件到服务器。当文件上传到服务器时,Window Service 会对该文件执行必要的操作,并通过 SQL 查询更新数据库中的详细信息。

Client App(Desktop App) -> File -> Upload on Server -> Window Service Process File -> Database Entry

我想知道这种架构是否真的需要 参数化查询以防止 SQL 注入?

【问题讨论】:

您的问题的答案是“是”,提到的任何其他点都是完全不相关的——没有理由不正确和安全地做事。 如果服务中的数据库代码不对用户数据进行参数化,那么格式错误或恶意的用户数据可能会导致 SQL 注入,因此需要进行参数化。为什么您认为情况可能并非如此? 考虑使用参数化查询,不仅可以保护sql注入,还可以让数据库引擎优化其查询计划。无论如何,要回答我们需要知道您在服务上执行了什么样的操作。 @AlexK。我的项目中有许多非参数化查询。在新的安全标准中,我需要将它们全部参数化。我想到了这一点,因为通常 Web 应用程序对 SQL 注入更开放。在我的情况下,数据库操作不是由客户端应用程序直接发生的。因此我很困惑。 @ArpitGupta:您必须记住,如果其他一些系统将“危险值”(如 ... Drop table ...)存储到数据库中,因为它使用参数化查询和您的服务读取该值并使用它来创建查询,然后您的服务执行 sql 注入。 【参考方案1】:

使用参数化查询不仅可以防止 sql 注入,还可以为您带来其他优势(例如:查询计划重用)。

如果您执行 CRUD 操作,则可以使用 ORM(如 EF)或 MicroORM(如 Dapper)来简化参数化语句的创建。

【讨论】:

是否建议将实体框架与 MySQL 一起使用?正如我之前尝试过的那样,使用 MySQL 建立实体框架设置需要付出很多努力。 EF.Core 应该适用于 MySql。但我从未尝试过。你可以试试 Dapper。 Dapper 不会生成 SQL,但会帮助您分配参数值并将结果转换为对象。

以上是关于Windows 服务中的 SQL 注入?的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入配合JOHN成功拿下服务器

合集SQL注入提权

Web 服务 URL 中的 SQL 注入作为参数值

Sql Server 的sa用户被禁用

实战系列 1记一次从SQL注入到3389远程登录Windows桌面并上线CobaltStrike

SQL注入相关知识整理