2007-05-22 的文章

WordPress 2.1.3 admin-ajax.php SQL Injection Vulnerability

在 WordPress 2.1.3 (不確定以前的版本有沒有 , 請自行檢查 :p )

wp-admin/admin-ajax.php 的 6 ~ 10 行


6 define('DOING_AJAX', true);
7
8 check_ajax_referer();
9 if ( !is_user_logged_in() )
10 die('-1');

check_ajax_referer 來自 wp-includes/pluggable.php 的 242 ~ 253 行


242 function check_ajax_referer() {
243 $cookie = explode('; ', urldecode(empty($_POST['cookie']) ? $_GET['cookie'] : $_POST['cookie']));
.....
250 if ( !wp_login( $user, $pass, true ) )
251 die('-1');
252 do_action('check_ajax_referer');
253 }

這裡會由 user 端傳上的 GET 或 POST 裡取出 cookie 這個參數的值
然後帶入 urldecode() , 所以就可以用 %2527 完成 ' 來繞過 php 的 magic_quotes
(如果主機端沒有開 magic_quotes 的話, 連這步都省了 XD)

其中, 最後會執行的 wp_login 來自 wp-includes/pluggable.php 的 173 ~ 201 行


173 function wp_login($username, $password, $already_md5 = false) {
174 global $wpdb, $error;
.....
184 $login = get_userdatabylogin($username);
.....
201 }

最後, 這裡呼叫的 get_userdatabylogin 來自 wp-includes/pluggable.php 的 112 ~ 154 行


112 function get_userdatabylogin($user_login) {
113 global $wpdb;
114 $user_login = sanitize_user( $user_login );
115
116 if ( empty( $user_login ) )
117 return false;
118
119 $userdata = wp_cache_get($user_login, 'userlogins');
120 if ( $userdata )
121 return $userdata;
122
123 if ( !$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_login = '$user_login'") )
124 return false;

所以如果沒有把 $user_login 處理好的話 , 就會被 SQL Injection 囉.

危害到什麼程度呢 ?

到可以撈你 DB 的資料哦 , 包括帳號密碼等等 :p

好新啊 , 有在用的人請趕快補 XD


如果真的還不想更新到 WordPress 2.2 的話 , 可以手動自己補一下

我的作法是修改 pluggable.php , 自己補上對 user_login 的檢查 , 如下


112 function get_userdatabylogin($user_login) {
113 global $wpdb;
114 $user_login = sanitize_user( $user_login );
115
116 if ( empty( $user_login ) )
117 return false;
118
119 if ( !preg_match('/^\w+$/' , $user_login ) )
120 return false;
121
122 $userdata = wp_cache_get($user_login, 'userlogins');

新增留言 2007-05-22 18:13


日曆

May 2007
M T W T F S S
« Apr   Jun »
 123456
78910111213
14151617181920
21222324252627
28293031  

各分類文章

各月份文章