Sql的一些简易学习记录
sql注入漏洞被利用的过程
sql注入是一种注入型漏洞,其本质是服务器把用户可控的数据拼接后当成sql语句执行。
客户端在可以控制的参数处构造sql注入语句并发送给服务器
服务器接收到客户端的数据后没有经过严格过滤处理,将其拼接到将要执行的sql语句中
数据库引擎执行服务器传来的sql语句,将结果返回给服务器
服务器接收到结果后进行一系列处理,之后返回内容给客户端
客户端接收到服务器返回的内容,根据内容判断注入结果和构造下一步的sql注入语句
sql注入的分类
按照上面sql注入的过程,
从客户端->服务端,可以分为:post注入、get注入、cookie注入、http头注入 …
从服务端->数据库引擎,可以分为:数字型注入、字符型注入 …
从服务端->客户端,可以分为:回显注入、盲注 …
按照SQL注入利用方法,又可以分为:联合查询注入、报错注入、布尔盲注、延时盲注、堆叠注入 …
虽然有很多种分类,但只要掌握到SQL注入的本质,这些不同类别的注入就都很好理解。
绕过登陆验证
1 | $username = $_POST['username']; |
1 | 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(列名)
1 | show datebase //查看当前所有数据库 |
当不能使用show时,可以使用 information_schema
库,来获取数据库信息
举例:
1 | //查询所有数据库名 |
1 | //查询制定数据库下的所有表名 |
1 | //查询指定表下的字段名 |