SQL注入之报错注入学习笔记

一、报错注入的原理和要求

原理:攻击者通过各种手段使程序报错,爆出相应数据信息。

要求:程序员在网站程序中把SQL的错误输出到了页面上。(此后就被不法分子利用咯!)

怎么理解报错注入呢?

程序员把SQL错误输出到页面上,原意本身是调试或提醒用户的,可是却被hacker利用咯!

二、相关函数

  • concat(str1,str2):将字符串进行拼接。
  • concat_ws(separator,str1.str2):将字符串用指定连接符连接。
  •  count(*)函数作用为统计结果的记录数。
  • group by 函数:分类汇总。
  • updatexml(XML_document,XPath_string,new_value):查找一个字符串,并进行替换。(先进行查询再进行报错)

          第一个参数XML_document:xml文档名称。

          第二个参数XPath_string:xpath格式的字符串。

          第三个参数new_value:替换查找到的符合条件的数据。

  • extractvalue(xml_str,Xpath)

         第一个参数的意思是:传入xml文档

         第二个参数的意思是:传入文档的路径

  • floor():返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
  • rand(0)

在这里再说一下rand()、rand(0)的区别。

rand()可以生成0到1之间的随机数。

 rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成,我们可以在数据库中尝试一下。

首先测试rand()

  SQL注入之报错注入学习笔记_第1张图片

  我们再测试一下rand(0)的效果

  SQL注入之报错注入学习笔记_第2张图片

 

 

为什么输出的数字都是0、1呢?

floor (rand(0)*2)函数
floor函数的作用就是返回小于等于括号内该值的最大整数。
rand()本身是返回0~1的随机数,但在后面*2就变成了返回0~2之间的随机数。
配合上floor函数就可以产生确定的两个数,即0和1。

 

三、注意事项

  1. 必须在xpath那里传入特殊字符,mysql才会报错。这里可以利用~,16进制的0x7e来进行利用。
  2. 注出数据时多使用concat函数。
  3. xpath只会报错32个字符,所以要用到substr()函数。(PS:substr()函数是位置从1开始,截取字符串的函数)

四、报错注入的利用

  1. 爆出当前网站的数据库
  2. 爆出mysql的版本(栗子在下面)
  3. 爆出所有数据库
  4. 爆所有的表

五、实战

相信大家在学的时候都会看到一个类似于公式的语句,这个语句是基于floor()的报错SQL语句

  • floor()报错注入

floor()报错注入中floor()、group by、rand(0)三个函数缺一不可。

select count(*),(concat(floor(rand(0)*2),(select version())))x from user group by x;

 当count(*)和group by x同时执行时,就会爆出duplicate entry错误。

  • union报错注入
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

SQL注入之报错注入学习笔记_第3张图片 

  • xpath报错注入:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+

SQL注入之报错注入学习笔记_第4张图片

http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+

 SQL注入之报错注入学习笔记_第5张图片

 

六、报错注入的Bypass

过滤了information_schema

如果过滤了information_schema,则无法获取表名。利用polygon()进行绕过,polygon(可能存在的列名),一般都有id这个列名,即可爆出表名。

可看出图中爆出了users这个表名。

SQL注入之报错注入学习笔记_第6张图片

参考博客:https://www.cnblogs.com/richardlee97/p/10617115.html 

                  https://www.cnblogs.com/lcamry/p/6122257.html

                  https://www.cnblogs.com/c1047509362/p/12806297.html

你可能感兴趣的:(WEB漏洞)