typograf.php и обход официального патча

После найденной очередной уязвимости в DLE, связанной с файлом typograf.php, с помощью которой можно получить права администратора на сайте, был выпущен патч.

https://dle-news.ru/bags/v112/1715-nedostatochnaya-filtraciya-dannyh.html

Я поставил данный патч, чтобы посмотреть на его работу в действии на DLE 10.6 версии. Итак, давайте посмотрим на него.

Открываем файл ajax/typograf.php и, как написано в патче, ставим после строки:

$txt = trim( convert_unicode( $_POST['txt'], $config['charset'] ) );

Код:

require_once ENGINE_DIR . '/classes/parse.class.php';
$parse = new ParseFilter();
$txt = $parse->process( $txt );
$txt = preg_replace( "/javascript:/i", "jаvascript:", $txt );
$txt = preg_replace( "/data:/i", "dаta:", $txt );
Рис. 1. Установленный патч.

Как известно, данный файл принимает значения с помощью переменной $_POST["txt"]. Пробуем в данной переменной отправить следующий код:

txt=test string<object data=javascript:alert(1);>

Результат:

Рис. 2. Исходный код страницы typograf.php.

Скорее всего патч просто удаляет все теги из поступающего текста. Для этого я отправил другие теги и получил аналогичный результат. На первый взгляд кажется, что все хорошо, но разработчики не учли один важный момент: метод process() класса typographus делает преобразование HTML сущностей в обычную строку, а так как вызов метода process() класса ParseFilter идет до вызова метода typographus, то вся фильтрация обходится обычным преобразованием входной строки в HTML сущности.

function process($str){
		...
		$str = preg_replace_callback("~$pattern~isU", array(&$this, '_stack'), $str);

		$str = html_entity_decode($str,  ENT_QUOTES, 'ISO-8859-1'); //Здесь идет преобразование
		$str = str_replace( ']"', '_LINE_] "', $str );
		...
		return $str;
	}

Все, что нам нужно — это передать теги в виде строки, преобразованной в HTML сущности. Единственное, что нужно учесть, так это строки в файле ajax/typograf.php:

...
$find = array ('/data:/i', '/about:/i', '/vbscript:/i', '/onclick/i', '/onload/i', '/onunload/i', '/onabort/i', '/onerror/i', '/onblur/i', '/onchange/i', '/onfocus/i', '/onreset/i', '/onsubmit/i', '/ondblclick/i', '/onkeydown/i', '/onkeypress/i', '/onkeyup/i', '/onmousedown/i', '/onmouseup/i', '/onmouseover/i', '/onmouseout/i', '/onselect/i', '/javascript/i', '/onmouseenter/i', '/onwheel/i', '/onshow/i');
$replace = array ("data:", "about:", "vbscript<b></b>:", "onclick", "onload", "onunload", "onabort", "onerror", "onblur", "onchange", "onfocus", "onreset", "onsubmit", "ondblclick", "onkeydown", "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onselect", "javascript", 'onmouseenter', 'onwheel', 'onshow');

$txt = preg_replace( $find, $replace, $txt );
$txt = preg_replace( "#<iframe#i", "<iframe", $txt );
$txt = preg_replace( "#<script#i", "<script", $txt );
$txt = str_replace( "<?", "<?", $txt );
$txt = str_replace( "?>", "?>", $txt );
…

Здесь идет фильтрация по событиям и по различным оберткам. Также нам запрещают использовать теги <script> и <iframe>. Для обхода этого дела можно использовать особенность некоторых браузеров, в частности Firefox, а именно преобразованная в HTML сущность ссылка. Например, для обхода фильтрации обертки «javascript:» можно использовать следующий код:

<object data=javascript:alert(1);>

Где значение атрибута data преобразовано в HTML сущности. Теперь нам осталось только преобразовать все это дело в HTML сущности и отправить на сервер.

Рис. 3. Результат выполнения запроса.

На мой взгляд строку $txt = $parse->process( $txt ); лучше вставить после строки $txt = $typo->process($txt);, тогда все HTML теги будут отфильтрованы. Должно получиться что то такое:

...
$txt = $typo->process($txt);
$txt = $parse->process( $txt );
…

Строки:

$txt = preg_replace( "/javascript:/i", "j&#1072;vascript&#58;", $txt );
$txt = preg_replace( "/data:/i", "d&#1072;ta:", $txt );

можно удалить.

Поделиться ссылкой:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

XHTML: В комментариях можно использовать теги | <a href="" title=""> | <abbr title=""> | <acronym title=""> | <b> | <blockquote cite=""> | <cite> | <code> | <del datetime=""> | <em> | <i> | <q cite=""> | <s> | <strike> | <strong> | <pre><code class="language-"> |.
Gravatars: Хотите чтобы был свой аватар в комментариях? Зайдите на Gravatar и зарегистрируйтесь.
Spam: Различные антиспам плагины могут быть активированы.

Всего: 0 комментов в 3 сниппетах.