Sql的一些简易学习记录

sql注入漏洞被利用的过程

sql注入是一种注入型漏洞,其本质是服务器把用户可控的数据拼接后当成sql语句执行

  1. 客户端在可以控制的参数处构造sql注入语句并发送给服务器

  2. 服务器接收到客户端的数据后没有经过严格过滤处理,将其拼接到将要执行的sql语句中

  3. 数据库引擎执行服务器传来的sql语句,将结果返回给服务器

  4. 服务器接收到结果后进行一系列处理,之后返回内容给客户端

  5. 客户端接收到服务器返回的内容,根据内容判断注入结果和构造下一步的sql注入语句

sql注入的分类

按照上面sql注入的过程,
客户端->服务端,可以分为:post注入、get注入、cookie注入、http头注入 …
服务端->数据库引擎,可以分为:数字型注入、字符型注入 …
服务端->客户端,可以分为:回显注入、盲注 …

按照SQL注入利用方法,又可以分为:联合查询注入、报错注入、布尔盲注、延时盲注、堆叠注入 …

虽然有很多种分类,但只要掌握到SQL注入的本质,这些不同类别的注入就都很好理解。

绕过登陆验证

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "select * from users where username='".$username."' and password='".$password."'";

// 执行sql语句,判断查询结果
select * from users where username='admin' and password='' or 1=1#'

语句从users表中查询满足条件的内容,条件为username='admin' and password='' or 1=1(由于#在sql语句中是注释符,所以后面的单引号没有作用)
因为 sql 语句中or的优先级高于and,所以这里的条件可以改成username='admin' and (password='' or 1=1),后面的password='' or 1=11=1永远为真,所以条件语句又等价于username='admin' and 1=1,即username='admin'

所以,整个sql语句变成了select * from users where username='admin',从而达到以admin用户登录的目的。

有回显的注入

数据库增删改查需要用到schema(数据库名)、table(表名)、column(列名)

show datebase      //查看当前所有数据库
use 数据库名        //进入这个数据库
show tables       //查看这个数据库中所有表
show columns from 表名 //查看表中所有字段

当不能使用show时,可以使用 information_schema 库,来获取数据库信息

举例:

//查询所有数据库名
show datebase;
select schema_name from information_schema.shemata;
//查询制定数据库下的所有表名
show table from 数据库名;
select table_name from information_schema.tables where table_schema = '数据库名';
//查询指定表下的字段名
show column from 表名;
select column_name from information_schema.columns where table_name='表名' ;

参考

https://dar1in9s.github.io/2020/08/01/sql%E6%B3%A8%E5%85%A501-sql%E6%B3%A8%E5%85%A5%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/#%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86

https://dar1in9s.github.io/2020/08/07/sql%E6%B3%A8%E5%85%A502-%E6%9C%89%E5%9B%9E%E6%98%BE%E7%9A%84%E6%B3%A8%E5%85%A5/#mysql%E4%B8%AD%E7%9A%84information-schema%E6%95%B0%E6%8D%AE%E5%BA%93

评论