知识点:
万能密码'='
一道登陆型的 SQL 注入题目, 这种题目一般有四种题型:
1. 在 username 中通过 union 联查 select 一个已知字符来与传递的 password 匹配完成登陆
2. 使用万能密码登陆
3. 通过 SQL 注入获取数据库中的账号密码然后登陆
4. 通过 SQL 注入直接获取数据库中的 flag
后台处理逻辑一般有两种:
1. 同时使用两个字段值来查询数据库, 错误回显一般是 "用户名或密码错误" 之类的统一报错
2. 先使用 username 查询数据库得到 password, 再进行对比, 错误回显一般是 "用户名不存在","密码错误" 之类的分开报错
首先直接试了一下万能密码
- 1'or'1'='1
- 1 or 1 = 1
发现 or 被过滤了
换成大写, 大小写混合都不行
还过滤了# -- select 等
没有被过滤的有 ' =
猜解 SQL 语句
select xxx from xxx where username=''and password=''
select ,,, from ,,, where username='xxx'=''and password='xxx'=''; 这是一个永真的式子
方法二:
这里提一下另外一种解法, 因为常用的 or,||,union 之类的关键词都被吃掉了的原因, 这里使用的是异或字符 ^ 来进行确认的.
传入 username=1\&password=^'1, 如果后台是第二种处理逻辑, 那么 SQL 语句就会是:
select ??? from ??? where username='1\' and password='^'1'通过转义符 \ 转义 username 的第二个单引号, 在 SQL 运算中, 会先进行异或运算. 此时 username 的值为 1\' and password=, 而这个字符串跟 1 相等, 异或为 0, 所以最后的 SQL 语句为 select ??? from ??? where username=0, 而 0 会匹配所有第一个字符不为数字的字符串.
结果:
通过转义符 \ 转义 username 的第二个单引号, 在 SQL 运算中, 会先进行异或运算. 此时 username 的值为 1\' and password=, 而这个字符串跟 1 相等, 异或为 0, 所以最后的 SQL 语句为 select ??? from ??? where username=0, 而 0 会匹配所有第一个字符不为数字的字符串.
部分内容转自: https://www.jianshu.com/p/bc4a506ffebd, 感谢分享
来源: http://www.bubuko.com/infodetail-2990240.html