#注入三大点
可控变量
带入数据库查询执行
变量没有存在过滤或者过滤不严格
#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')的这种方式进行闭合