• CTF-sql-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/

  • 相关阅读:
    事务管理
    QQ邮箱开启SMTP方法如何授权
    基于JavaMail的Java邮件发送:简单邮件发送
    Spring MVC 响应视图(六)
    Spring MVC 数据绑定 (四)
    Spring MVC Spring中的Model (五)
    Spring MVC 拦截器 (十)
    Spring MVC 异常处理 (九)
    Java 骚操作--生成二维码
    Java MD5校验与RSA加密
  • 原文地址:https://www.cnblogs.com/02SWD/p/CTF-sql.html
Copyright © 2020-2023  润新知