Рейтинг@Mail.ru
 
Админка
А вот тут, господа хорошие, пора взяться за голову. Но по порядку, чтобы сразу не шокировать.
Начнем опять же с индекса. Того, который в админке.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<? include ("lock.php"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Главная страница блока администратора</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
<!--Подключаем шапку сайта-->
<? include("blocks/header.php");   ?> 
  <tr>
    <td><table width="690" border="0" cellspacing="0" cellpadding="0">
      <tr>
<!--Подключаем левый блок сайта-->
<? include ("blocks/lefttd.php");  ?>      
        <td valign="top">
       <p>Добро пожаловать в админский блок.</p> 
        </td>
      </tr>
    </table></td>
  </tr>
<!--Подключаем нижний графический элемент-->  
<?  include ("blocks/footer.php");        ?>  
</table>
</body>
</html>


Ничего нового, все исправляем по образу и подобию:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php include './lock.php'?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Главная страница блока администратора</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
<!--Подключаем шапку сайта-->
<?php include './blocks/header.php';   ?> 
  <tr>
    <td><table width="690" border="0" cellspacing="0" cellpadding="0">
      <tr>
<!--Подключаем левый блок сайта-->
<?php include './blocks/lefttd.php';  ?>      
        <td valign="top">
       <p>Добро пожаловать в админский блок.</p> 
        </td>
      </tr>
    </table></td>
  </tr>
<!--Подключаем нижний графический элемент-->  
<?php  include './blocks/footer.php'?>  
</table>
</body>
</html>


Но самое интересное только начинается. Что мы видим первой строчкой. А видим мы подключение файла с красноречивым названием "loсk", то бишь "замок".
Посмотрим, на сколько он крепок:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php

include("blocks/bd.php");
if (!isset(
$_SERVER['PHP_AUTH_USER']))

{
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
}

else {
        if (!
get_magic_quotes_gpc()) {
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        }

        
$query "SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
        
$lst @mysql_query($query);

        if (!
$lst)
        {
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (
mysql_num_rows($lst) == 0)
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }

        
$pass =  @mysql_fetch_array($lst);
        if (
$_SERVER['PHP_AUTH_PW']!= $pass['pass'])
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }


}

?>


Впечатляет. Куча грозных проверок, обработка данных... Но опять же писано это полнейшим дилетантом. Особенно это место:
1
2
3
4
5
6
7

        
if (!get_magic_quotes_gpc()) {
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        }


Чувствуется рука мастера. Логика железная - если директива magic_quotes_gpc выключена, то данные мы обработаем. Не ясно зачем обе переменных, если в запрос идет только одна, ну да не суть. Суть в другом. А если включена?

Немного экскурса. Вот эти буквы magic_quotes_gpc обозначают ни что иное, как GET POST COOKIE И ни полслова про SERVER. А ведь именно оттуда мы берем данные. Так вот их эта директива не касается.

Я долго искал файл .htaccess, где могла бы быть отключена эта директива. Не нашел. А значит мы становимся заложниками настроек сервера.

Повезло тому, у кого на хостинге эта директива отключена. Но многие, и даже весьма крупные (AGAVA к примеру), держат её в положении On

Чем это грозит. Чтобы понять весь трагизм положения, проведем эксперимент. Поместите в корень сайта файл .htaccess такого содержания:
1
2
php_flag magic_quotes_gpc On


То есть мы принудительно включим эту директиву, смоделировав такую ситуацию. А теперь фокус-покус. Набираем в поле "логин" такой текст:
  1' union select 1/*'
а в поле "пароль" 1(единицу). И - о, чудо! Алчно потирая руки мы заходим в святая святых - админку.

Я не буду исправлять этот скрипт. Вот тут все подробненько описано.

Ну а мы двинемся дальше.