Skip to content

XSS в bbcode img

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

Featured Replies

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

  • 2 weeks later...
  • Author

на версии 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 файл для исполнения.

  • Author

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

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

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

  • Author

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, используются одиночные ббкоды с использованием опций.

  • Author

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

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.