Перейти к содержимому
Русский язык для Invision Community 5

XSS в bbcode img

Прошу удалить... разобрался

Рекомендованные сообщения

Так что там с xxs то, есть или нет?

  • 2 недели спустя...
  • Автор

на версии 3.4.7 есть bb-code

<?xml version="1.0" encoding="utf-8"?>
<bbcodeexport>
 <bbcodegroup>
   <bbcode>
     <bbcode_id>51</bbcode_id>
     <bbcode_title>foto</bbcode_title>
     <bbcode_desc/>
     <bbcode_tag>foto</bbcode_tag>
     <bbcode_replace><![CDATA[<img src="{content}" width="200">]]></bbcode_replace>
     <bbcode_useoption>0</bbcode_useoption>
     <bbcode_example><![CDATA[[foto]{content}[/foto]]]></bbcode_example>
     <bbcode_switch_option>0</bbcode_switch_option>
     <bbcode_menu_option_text/>
     <bbcode_menu_content_text/>
     <bbcode_single_tag>0</bbcode_single_tag>
     <bbcode_groups>all</bbcode_groups>
     <bbcode_sections>all</bbcode_sections>
     <bbcode_php_plugin/>
     <bbcode_no_parsing>0</bbcode_no_parsing>
     <bbcode_protected>0</bbcode_protected>
     <bbcode_aliases/>
     <bbcode_optional_option>0</bbcode_optional_option>
     <bbcode_image/>
     <bbcode_app>topictemplate</bbcode_app>
     <bbcode_custom_regex/>
   </bbcode>
 </bbcodegroup>
</bbcodeexport>

 

При его использовании в виде

 

[foto]/forum/public/style_images/ipbskins/rte_icons/emoticons.png" onload="eval(atob('YWxlcnQoIk5BIEZPUlVNRSBLUklUSUNIRVNLQVlBIFVZQVpWSU1PU1QiKQ=='))"[/foto]

 

Отрабатывает джаваскрипт

 

Вид html

<img class='bbc_img' src="/forum/public/style_images/ipbskins/rte_icons/emoticons.png" onload="eval(atob('YWxlcnQoIk5BIEZPUlVNRSBLUklUSUNIRVNLQVlBIFVZQVpWSU1PU1QiKQ=='))"" width="200">

 

З.Ы. Если урл использовать c http - то не отрабатывает!!!

 

И не могу его победить

foto

Ну так это не ббкод img.

По идее, кавычки должны были бы заменятся на html сущности. Если этого не происходит, то есть два выхода:

  • использовать регулярное выражение для фильтрации ббкода (опция в ббкоде), например с шаблоном /^\S+$/
  • написать свой отдельный обработчик для этого ббкода, опция - PHP файл для исполнения.

  • Автор

использовать регулярное выражение для фильтрации ббкода (опция в ббкоде), например с шаблоном /^\S+$/

с этим вообще не работает просто картинка

Не работает если {content} не соответствует шаблоны - в нем содержатся пробелы. Если даже в адресе и есть пробелы их нужно заменить на аналог urlencode %20. В остальном должно "работать" (вообще "работает" здесь сферический конь в вакууме, так как под "не работает" подразумевается не замена ббкода).

  • Автор

http://ipbskins.ru/forum/public/style_extra/sharelinks/print.png

 

Вот для такого урл - выводиться только текстом с [foto] ... [/foto], а не картинкой. Пробелов в нем нет!

Прикол в том, что {content} не проходит обработку через checkXss, обрабатывается только {option}. Поэтому и не возможно применить регулярное выражение для фильтрации {content}, фильтруется {option} а он не соответствует выражению и ббкод не заменяется.

 

Отсюда снова есть два варианта:

  • сделать ббкод одиночным тегом и использовать опции в теге [foto=http://image-src], а в шаблоне замены вместо {content} указать {option}. Дополнительно можно еще задать регулярное выражение /^\S+$/ тогда ббкод не будет заменятся если в нем присутствуют пробелы.
  • второй вариант подразумевает правка исходного кода и замена в {content} кавычек на html сущности

Открыть /admin/sources/classes/text/parser/bbcode.php

Найти:

								if ( $_bbcode['bbcode_useoption'] and $_bbcode['bbcode_optional_option'] and ! $_option and ! stristr( $_bbcode['bbcode_replace'], '{option}' ) )
								{
									$_option = $_content;
									$_option = $this->checkXss( $_option, false, $_tag );
								}

Ниже добавить

 

								// XSS {content} in html tag attributes
								$_content = str_replace( array( '"', '\'' ), array( '"', '#39;' ), $_content );

 

Исходя из вышесказанного следует, что нельзя использовать значение из {content} в атрибутах html тегов. Подставлять его можно только внутри тегов.

НЕ правильно:

<a href="{content}"></a>

Правильно:

<a href="#">{content}</a>

Для одиночных html тегов такие как img, используются одиночные ббкоды с использованием опций.

  • Автор

Спасибо Вам, что Вы есть!!!

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.