知识点
存在SQL约束攻击的网站,注册时通过数据库已有账户例如admin+大量空格,随意密码点击注册,后端先在数据库查找select,将已有账户扩充相同长度,已有账户与注册账户(有大量空格)不等,因为有效长度不同(已有账户扩充的长度不为有效长度),之后插入insert,截断注册账户的多余长度,但后面为大量的空格,由于在SQL里执行字符串处理时,字符串末尾的空格符将会被删除,所以最后插入的注册账户即为已有账户admin,密码成为注册时的密码,即可成功登陆。
补充:
简单来说:就是在注册页面通过大量空格来超过sql里的约束字符,令在读取用户名时,不用被查询到是重复用户名,达到越权。
在INSERT里,SQL会根据varchar(n)来限制字符串的最大长度。
1、如果字符串的长度大于“n”个字符的话,那么仅使用字符串的前“n”个字符.
2、在SQL里执行字符串处理时,字符串末尾的空格符将会被删除。
解题流程
0、打开网页,查看题目描述
hint:SQL约束攻击
1、分析进攻方法:
约束SQL注入的原理就是利用的约束条件,比如最长只能有15个字符的话,如果你输入的是abcdefghijklmnop(16位),那么保存在数据库里的就是abcdefghijklmno,那么别人用abcdefghijklmno注册一个用户名,就可以登陆。
还有一个可以利用的地方就是SQL在执行字符串处理的时候是会自动修剪掉尾部的空白符的,也就是说"abc"=="abc ",同样我们可以通过注册用户名为"abc "的账号来登陆"abc"的账号。
那就试着用"admin "注册了一个账号,用这个的密码登陆"admin"账号
2、注册账号,账号为"admin ",密码符合要求即可
3、登陆刚才注册好的账号:admin(注意不为admin,因为经过后台处理)加上注册输入的密码
4、得到flag:flag{dceb7d257aaf2f3663fe556a5a690123}