今天一早,刘谦在微博上大呼“恐怖”,仔细一看,原来是他的密码被泄露,被人恶意地发了微博。

事件的发布者游侠安全网表示,这次的攻击并不针对刘谦本人,而是有一个漏洞,可以使坏人窃取到所有新浪用户的密码。攻击的原理是通过新浪爱问的页面中的SQL注入漏洞来完成,理论上可以获取所有新浪爱问用户的密码,由于新浪旗下的服务共享账号,所以新浪微博的用户也会受到牵连。
新浪爱问随即发表微博:由于新浪爱问存在系统漏洞,可能导致约30万登录过爱问的新浪帐号存在被盗号风险,我们已紧急修复此漏洞。这批帐号已被保护,需修改密码后才能使用。由此给用户带来的不便,我们深表歉意。近期账号安全问题突出,我们再次提醒广大用户注意账号安全。
由此,我们可以得知,新浪内部也是使用明文保存密码的。如果你的微博被盗了,不必感到奇怪,明文存储的谁都能看到……
接下来说说SQL注入(SQL Injection),这是一个什么样的攻击方式呢?在网站设计中,查询关系型数据库一般会使用SQL语言,查询语句一般是(继续拿刘谦同学作例子):
Select 用户信息 From 数据库 Where 用户名=’刘谦‘ And 密码=’刘谦的密码’
表示从数据库中查找用户名是刘谦并且密码是刘谦的密码的用户,如果存在这样的用户,就输出他的信息。用户名和密码都是用户输入的。看上去没什么大问题,但是由于编程语言层面的一些缺陷,使坏人有了可乘之机。比方说,如果有人故意把用户名写成刘谦‘ Or ’1′=’1,这样整句查询就变成了:
Select 用户信息 From 数据库 Where 用户名=’刘谦‘ Or ’1′=’1‘ And 密码=’刘谦的密码’
这样的话,由于’Or’的优先级较低,后面半句语句可视为不起作用,然后这个查询就等价于:
Select 用户信息 From 数据库 Where 用户名=’刘谦‘
其意义就是从数据库中查找用户名是刘谦的用户,这样就必然可以查找出刘谦同学的资料了,包括密码。当然在实践中,对SQL语句的构造方法要复杂得多,这里只是举一个例子。
SQL注入攻击在10年前相当的流行,当时国内的互联网刚刚起步,大家对相关技术都不是特别了解,于是大大小小的网站多少都存在SQL注入的问题。不过发展了这么多年,新浪依然存在这么低级的问题,实在是不敢恭维。更可恨的是,他家的密码也是明文存储的。就在前几天,新浪还信誓旦旦地说自家的密码保存工作做得很好……



