2008-10-30

WordPress 2.1.3及更早版本的SQL注入漏洞及解决办法

Posted in 网络安全 at 17:05 Author:仲远

标签:

SQL注入是最常见的一种网站攻击方式,也是往往最奏效的一种方式。SQL注入问题的产生,通常是因为对于传入的变量没有检测造成的。而各种网站建站系统、博客系统,伴随着功能增加以及版本升级,也不断地发现新的SQL注入漏洞、而后续升级版本又会解决上个版本的SQL注入漏洞。我曾经就说过,对于开源系统而言,绝对不是越新的版本越好,因为新版本常常会有许多bug以及漏洞。最好的方式还是选择一个稳定版本。

当然,bug和漏洞似乎天生就与程序伴随。即使是商业软件,也无法避免。像微软的操作系统每个月都要推出升级补丁就是这个道理。甚至,在Windows XP都已经使用了6、7年,仍然在前段时间爆出高危漏洞,由此可见一斑。

WordPress是一款在全世界都非常受欢迎博客系统,目前似乎已经出到了2.6.3版,但是今天我要介绍一个在旧版本(2.1.3以及更早版本)中存在的SQL注入漏洞。

这个漏洞是因为没注意检查传入的Cookies而导致可以SQL注入的。不过这次注入后执行的SQL语句的返回没有被输出,所以没有办法通过输出直接或间接地获取存放在数据库中的管理员密码。利用这个漏洞的攻击程序只能通过分析页面执行时间的长短来检测密码,这样导致检测时间比较长,而且设置的越长检测结果越精确。这种通过分析页面执行时间来获取数据库中的资料这种方式倒是很值得研究一下,它使用二分法来检测每一位字符最终获得全部32位字符。

攻击者通过wp-admin/admin-ajax.php进行SQL注入。所以网站拥有者可以通过检查日志中是否包含大量未知ip对于admin-ajax.php的访问来确认是否有人在恶意攻击自己的网站。

解决办法也很简单,就是修改wp-includes/pluggable.php的第122行的function get_userdatabylogin($user_login)函数

function get_userdatabylogin($user_login) {
 global $wpdb;
 $user_login = sanitize_user( $user_login );

 if ( empty( $user_login ) )
  return false;

 if ( !preg_match(’/^\w+$/’ , $user_login ) )
  return false;

 $userdata = wp_cache_get($user_login, ‘userlogins’);
 if ( $userdata )
  return $userdata;
  
 $user_login = $wpdb->escape($user_login);

 if ( !$user = $wpdb->get_row(”SELECT * FROM $wpdb->users WHERE user_login = ‘$user_login’”) )
  return false;

……

}

上面加粗的两行就是需要加入的语句,第一个语句是网友提供的一个解决办法,第二个语句是WordPress官方在后续版本中的解决办法。希望对大家能够有所帮助。

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word