SQL注入核心就是找注入点构造闭合,常见的闭合方式:
我们就以查询语句为例:select 字段 from 表名 where 条件 我们构造闭合基本上都是在条件处,分类也是按照条件所提供的句式来分类的我们以id=x,举例
- 数字型1:id=x,构造闭合 1 or 1=1 ==》 id=1 or 1=1
- 数字型2:id=(x)构造闭合 1) or 1=1 #==》 id=(1) or 1=1
- 字符型1:id=‘x’构造闭合 1’or 1=1 # ==》 id=‘1’ or 1=1
- 字符型2:id=“x”构造闭合 1”or 1=1 # ==》 id=“1” or 1=1
- 字符型3:id=(‘x’) 构造闭合1’) or 1=1 #==》 id=(‘1’) or 1=1
- 字符型4:id=(“x”) 构造闭合1”) or 1=1 #==》 id=(“1”) or 1=1
还有一种搜索类型,源码类似与:select 字段 from 表名 where 字段 like ‘%x%’
这中可以构造1%’ or 1=1 #
下列靶场演示因为类型已经确定就不再分析
Pikachu靶场:
数字型注入(POST)
我们随便选个数字用BURP抓个包
可以看到我们的传参在POST请求中,构造闭合id=1 or 1=1
提交之后可以看到返回了所以用户的信息
字符型注入(GET)
我们还是随便输入看返回值(1111)
构造闭合1’ or 1=1#后也返回了所以用户信息
搜索型注入
构造闭合1%’ or 1=1 #也是直接返回了所有用户信息
xx型注入
对于不知道是什么类型的构造不和方式,一般情况下我们也看不到后端的代码,最好的办法就是尝试,将你知道的方法都进行闭合尝试看结果,这里面就不再演示尝试闭合的过程了,1’) or 1=1 #
可以看到也是直接返回了所有信息
总结:
靶场的例子看似SQL注入非常简单,在真实情况下SQL注入是非常复杂和繁琐的,我们不知道类型,看不到后端源码,还有各种各样的SQL注入检测要绕过,所以要花大量的时间和精力去尝试所有的可能性,所以大家要牢记闭合的方法和技巧。