请勿截屏传播

SQL注入基础知识

1-1 SQL注入的概念

📚 什么是SQL注入?

简单的说,你可以通过某种方式,执行你想要执行的非功能预期的其他SQL语句。这种攻击方式,我们称之为SQL注入。

1-2 分辨数字和字符

📚 SQL注入判断的基础知识点

在 SQL 注入与 SQL 查询语句中,数据类型的不同会影响参数的书写方式:

1. 如果查询的是数字类型的数据(如 id),传入参数时可以直接写数字,无需引号,例如:
select * from users where id = 1

2. 如果查询的是字符串类型**(如用户名、邮箱等),必须用单引号或双引号将输入内容括起来,例如:**
select * from users where username = '小明'

这样做是为了告诉数据库:引号包裹的内容是一个完整的字符串,否则 SQL 会解析报错。
例如: 如果你写成 select * from users where username = 小明 数据库会提示类似 语法错误 (You have an error in your SQL syntax) ,因为没有用引号包裹字符串,SQL 解析失败。 小总结: 只有数字可直接写,字符类(如姓名、邮箱、地址等)都要被引号包裹。

注意:上述区分“数字无需引号/字符串必须加引号”的规则,仅是一般情况,目的是保证SQL正常工作和避免语法错误。

select * from users where id = 1
select * from users where id = '1'

上面两条SQL都能查到id为1的用户,因为数据库会自动把'1'当作数字1。

1-3 SQL注入判断方法论

📚 SQL注入判断的方法论

我们做任何事情都是有方法的,这种规律我们一般称之为方法论。

重点 SQL注入的判断过程称之为FUZZ。 你可能不知道什么是FUZZ,简单来说,就是不停地“猜”,直到猜对为止。

1-4 闭合+注释

📚 字符串SQL语句怎么闭合

我们刚才学习了怎么区分数字字段和字符串字段。比如下面的 SQL,如果是根据用户名查询用户信息,用户名(username)是一种典型的字符串类型,所以在 SQL 查询时必须用引号包裹输入值:

select * from users where username = 'username(用户输入的内容)'

你可以在右边的练习框进行练习
假设你输入的是 小明' ,那拼接 SQL 时就变成:

select * from users where username = '小明''

这个时候,前面的 单引号 正好把 username 的字符串闭合了

🔒 注释的妙用

在SQL语句中,注释是一种“让数据库忽略”某些内容的技巧。

常见的注释写法有:

  • -- 空格:从这之后,直到行末,内容都被当成注释
    (注意,**--**后面需要加一个空格)
  • #:从这里直到行末也被注释(MySQL支持)

举个例子:

select * from users where username = '小明' --

这样写,**--**后面的内容就不会被数据库执行。

假设你输入的是 小明' -- ,那拼接 SQL 时就变成:

select * from users where username = '小明' -- '

这时候你输入了 小明' -- ,查询语句变成了上面的样子。
第一个单引号 把 username 字符串正确闭合,-- 把后面的 多余内容全注释掉,SQL 不会报错

1-5 and判断法

📚 判断是否存在SQL注入的核心要素

重点 判断是否有SQL注入的核心:
观察“页面数据”返回内容的差异,判断自己构造的SQL语句是否真正被执行
这里虽然以“页面”为例,但实际上也可以通过 数据包时间 等其他异常来判断(不过本小节只关注页面返回)。

**前置知识:**我们之前学习了在SQL注入测试中,像 and 1=1 和 and 1=2 这样的语句片段——

  • 如果加上 and 1=1 查询结果不变。
  • 如果加上 and 1=2 查询结果为空,说明我们成功影响了SQL查询。

这就是“注入判断”的基础: 通过人为拼接SQL条件,观测结果上的差异,从而确认是否可以注入!

🖼️ and的具体使用

原始SQL语句:
select * from users where username = 'username(用户输入的内容)'

注: 我们根据上一关卡,学到的内容,注入了 小明' --

现在系统里执行的语句是
select * from users where username = '小明' --'

and 1=1 与 and 1=2 的利用:
比如在 username 后输入 ' and 1=1 --' and 1=2 -- ,拼接后的SQL分别如下:

select * from users where username = '小明' and 1=1 -- select * from users where username = '小明' and 1=2 --

现象: and 1=1 显示正常结果,and 1=2 没有结果或为空,说明我们拼接进去的SQL子句真的被执行了。
这正是判断是否存在SQL注入的核心方法之一!

1-6 数字类型的判断

📚 数字型判断SQL注入有什么特殊的点吗

知识点:
数字类型注入的核心点就是,不需要“闭合”引号!

对比字符串类型,数字类型在SQL语句中本来就不用单引号包裹,比如:
select * from users where id = 7

我们最终的测试语句如下:

select * from users where id = 7 and 1=1

select * from users where id = 7 and 1=2

只需要直接在 数字后面加 and ... 检查响应结果是否有差别,就能判断此处是否存在注入风险。

所以测试SQL注入时,可以直接在数字后拼接,比如 and 1=1and 1=2,无需考虑引号闭合,也更容易构造注入语句!

小结:数字型注入直接拼接条件,无需闭合引号,是初学者最容易上手的注入方式之一。

Tips:为什么数字型注入时,不需要使用注释?

  • 数字型参数后面本身没有引号,所以直接拼接 and ... 就可以继续SQL语句,不会引起语法错误。
  • 只有在字符串型注入时,破坏了引号配对,往往才需要注释符闭合(如-- 或 #),来防止后面多余的SQL语句报错。
  • 结论:数字型注入无需加注释,因为SQL拼接没有剩余引号或内容,无需担心语法问题。

1-7 学习总结

📚 学习总结

  • SQL注入的根本目的:目的是绕过网站身份验证,其本质是“让后端执行了本不该执行的SQL语句”。
  • 数字型和字符型的区别:数字型注入点直接拼接数值,不需要引号包裹;字符型注入点会拼接在引号之中,注入时需“闭合字符串”并用注释去除尾部内容。
  • 判断SQL注入的方法论:通过构造不同的输入,辨别是否存在注入点。例如:字符型用' and 1=1 -- ,数字型用1 and 1=1

🎯 小知识

  • SQL注入通常从数据拼接方式角度,分为:
  • 数字型注入 :参数为纯数字,直接拼接进SQL,不加引号,注入时方法直接拼写payload。
  • 字符型注入 :参数会被单/双引号包裹,注入时需自己用' -- 闭合字符串并注释尾部内容。
  • 除此之外,还有其他的一些分类方式,我们就不在本节进行说明了。

8.SQL注入之万能钥匙

1.?参数 = 1 or 1=1(无限制)

2.?参数 =1 or 1=1--+ 或者?参数 =1 or 1=1%23(需要加注释绕过)

在mysql语言里--+和#可以给代码加注释 例如:query="selectnamefromuserswhereid=".query = "select name from users where id = "._GET'id';" limit 1"; 这里给了限制只能获取一组数据,如果加了--+或者%23就会把" limit 1";变成注释,就读取不到有限制的代码,从而获取数据库里的所有数据 注:%23是#的url编码

时间盲注
MySQL基础语法

评论区

评论加载中...