我的 ASP.NET 网站遭到 SQL 注入攻击
My ASP.NET Website is Attacked With SQL Injection
黑客入侵了我的数据库用户列表和其他 tables。
首先,我在所有交易中使用参数化命令
command.Parameters.Add("@Parameter1", SqlDbType.NVarChar).Value
所有事务都是存储过程。
我正在将每个站点导航插入数据库。具体数据库table如下;
ID int (PK)
UserID int (null)
URL nvarchar(500)
IPAddress nvarchar(25)
CreatedAt datetime
项目从代码中获取 UserID
会话是否打开的信息。
CreatedAt
是 DateTime.UtcNow
。
IPAddress
代码如下:
public static string GetIPAddress(HttpContext context)
{
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
return addresses[0];
}
return context.Request.ServerVariables["HTTP_CLIENT_IP"] ?? context.Request.ServerVariables["REMOTE_ADDR"];
}
但是 URL
是从 Website Current URL 中用所有查询字符串填充的。 (Request.RawUrl
)
通常情况下,当用户访问该站点时,日志会像我上面所说的那样插入到数据库中。正常插入以下记录。示例数据如下所示:
ID UserID URL IPAddress CreatedAt
1 NULL /User 1.22.33.444 2019-12-12 16:22:33.441
2 NULL /User/MyOrders 1.22.33.444 2019-12-12 16:24:33.441
3 NULL /User?utm_source=email 1.22.33.444 2019-12-12 16:29:33.441
黑客以某种方式向数据库中插入了一条记录,如下所示:
ID UserID URL IPAddress CreatedAt
4 NULL /User (select(0)from(select(sle 2019-12-12 17:22:33.441
5 NULL /User/MyOrders -1; waitfor delay '0:0:9' 2019-12-12 17:24:33.441
6 NULL /User?utm_source=email prvNA0R6'; waitfor delay 2019-12-12 17:29:33.441
7 NULL /User?utm_source=email -1' OR 2+198-198-1=0+0+0+ 2019-12-12 17:29:33.441
如您所见,IPAddress
列是 SQL 查询攻击。 IPAddress
字段限制为 25 个字符长度。以下 SQL 查询文本被 SQL.
截断
在我看来,黑客通过使用 SQL 注入通过将 URL
或 IPAddress
更改为 SQL 脚本来获取数据库记录。
知道黑客是如何进入我的数据库的以及如何从现在开始避免攻击吗?
编辑
存储过程如下:
create procedure SP_InsertLogNavigation
@URL nvarchar(150),
@UserID int,
@IPAddress nvarchar(25),
@CreatedAt datetime
as
insert into LogNavigation (URL, UserID, IPAddress, CreatedAt)
values (@URL, @UserID, @IPAddress, @CreatedAt)
存储过程的用法如下:
public bool Save(LogNavigation logNavigation)
{
int affectedRows = 0;
InitializeSqlFields("SP_InsertLogNavigation");
command.Parameters.Add("@URL", SqlDbType.NVarChar).Value = logNavigation.URL;
command.Parameters.Add("@UserID", SqlDbType.Int).Value = Validation.IsNull(logNavigation.UserID);
command.Parameters.Add("@IPAddress", SqlDbType.NVarChar).Value = logNavigation.IPAddress;
command.Parameters.Add("@CreatedAt", SqlDbType.DateTime).Value = logNavigation.CreatedAt;
try
{
Connect();
affectedRows = command.ExecuteNonQuery();
}
catch (SqlException)
{
}
finally
{
Disconnect();
}
return affectedRows != 0;
}
所以我断言您实际上 而不是 屈服于 SQL 注入攻击。如果您仅使用参数化查询,则攻击者已尝试获取访问权限但失败了。
但是,您的 table 提出攻击尝试的原因与以下代码行有关:
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
return context.Request.ServerVariables["HTTP_CLIENT_IP"] ?? context.Request.ServerVariables["REMOTE_ADDR"];
您必须了解 客户端 几乎可以完全控制提交到您网站的 header。攻击者可以将 headers 修改为他们想要的任何值。
这些参数由客户在他们的请求中提供:
HTTP_X_FORWARDED_FOR
REMOTE_ADDR
HTTP_CLIENT_IP
在您的案例中,攻击者提供了包含 SQL 注入代码的欺骗性 header,您已将其忠实地放入数据库的 IP 地址列中。
在评论中编辑以下 OP 查询
OP 提问:
Excellent, but I have only one question. How she/he passed more than
25 characters to the my server side
请求 headers 没有指定的大小限制,尽管它们是各种实现应用的实际限制(即 Apache 中的 8Kb)。客户端可以发送 header 任意长度 的请求,最多可以达到您的网站托管软件所允许的长度。
但是,由于您的 SP 配置了最大长度为 25 个字符的参数,因此在持久化到数据库时,溢出的文本将被截断。
黑客入侵了我的数据库用户列表和其他 tables。
首先,我在所有交易中使用参数化命令
command.Parameters.Add("@Parameter1", SqlDbType.NVarChar).Value
所有事务都是存储过程。
我正在将每个站点导航插入数据库。具体数据库table如下;
ID int (PK)
UserID int (null)
URL nvarchar(500)
IPAddress nvarchar(25)
CreatedAt datetime
项目从代码中获取 UserID
会话是否打开的信息。
CreatedAt
是 DateTime.UtcNow
。
IPAddress
代码如下:
public static string GetIPAddress(HttpContext context)
{
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
return addresses[0];
}
return context.Request.ServerVariables["HTTP_CLIENT_IP"] ?? context.Request.ServerVariables["REMOTE_ADDR"];
}
但是 URL
是从 Website Current URL 中用所有查询字符串填充的。 (Request.RawUrl
)
通常情况下,当用户访问该站点时,日志会像我上面所说的那样插入到数据库中。正常插入以下记录。示例数据如下所示:
ID UserID URL IPAddress CreatedAt
1 NULL /User 1.22.33.444 2019-12-12 16:22:33.441
2 NULL /User/MyOrders 1.22.33.444 2019-12-12 16:24:33.441
3 NULL /User?utm_source=email 1.22.33.444 2019-12-12 16:29:33.441
黑客以某种方式向数据库中插入了一条记录,如下所示:
ID UserID URL IPAddress CreatedAt
4 NULL /User (select(0)from(select(sle 2019-12-12 17:22:33.441
5 NULL /User/MyOrders -1; waitfor delay '0:0:9' 2019-12-12 17:24:33.441
6 NULL /User?utm_source=email prvNA0R6'; waitfor delay 2019-12-12 17:29:33.441
7 NULL /User?utm_source=email -1' OR 2+198-198-1=0+0+0+ 2019-12-12 17:29:33.441
如您所见,IPAddress
列是 SQL 查询攻击。 IPAddress
字段限制为 25 个字符长度。以下 SQL 查询文本被 SQL.
在我看来,黑客通过使用 SQL 注入通过将 URL
或 IPAddress
更改为 SQL 脚本来获取数据库记录。
知道黑客是如何进入我的数据库的以及如何从现在开始避免攻击吗?
编辑
存储过程如下:
create procedure SP_InsertLogNavigation
@URL nvarchar(150),
@UserID int,
@IPAddress nvarchar(25),
@CreatedAt datetime
as
insert into LogNavigation (URL, UserID, IPAddress, CreatedAt)
values (@URL, @UserID, @IPAddress, @CreatedAt)
存储过程的用法如下:
public bool Save(LogNavigation logNavigation)
{
int affectedRows = 0;
InitializeSqlFields("SP_InsertLogNavigation");
command.Parameters.Add("@URL", SqlDbType.NVarChar).Value = logNavigation.URL;
command.Parameters.Add("@UserID", SqlDbType.Int).Value = Validation.IsNull(logNavigation.UserID);
command.Parameters.Add("@IPAddress", SqlDbType.NVarChar).Value = logNavigation.IPAddress;
command.Parameters.Add("@CreatedAt", SqlDbType.DateTime).Value = logNavigation.CreatedAt;
try
{
Connect();
affectedRows = command.ExecuteNonQuery();
}
catch (SqlException)
{
}
finally
{
Disconnect();
}
return affectedRows != 0;
}
所以我断言您实际上 而不是 屈服于 SQL 注入攻击。如果您仅使用参数化查询,则攻击者已尝试获取访问权限但失败了。
但是,您的 table 提出攻击尝试的原因与以下代码行有关:
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
return context.Request.ServerVariables["HTTP_CLIENT_IP"] ?? context.Request.ServerVariables["REMOTE_ADDR"];
您必须了解 客户端 几乎可以完全控制提交到您网站的 header。攻击者可以将 headers 修改为他们想要的任何值。
这些参数由客户在他们的请求中提供:
HTTP_X_FORWARDED_FOR
REMOTE_ADDR
HTTP_CLIENT_IP
在您的案例中,攻击者提供了包含 SQL 注入代码的欺骗性 header,您已将其忠实地放入数据库的 IP 地址列中。
在评论中编辑以下 OP 查询
OP 提问:
Excellent, but I have only one question. How she/he passed more than 25 characters to the my server side
请求 headers 没有指定的大小限制,尽管它们是各种实现应用的实际限制(即 Apache 中的 8Kb)。客户端可以发送 header 任意长度 的请求,最多可以达到您的网站托管软件所允许的长度。
但是,由于您的 SP 配置了最大长度为 25 个字符的参数,因此在持久化到数据库时,溢出的文本将被截断。