?id ?是查询参数分隔符
?后端sql查询用来筛选记录的条件
?id=1是查询id=1的那行数
结束都要写%23或者#,#以后的内容不执行sqlz注入漏洞的攻击的目标就是窃取数据
数据源来自系统表:information_schema.tables
information_schema.tables 这张系统表里,有很多内置字段:
table_name:表的名字
table_schema:数据库库名
我们现在的目标:找出 security 库里面所有的表叫什么
所以取这张表的 table_name 字段,group_concat() 把多个表名拼接成一行输出到回显位。
column_name:代表字段(列)的名字
查库名:database() → 得到 security
查表名:group_concat(table_name) → 得到 users 等表
查字段名:group_concat(column_name) → 得到 username,password
脱数据:直接查询 username,password,拿到账号密码
group_concat(xxx),括号里面填什么,取决于你想要拿系统表里的哪一个字段。
拿表名就填table_name;拿列名就填column_name。UNION 的作用:把两条 select 查询的结果合并到一起。
所以UNION 后面必须再接一个完整的 SELECT。
第一条 select:正常查 users,id=-1 查不到任何东西
第二条 select:我们自己写的查询,用来读系统库拿表名
union 把两个查询结果合并,页面就显示第二条 select 的输出
记住硬性规则:
union 前后两个 select,返回的列数量必须一模一样。前面 3 列,后面 select 后面就要写 3 个东西。为什么第一题单引号测试时候要用#,第四题双引号不用,而且双引号是直接报错才认为是有的
?(1)(存疑)与前面是同类符号才有可能跳出原来的语法,只有和容器一模一样的引号,才能打破字符串、产生报错,实现注入
(2)模拟 MySQL 一行一个字符读取解析 SQL:
读到 " → MySQL:开启字符串模式!接下来所有字符全部当成普通文本,直到再次遇到 "
读到 1 → 普通文本
读到你输入的 " → MySQL:找到结束引号!字符串到此终止,退出字符串模式!
继续向后读取,下一个字符:后端自带的 "
👉 现在状态:已经不在字符串里面了,突然单独出现一个游离的 "
MySQL 语法规则:单独放一个无配对的引号,属于非法语法 → 抛出报错!
url就是网页地址,记录访问的服务器位置、资源路径
过滤就是后端程序员把输入语句拼金sql语句前,先检查并处理特殊字符,让他没法闭合原本字符串,
sql是结构化查询语言,专门用来做数据交互,后端就是用拼接好的sql语句区查询的
把查询逻辑插入执行语句,就拿到控制权,
怎么过过滤?
查字段原因
防护时候要把单引号转义成两个双引号,要么直接过滤掉这些胡改变sql结构的字符