标签: sql-injection

在数字常量周围加上单引号真的可以防止 MySQL 中的 SQL 注入吗?

该手册似乎建议在数字周围使用引号足以防止 SQL 注入。

根据第5.3.1通用安全指南中的MySQL 5.1中参考手册

如果应用程序生成查询(例如,SELECT * FROM table WHERE ID=234当用户输入值时)234,则用户可以输入值234 OR 1=1以使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1。结果,服务器检索表中的每一行。这会暴露每一行并导致过多的服务器负载。防止此类攻击的最简单方法是在数字常量周围使用单引号:SELECT * FROM table WHERE ID='234'. 如果用户输入额外的信息,它就会成为字符串的一部分。在数字上下文中,MySQL 自动将此字符串转换为数字并从中去除任何尾随的非数字字符。

如果用户输入值,这是否意味着用户受到保护234' OR 1=1 #?(即生成查询SELECT * FROM table WHERE ID='234' OR 1=1 #'

mysql sql-injection

7
推荐指数
1
解决办法
6380
查看次数

在服务器上查找重复的大量 SQL 编辑的来源

我会尽量清楚地解释我的问题。

我支持的一家公司的服务器运行着许多网站。此服务器运行带有 Microsoft SQL Server 2014 的 Windows Server 2012。

几乎所有网站都在运行由同一家公司制造的专有 Web 应用程序。

只有部分网站会受到(几乎)每个 TEXT、NTEXT 和 NVARCHAR(MAX) 字段在其各自数据库中的定期批量编辑的影响。

带有恶意或垃圾邮件链接的 HTML 被添加到表的每条记录中,仅在具有上述指定类型的字段中。

服务器已经用几个工具扫描过,所有的主密码(管理员,SQL Server 的 sa)都已更改。我还尝试运行 SQL Profiler 来尝试识别批量更新查询,但没有成功。

我现在可以想象,这可能是 SQL 注入攻击,它利用运行这些网站的软件中的漏洞,但为什么只有其中一些?其他具有相同版本的网站从未出现此问题。

如您所知,还有什么我可以尝试的吗,或者我错过了什么?如果您可能需要其他数据,请毫无问题地回复。

security sql-server sql-injection sql-server-2014

7
推荐指数
1
解决办法
141
查看次数

构建动态 SQL-Server Where 子句

让我们回顾一下SQL-Server 的dba.exchange Oracle 问题

这是 SaUce 的代码,经过一些格式化:

CREATE PROCEDURE GetCustomer 
    @FirstN nvarchar(20) = NULL, 
    @LastN nvarchar(20) = NULL, 
    @CUserName nvarchar(10) = NULL, 
    @CID nvarchar(15) = NULL 
as
begin 
    DECLARE @sql nvarchar(4000)

    SELECT @sql = 'C_FirstName, C_LastName, C_UserName, C_UserID 
FROM CUSTOMER
WHERE 1=1 '

    IF @FirstN IS NOT NULL 
        SELECT @sql = @sql + ' AND C_FirstName like @FirstN ' 

    IF @LastN IS NOT NULL 
        SELECT @sql = @sql + ' AND C_LastName like @LastN ' 

    IF @CUserName IS …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-injection

6
推荐指数
1
解决办法
4054
查看次数

即使引号转义,也可以通过 .NET 进行 Microsoft SQL Server SQL 注入

我一直在阅读 SQL 注入,作为对相当大的 Web 服务进行安全审计的一部分。我一直在谷歌搜索并阅读我可以在这里和 SO 上找到的所有帖子,并且对真正应该如何构建动态查询以及 MySQL 和 MSSQL 之间的一些差异有相当深入的了解。我最终看到了今年早些时候由 Microsoft 发布的名为SQL Injection 的页面。在标题为“过滤输入”的部分中,它指出:

通过删除转义字符,过滤输入也可能有助于防止 SQL 注入。但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。以下示例搜索字符串定界符。

private string SafeSqlLiteral(string inputSQL)  
{  
  return inputSQL.Replace("'", "''");  
}  
Run Code Online (Sandbox Code Playgroud)

编写安全代码第二版也在第 401-402 页讨论了这一点,但看起来作者实际上并没有尝试 C# 示例(或者他在 2003 年使用的 SQL 版本可能没有正确处理转义字符串)。它指出字符串输入将导致无效查询(实际上,转义只是查询其中带有单引号的值),然后指出它也可能会被使用未加引号的数字字段的值攻击(尽管不能,因为示例中的字段来自类型为 的局部变量int,它不可能包含注入所需的信息)。

