Jump to content

XSS в bbcode img


asterix_kpi
 Share

Recommended Posts

  • 2 weeks later...

на версии 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 - то не отрабатывает!!!

 

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

Link to comment
Share on other sites

foto

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...