R1gelX`Blog

22 object(s)
 

SQL约束攻击

约束攻击的目的是任意用户登录,其攻击手段有点类似二阶注入,都需要向数据库插入一个特殊的数据。



在sql查询等时候,它会将返回结果根据varchar所设定的长度进行约束。

在INSERT增加数据的sql语句中,会针对每一个插入的value所在列所限制的字符长度进行约束
如果针对一个长度限制为10的 那么我们插入 abcde1234500 所插入的其实只有abcde12345

且sql进行查询时候,会对字符串结尾的空格进行删除(这个应该有版本限制)
因为我本地的版本特别高(8.0.25)之前为了测试一下过滤了select的注入(利用mysql8特性-table),测试约束攻击会失效,它会限制INSERT注入的数据长度,并且在查询的时候也不会忽略空格

约束攻击

我们利用这个特性,可以注册一个账户名为 test 1 的用户然后去登录test用户

由于本地暂时没装低版本的mysql,这里找一道题来复现这个知识点(bugku login1)

题目内容很少,给了hint:sql约束攻击。
然后猜测登录admin即可拿到flag,于是注册
username:admin ((空格空格)) xx
password:Qwe1234

然后构成的语句可能是: INSERT INTO users VALUES ('admin (空格空格) xx','Qwe1234');
由于 username 有 varchar长度限制,可能会被截取为:
INSERT INTO users VALUES ('admin (空格空格) ','Qwe1234');
又因为,sql会将末尾的空格去除,所以等同于:有两个admin。其中一个密码为我们设置的,
在登陆查询时直接登录admin,即可把我们注册的admin查询出来,并且登录
某种意义上相当于添加了admin的密码。然后用自己设置的密码去登录admin即可