CTF-sql-mysql sql约束注入

create table user(
      id int not null auto_increment,
      username varchar(30) not null,
      password varchar(30) not null,
      primary key(id));

在现实的开发过程中,我们平常在各大网站上什么注册用户,登录用户什么的,就是与数据库进行交互的过程。如上图,有第一条命令进行创建了一个数据表,这个数据表,你就可以认为是用于你的用户名与密码储存的一个数据表(注意:在这个数据库中每条数据的大小都是有限制的,username与password都为30字节)。而所谓的注册操作,其本质就是数据插入的过程,如上图的第二条命令

如上图,我使用了三种方式来创造了用户admin,

  • 第一种:insert into user values ('','admin','12345');
  • 第二种:insert into user values ('','admin           ','123456')
  • 第三种:insert into user values ('','admin                  1’,’1234567’);

按道理来说这三种创造方式所创造的用户名是不一样的,但是从最后的查询结果上来看却是一样的(否则只会出现第一条),为什么呢?

原因是:第一种与第二种区别在于admin后面加了许多空格,但是再查询的时候,mysql会自动忽略掉空格,所以在查询admin的时候,由于忽略了空格,就把带有空格的admin也带了出来。而第三种与前两种相比还多了一个‘1’,但是为什么‘1’没有插入进去呢,前面我已经提示到我所定义的用户数据大小是有限制的,由于‘1’所在的字节已经大于了30字节,所以mysql会自动截掉30字节之后的数据,即‘1’被截掉了。之后的查询就与第二种一样了。根据这样的原理,就可以造成sql约束注入。


例如:有一道题是要使用admin用户才能查到flag,但是admin用户的密码我们并不知道,此时我们就可以使用sql约束注入尝试一下,先注册一个用户:

username:admin             1,#空格尽量多,用来超过规定的字节大小
password:123456                  #密码随便输

如果sql约束注入成功,超过规定字节大小的数据就会被截掉,即‘1’被截掉,那么就会在数据库中插入一个带空格的admin,由于在查询的时候会自动忽略掉空格,所以我们注册的冒牌admin就会起到与真正admin用户相同的作用,从而带出flag,%e6%b5%85%e6%98%93%e6%b7%b1

例题:bugku中的一道:http://123.206.31.85:49163/

posted @   浅易深  阅读(575)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示