MYSQL注入基本知识-第一部分

#注入三大点

可控变量

带入数据库查询执行

变量没有存在过滤或者过滤不严格

#SQL注入分类

SQL注入分类两类: 数字型和字符型

数字型:当输入的参数为整数时,可以认为是数字型注入(但不是绝对的)

Select * from databaes. tables  where id=1

字符型:当输入的参数为字符串,或者是被' ” 单引号或者双引号包裹的内容,称为字符型 

Select * from databaes. Tables where id=”1”

如何判定是字符型输入还是数字型注入

1.使用and 1=1 和and  1=2 判断(数字型一般提交的内容为数字,但是数字不一定是数字型)

案例演示:

Sqlilabse  第一关 (判断是数字型还是字符型)

 使用and 1=2页面正常

Sqlilabse  第二关

 使用and 1=2 直接报错不回显

当你发现一个网站有注入点,(在未作任何过滤和防护措施的情况下)使用and 1=2检测不出来的原因

因为如果他是数字型的话,他的查询语句可能就是

Select * from databases.tables where ?id=3 and 1=2Select * from databases.tables where ?id=3 and 1=2  他是不成立的 页面就会返回错误

但是如果他是字符型查询的话

Select * from databases.tables where ?id=3 and 1=2Select * from databases.tables where ?id="3 and 1=2" 由于他被双引号包裹起来了,所以里面的and 他是不会被当中指令去对待的

总结:第一关提交 and 1=1 和提交and1=2 都能正常显示页面,则不可能是数字型注入,即为字符型注入。

       第二关,提交1=2 条件无法满足,语句无法被数据库查询到,页面无法正常显示,判断为数字型注入

2.使用 "-"号查询

数字型演示:

 

留意?id=3

 页面显示名称Dummy

直接在?id=3-1

如果他是数字型的话他就会查询id=2的界面

因为3-1=2

如果界面变化的话确定他就是数字型注入,如果页面没有变动的话则是字符型注入

 

此时页面的内容变了

Name:Angelina了  

确定他是数字型

字符型演示:

 确定name:Dunmmy

输入3-1

界面:Dummy

不变动

确定属于字符型

总结:当你不确定他是数字型还是字符型的你就使用“-"号进行判断,因为如果是字符型的话他会进行运算,所以3-1他就会运算2,查询到2的的结果,后返回界面。但是字符型不会进行运算

注意:最好不要使用“+”号,因为加号有的时候可能会被理解成空格

#闭合 

1.闭合的方式

'     ''     ')     ")      '))   "))

2.闭合的作用 

手工提交闭合符号,结束前一段的查询语句,后面即可加入其他语句,查询需要的参数不需要的语句可以用注释符注释掉

假如说是一个字符型的注入点

sql语句:select * from databatase.tables where id="3" 

如果不使用闭合的话我们构造的sql语句就是

sql语句:select * from databatase.tables where id="3 and 1=1"

这样我们的注入语句就执行不了他的作用,因为他被双引号进行了包裹。

使用闭合的

sql语句 :sql语句:select * from databatase.tables where id="3 "and 1=1  --+

蓝色为他自带的双引号,红色为我们输入的双引号,我们使用红色的双引号,提前让他闭合

就可以让后面的and 1=1的语句不受扰干扰 可以进行正常的测试,则后面他自带的蓝色双引号由于被我们注释掉了,所以发挥不了作用了

3.注释 

注释符:   "--+"     " # "    "%23"   "/**/"  "--%20"

内练注释: /*!  SQL语句 */ 只有mysql可以进行识别,常用于绕过waf

例如:select *from databases.tables where id=1 

使用内联注入:select *from databases.tables where id=-1  /*! union*/ /*!select*/ 1,2,3,4 

       注释掉:利用注释符号暂时将程序段脱离运行。

                    把某段程序"注释掉",就是暂时不运行(而非删除掉)

案例演示:

sqlilabs-第一关

 就像这个第一关,他是字符型注入,我们输入' 他报错

猜测他的SQL语句:

Select *from databases.tabel wehre id="3' "

 我们就可以把他自带的"注释掉

猜测Sql语句:

Select *from databases.tabel wehre id="3 ' --+ "

就变成只有一个 ’ 单引号

 此时就可以书写我们后面的sql语句,判断是否有注入点了

Sql语句

Select *from databases.tabel wehre id="3 'and 1=2 --+"

#判断闭合方式

1.通过报错回显

具体查看https://mp.csdn.net/mp_blog/creation/success/129761719

 随便丢个单引号或者随便丢个双引号进去

把报错的信息拿出来

分析报错原因

首先绿色的单引号前面和后面的他们是一个对应关系,他们是一对

红色部分又为一对

最后只剩一个单引号 他找不到另外一个双引号所以报错

因为他的原语句是 ' '3' ' limit 0,1

3左右两侧的位置是' ' 使用单引号进行包裹的确定他是字符型,使用单引号进行闭合

2.判断闭合方式(通过盲注,没有报错信息显示)

首先先判断页面正常的情况 id=1正常的 

随便丢进去个单引号,页面报错 

在?id=1 ' 后面加入--+让他注释掉后面的

猜测原sql语句 select * from databases.tables where id='1'

猜测sql注入语句 select * from databases.tables where id='1'--+' 

代表让我为单引号的时候页面错误相当于故意让他出错,他查询不出来,因此我们页面为假。

当我把单引号去掉的时候他的页面为真。还有的话就是把多余的界面注释掉

现实情况下,你就只能一个一个的对比去猜测特殊。比如说

测试语句

http://127.0.0.1/sqli-labs-master/Less-8/?id=1'
http://127.0.0.1/sqli-labs-master/Less-8/?id=1"
http://127.0.0.1/sqli-labs-master/Less-8/?id=1')
http://127.0.0.1/sqli-labs-master/Less-8/?id=1")

看哪个报错,再把报错的语句单独拿出来

在进行测试比如 

http://127.0.0.1/sqli-labs-master/Less-8/?id=1') --+

在把后面的内容使用--+去注释掉,看看页面是不是正常回显。如果是的话就确定他是使用

('1')的这种方式进行闭合

猜你喜欢

转载自blog.csdn.net/m0_72755466/article/details/129743910
今日推荐