我不怀疑这里存在可能的攻击向量,但我无法找到有关如何实现这一点的任何解释。从我的其他研究来看,一种可能的方法可能涉及非 Unicode 字符串中的奇怪字节序列。就我而言,我正在使用 .NET,所以不可能有这样的序列,我认为 ADO.NET、SQL Server 或两者都可以正确处理 Unicode 字符串与单个内部的任何其他类型的字符-引号。(虽然有趣的是示例代码似乎是在 C# 中)。

我也很清楚微软页面上列出的其他 SQL 注入方法,对于这个问题,我并不担心这些。此外,我只关心此处正确键入的字符串文字输入。此代码始终在编写 SQL 查询之前将传入类型解析为其适当的运行时类型,因此引号转义仅适用于数据是文字字符串数据时。所以就我而言,该函数实际上更像是:

private string SafeSqlStringLiteral(string inputString)  
{  
  return "'" + inputString.Replace("'", "''") + "'";  
}  
Run Code Online (Sandbox Code Playgroud)

我最关心的就是文档中的下面这句话:

但是,由于可能会出现问题的字符数量众多,因此这不是可靠的防御。

这只是指奇怪的单字节编码,还是有适用于的 Unicode 字符(我无法以编程方式找到一个)?

我正在审查的代码非常广泛,并且在很多地方都使用了这种类型的转义(并且以一种不容易修复的方式)。我不是直接要求利用漏洞(这对 IIRC …

sql-server sql-injection t-sql sql-server-2012

5
推荐指数
1
解决办法
2013
查看次数

exec(sql) 的安全替代方案

我发现exec(sql)代码中隐藏了一些语句。它们存在是有充分理由的,因为这些语句不能直接编写,但它们是一个明显的攻击媒介。

有没有安全的替代品exec(some sql)?将正确参数化的东西,包括语句中的表名?

security sql-server sql-injection dynamic-sql t-sql

4
推荐指数
1
解决办法
2705
查看次数

如何限制用户只能通过应用程序文本框字段选择查询?

假设我有一个 Web 应用程序,它允许用户输入 SQL 查询(SQL Server 2008+)。我希望用户能够运行任何 SELECT 查询并读取数据库中的任何内容,但我不希望他们能够插入/更新/删除/截断/执行等(简而言之:仅选择)。请注意,整个数据库中没有数据甚至数据库元数据被视为机密。

目前的规则:

  1. 不 ”;” 特点。如果它在那里,它必须正好是 1 并且位于修剪后的查询字符串的末尾。
  2. 查询必须以 select 开头(忽略大小写,空格是正则表达式的一部分)。
  3. 所有换行符都从查询中删除。

这够了吗?除了选择之外,还有什么办法可以做吗?

编辑:谢谢 Thomas Stringer 关于 SELECT ... INSERT 的说明。这正是我所追求的信息。我将从查询字符串中删除所有换行符,这应该有助于解决这个问题。有没有其他方法可以解决这个问题并能够修改数据?

注意:CTE 与这种情况无关。让我们假设查询必须以 SELECT 开头。

security sql-server sql-injection

3
推荐指数
1
解决办法
5042
查看次数

防止 SQL 注入

我知道这是非常危险的:

EXEC sp_executesql 'SELECT * FROM ' + @Table
Run Code Online (Sandbox Code Playgroud)

但是,这对 SQL 注入安全吗?

IF EXISTS(SELECT * FROM information_schema.tables WHERE TABLE_NAME = @Table) BEGIN
    EXEC sp_executesql 'SELECT * FROM ' + @Table
END
Run Code Online (Sandbox Code Playgroud)

sql-server sql-injection

3
推荐指数
1
解决办法
531
查看次数

连接这样的字符串是否会让我接受 SQL 注入?

我最近用以下代码示例回答了一个问题:

Create Table #Testing
(
  emaildomain varchar(100) -- Still bigger than functionally needed but better than MAX
);
INSERT INTO #Testing VALUES (REVERSE('@myfreepaysite.com')); -- Changed


Create Table #DataToCheck
(
  fullemail varchar(200) -- Still bigger than functionally needed but better than MAX
);
Insert Into #DataToCheck VALUES(REVERSE('rr1234@myfreepaysite.com')); --Changed

Select Top 1 
  REVERSE(fullemail)
  , REVERSE(emaildomain)
FROM #DataToCheck
  INNER JOIN #Testing ON fullemail LIKE emaildomain + '%';
Run Code Online (Sandbox Code Playgroud)

当我写最后一行时,我想知道EmailDomain用通配符连接列是否是 SQL 注入的开始。这是我应该注意这种类型的代码还是 SQL Server 会将其评估为单个统一参数以便我不必担心使用这种方法?

sql-server sql-injection

3
推荐指数
1
解决办法
118
查看次数

动态 SQL 查询 - 如何将 int 添加到代码中?

考虑:

Declare @stringsvar varchar(1000)
Declare @Emp_id int 
DECLARE  @strvar SYSNAME = 'Employee_test'

SET @stringsvar = ('select * from' + ' ' + @strvar + ' where emp_id' + ' =' + @Emp_id)
Print @stringsvar
Run Code Online (Sandbox Code Playgroud)

上面的查询给出了如下所述的错误:

将 nvarchar 值 'select * from Employee_test where emp_id =' 转换为数据类型 int 时,消息 245,级别 16,状态 1,第 17 行转换失败。

在这种情况下需要做什么?

sql-server sql-injection dynamic-sql t-sql

3
推荐指数
2
解决办法
601
查看次数

如何通过 psql \i 命令将参数传递给 sql 脚本

psql\i命令能够执行给定的 SQL 脚本,但我需要一种将参数传递给脚本的方法。

示例:假设您有这个简单的脚本

select * from :table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我试过了

my_db=> \i my-script.sql -v table="core.product"
Run Code Online (Sandbox Code Playgroud)

但出现这个错误

psql:my-script.sql:1: ERROR:  syntax error at or near ":"
LINE 1: select * from :table LIMIT 1;
                      ^
\i: extra argument "-v" ignored
\i: extra argument "table="core.product"" ignored

Run Code Online (Sandbox Code Playgroud)

我知道在终端上运行它会起作用,但我已经在 psql 中了。

psql -v table="core.product" -f my-script.sql
Run Code Online (Sandbox Code Playgroud)

postgresql sql-injection psql

3
推荐指数
1
解决办法
1万
查看次数