WordPress 2.1.3 admin-ajax.php SQL Injection Vulnerability
2007-05-22 18:13
在 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');
HIT 2007 Call For PaperHIT 資安技術教育訓練課程 與 Syscan in Taipei 2007
.Vulnerability 類別的文章 :
Word 0day Combo耶誕連發 ?
新增留言
訂閱這則留言的 RSS Feed