Skip to Content
 Русский Русский    English English   

 

Drupal 6.17. Копаясь в коде модулей FAQ и FAQ Search обнаружила уязвимость XSS

Drupal 6.17. Копаясь в коде модулей FAQ и FAQ Search обнаружила уязвимость XSS

Когда я писала "листалку" страниц (pager) для модуля FAQ 6.x-1.12, мне показался странным участок кода:
[geshifilter-php] Faq.module,v 1.1.4.52.2.145 2010/10/29 : function faq_view_question(&$data, $node, $path = NULL, $anchor = NULL) { $disable_node_links = variable_get('faq_disable_node_links', FALSE); $question = ''; if ($disable_node_links) { if (empty($path) && empty($anchor)) { $question = check_plain($node->title); } elseif (empty($path)) { $question = '<a name="' . $anchor . '" id="' . $anchor . '">' . check_plain($node->title) .'</a>'; } else { $options = array(); if ($anchor) { $options['attributes'] = array('id' => $anchor); } $question = l($node->title, $path, $options); } } else { if (empty($anchor)) { $question = l($node->title, "node/$node->nid"); } else { $question = l($node->title, "node/$node->nid", array("attributes" => array("name" => "$anchor", "id" => "$anchor"))); } } if (variable_get('faq_display', 'questions_top') != 'hide_answer' && !empty($node->detailed_question) && variable_get('faq_question_length', 'short') == 'both') { $question .= '<div class="faq-detailed-question">'. $node->detailed_question .'</div>'; } $data['question'] = $question; } [/geshifilter-php]

Поле "Detailed question" не фильтруется и подвержено активной XSS. Пример:
[geshifilter-php] <script>alert('CSS')</script> [/geshifilter-php]
Если в макете страницы установлен вывод полного текста вопроса, то этот код отобразит окошко с надписью CSS.

Для защиты воспользуюсь функцией check_markup, которая фильтрует текст с помощью выбранного формата ввода:
[geshifilter-php] + $node->detailed_question = check_markup($node->detailed_question, $node->format, FALSE); $question .= '<div class="faq-detailed-question">'. $node->detailed_question .'</div>'; [/geshifilter-php]

Модуль FAQ Search 6.x-1.3-beta3 не фильтрует вывод поля вопроса:
[geshifilter-php] faq_search.find.inc,v 1.1.2.1 2009/09/08: function faq_search_find() { $term = strip_tags(drupal_substr($_POST['keyword'], 0, 100)); $query = "SELECT question,nid FROM {faq_questions} WHERE question LIKE '%%%s%%' ORDER BY question asc"; $result = db_query($query, $term); $string = ""; while ($row = db_fetch_object($result)) { $string .= "<a href='/". drupal_get_path_alias('node/'. $row->nid)."'>". $row->question ."</a>"; } if ( empty($string) ) { $string = t("<p class='message'>No matches!</p>"); } echo $string; exit; [/geshifilter-php]
Для защиты также воспользуюсь функцией check_markup. Sql запрос к базе данных изменила с учетом статуса публикации вопросов.
[geshifilter-php] + $query = "SELECT q.question,q.nid FROM {faq_questions} q,{node} n WHERE q.nid=n.nid and n.status=1 and q.question LIKE '%%%s%%' ORDER BY q.question asc"; + $row->question = check_markup($row->question, FILTER_FORMAT_DEFAULT, FALSE); $string .= "<a href='/". drupal_get_path_alias('node/'. $row->nid)."'>". $row->question ."</a>"; [/geshifilter-php]

Ваша оценка: Нет Средняя: 4.7 (19 голосов)

Нажимая кнопку «Сохранить», я подтверждаю свою дееспособность, согласие на получение информации от NetK, согласие на обработку персональных данных в соответствии с Политикой конфиденциальности и Пользовательским соглашением.