Sql的一些简易学习记录
sql注入漏洞被利用的过程
sql注入是一种注入型漏洞,其本质是服务器把用户可控的数据拼接后当成sql语句执行。
客户端在可以控制的参数处构造sql注入语句并发送给服务器
服务器接收到客户端的数据后没有经过严格过滤处理,将其拼接到将要执行的sql语句中
数据库引擎执行服务器传来的sql语句,将结果返回给服务器
服务器接收到结果后进行一系列处理,之后返回内容给客户端
客户端接收到服务器返回的内容,根据内容判断注入结果和构造下一步的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=1
中1=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='表名' ;