基于约束的SQL攻击

基于约束的SQL攻击原理:
没有将字段设置为唯一字段,导致可以利用mysql会略去空格(前提:空格后面没有字符)这一特性,查询或插入敏感信息

先创建一个user表,定义三个字段(id、username、password)

CREATE TABLE user(
id INT NOT NULL auto_increment,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
PRIMARY KEY(id));

id:int型,非空,自动增加
username:30个字符长度,非空
password:30个字符长度,非空
主键是id
基于约束的SQL攻击_第1张图片
向user表中插入数据,假设插入如下所示数据

insert into values ('','admin','123456');

基于约束的SQL攻击_第2张图片
常见的查询语句:

select * from user where username='admin';

基于约束的SQL攻击_第3张图片
但注意,我们使用select * from user where username='admin ';查询时,依旧可以查询到数据,为什么呢?因为,mysql会略去空格去查询
基于约束的SQL攻击_第4张图片

我们上面创建了一个表,username限制的位数是30位,但如果我们插入31位数据呢?它会自动将30位后面的数据自动删去
假设我们向user表中插入数据,Mysql先查询该数据是否存在于数据库中,不存在才会插入
例:
SQL语句:
insert into user values ('','adminadminadminadminadminadmink','123456');
结果插入成功,并且发现,插入的username为adminadminadminadminadminadmin,第31位的k被删去了
基于约束的SQL攻击_第5张图片
注:此时去查询adminadminadminadminadminadmink是不存在的
如:
在这里插入图片描述

所以我们可以利用这一特性,插入一个和第一个admin同名不同密码的admin
例:
基于约束的SQL攻击_第6张图片
只要记住三点:
①不管sql查询还是插入,都会略去空格(前提:空格后面没有字符)
②插入数据时,先查询该username在数据库中是否存在,不存在,则插入
③插入数据时,会删去高出限制的字符
insert into user values ('','admin 1','peak');的执行流程:
(1)先查询username为admin 1在数据库中是否存在,结果不存在
(2)将admin 1插入到数据库中,因为username限制为30位,所以插入时删除1,插入admin,又因为插入数据时会略掉空格,所以最终插入的username为admin,查询admin时,会出现两个数据,如下
基于约束的SQL攻击_第7张图片
注:这里可能有人要问,sql查询时也会略去空格,那么你查询admin 1时怎么没有略去,因为空格后面有字符1,所以不能略去;而且user表的30位长度限制,是限制插入数据的,所以user表中不可能存在超过30位的username,你现在查超过30位的username,user表中怎么可能存在,所以可以进行下一步,也就是插入数据。

实例:
基于约束的SQL攻击_第8张图片
1、随便注册个账号,发现如下所示
基于约束的SQL攻击_第9张图片
2、看来需要获取管理员权限,题目提示这里存在sql约束攻击,根据题目示意,我们应该可以注册一个admin的管理员账号,密码自己设定
基于约束的SQL攻击_第10张图片
这个原理简单再说下,你既然要注册,那么注册时,肯定会判断你注册的用户名是否存在,存在是不可以注册的,不存在才可以注册,这里注册的用户名为admin无数个空格1,数据库在判断该用户名是否存在时,肯定是不存在的,所以可以注册;关键是插入注册的数据时,因为无数个空格,超过了用户名长度的限制,所以最后的sql插入语句为admin无数个空格,插入时再略去空格,最后成功插入admin
3、以admin登录,密码自己刚设置的,即可获得flag
基于约束的SQL攻击_第11张图片

你可能感兴趣的:(Web常见漏洞分析)