identité php des liens Web. Layer Cake et com_weblinks Joomla. Comment inclure des textes d'actualité complets dans votre flux RSS, pas seulement leurs titres

Il y a une suggestion dans le fichier /includes/joomla.php de la fonction cleanText pour remplacer la ligne

$texte = strip_tags($texte); " ) ;

$texte = strip_tags ($texte, "

Ce hack est destiné uniquement aux images insérées comme images normales. Pour les images insérées par un mambot (mosimage), ce hack ne fonctionnera pas.

Comment faire apparaître un lien direct dans le composant com_weblinks

Dans weblinks.html.php, vous devez remplacer la ligne :

$link = sefRelToAbs( "index.php?option=com_weblinks&task=view&catid=" . $catid ."&id=" . $row ->id ) ;

if ($_SERVER [ "HTTP_HOST" ] =="host1.ru" ) $mosConfig_live_site = "host1.ru" ;

sinon $mosConfig_live_site = "host2.ru" ;

Il faut faire attention au fait que si vous utilisez un cache, vous devez également avoir deux répertoires de mise en cache différents pour deux hôtes, car des liens vers différents hôtes peuvent se croiser dans le cache, et alors un utilisateur du mauvais réseau n'ira nulle part. . La variable $mosConfig_cachepath est responsable du cache.

Comment faire apparaître deux composants simultanément sur une seule page

Je vais vous le dire tout de suite : tout n'est pas si simple. Ce n'est pas un module, après tout. Par conséquent, il convient tout d’abord de rechercher une alternative, c’est-à-dire Un composant populaire est sûrement livré avec des modules capables de reproduire ses fonctionnalités. S’il n’y a rien de tel, c’est une option. Il peut être réalisé sous forme de module ou, en théorie, il peut être inséré dans un modèle. L'idée est la suivante : appeler le composant via index2.php (quoi et pourquoi - lire l'intégralité du fait). Ceux. vous pouvez créer une iframe avec src="index2.php?option=com_component&no_html=1" au point d'insertion souhaité pour le deuxième composant. Et il y sera affiché. Une autre chose est qu'il est peu probable qu'il soit possible d'assurer pleinement la fonctionnalité. Mais néanmoins, c'est une issue.

Ou utilisez la construction : mosLoadComponent("com_mycomp" ) ;

Mais, si le composant est exécuté de cette manière, alors vous devez comprendre qu'il ne connaît pas vos manipulations et fonctionnera selon ses $option et $task.

Comment augmenter la longueur du titre dans un article

Vous devez exécuter les deux commandes suivantes dans phpMyAdmin (il existe une page spéciale pour exécuter des requêtes SQL), remplacez simplement ###_ par votre vrai préfixe de table. Le nombre maximum possible est de 255. Dans l’exemple, 200 est utilisé.

ALTER TABLE `###_content` CHANGE `title_alias` `title_alias` VARCHAR(200) NOT NULL ; ALTER TABLE `###_content` CHANGE `title` `title` VARCHAR(200) NOT NULL ;

Comment inclure des textes d'actualité complets dans votre flux RSS, pas seulement leurs titres

Pour cela, dans le fichier /components/com_rss/rss.php, vous devez remplacer

$item_description = $row ->introtext ;

Si vous souhaitez utiliser les mêmes fichiers sans copier une grande distribution, vous pouvez en principe utiliser la commande « ln -s » sous Linux pour créer des liens symboliques vers des fichiers existants et ne pas les copier pour le nouveau site.

Comment créer une page virtuelle accessible à une adresse précise dans le design général de Joomla (http://site.ru/super_page)
  • La première consiste à utiliser une sorte de composant SEF, dans lequel vous spécifiez le chemin virtuel souhaité pour une page statique. Il y a un inconvénient ici - ce composant commencera à refaire tous les autres liens (et en général, ces composants sont très gourmands en énergie et nécessitent beaucoup de ressources pour fonctionner).
  • Créez un alias pour une telle page en utilisant mod_rewrite et .htaccess. Pour ce faire, vous avez besoin de :
    • Créez une page statique avec le texte dont vous avez besoin, découvrez son identifiant et son adresse (il n'est pas nécessaire de créer une telle page, elle peut déjà exister et en général il s'agit de n'importe quel composant, pas nécessairement com_content)
    • Trouvez un alias, que ce soit "super_puper"
    • Ouvrez .htaccess et avant la ligne "RewriteCond %(REQUEST_FILENAME) !-f" écrivez :
RewriteRule ^(super_puper) index.php?option=com_content&task=view&id=12 RewriteCond %(REQUEST_FILENAME) !-f
    • Et maintenant, à condition que Joomla se trouve sur site.ru, lorsque vous ouvrez le lien http://site.ru/super_puper, la page statique requise avec vos informations s'ouvrira. Le lien lui-même "index.php?option=com_content&task=view&id=12" peut être ce dont vous avez besoin, l'essentiel est que le lien ne soit pas absolu (c'est-à-dire avec http:/ /...) mais relatif (doit commencer par index .php ?...)
Comment désactiver la mise en cache pour un article spécifique

Cela peut être nécessaire si vous utilisez le mambot rd_addphp pour insérer des scripts devant générer des nombres aléatoires ou du texte aléatoire à chaque fois, quel que soit le système de mise en cache de Joomla. Pour désactiver la mise en cache d'un certain élément, vous devez connaître son identifiant (dans le panneau d'administration, lors de l'édition, regardez la barre d'adresse, il dira quelque chose comme "...&id=123..."). Donc 123 sera notre identifiant d’article. Il faut remplacer dans le fichier /components/com_content/content.php environ à la ligne 1600

$cache ->call ( "HTML_content::show" , $row , $params , $access , $page ) ;

if ($row ->id !="123" ) $cache ->call ( "HTML_content::show" , $row , $params , $access , $page ) ;

J'ai installé beaucoup de composants, mais la liste des composants dans le menu administrateur en affiche un nombre réduit, puis il est indiqué « Plus de composants... ». Comment afficher tous les composants.

Il vous faut une ligne dans le fichier /administrator/modules/mod_fullmenu.php

$topLevelLimit = 19 ;

remplacer par

$topLevelLimit = 199 ; Comment installer une copie d'un composant

Il faut dire que la tâche est extrêmement difficile. Si vous ne comprenez pas comment fonctionne le composant, vous ne devriez même pas essayer. Pour ceux qui souhaitent quand même noter les points principaux :

  • Dans le fichier XML, renommez le nom du composant dans la balise name
  • Ensuite, vous devez renommer les tables utilisées (d'abord dans le fichier XML, et ensuite dans tous les fichiers de composants, partout où l'objet de base de données $database et la méthode setQuery sont utilisés)
  • Renommez également tous les chemins dans les composants. Les chemins peuvent être utilisés dans des références à lui-même ou dans les noms des fichiers inclus. Le plus souvent, cela revient à rechercher le nom de la sous-chaîne com_component et à le remplacer par un nouveau.

Mais cette méthode ne garantit rien. Avec les solutions simples, cela est possible et fonctionnera, mais avec les solutions complexes, personne ne peut le garantir.

Comment faire en sorte qu'une position affiche aléatoirement l'un des modules qui lui sont assignés
  • Option 1 - piratez la fonction mosLoadModules. Dans le template, à l'endroit où il faut afficher l'un des N modules, on écrit (attention au troisième argument) :
mosLoadModules("position", display_setup,true);

Et nous corrigeons légèrement la fonction ci-dessus elle-même :

function mosLoadModules( $position ="left" , $style =0 , $show_random = false ) ( ... $allModules =& initModules() ; if (isset ( $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) ) ( $modules = $GLOBALS [ "_MOS_MODULES" ] [ $position ] ) else ( $modules = array () ; ) //ajouter ici if ($show_random && sizeof ($modules ) >0 ) ( $tmp = $modules [ rand (0 ,sizeof ($modules ) -1 ) ] ; $modules = array ($tmp ) // fin de l'instruction if ( count ( $modules ) ;< 1 ) { $style = 0 ; }

Nous y avons ajouté un troisième argument (qui est utilisé dans le modèle, où nous avons écrit true) et modifié le code.

  • La deuxième option est plus simple, nous modifions uniquement le modèle. Mais plus exigeant en main-d'œuvre, nous devons créer plusieurs postes. Tout d'abord, nous créons plusieurs nouvelles positions de module, par exemple new1 ... new10. Sauvegarder. Au bon endroit dans le template, avant d'appeler la fonction mosLoadModules, ajoutez le code nécessaire :
$rand_num = rand (1 ,10 ) ;//de 1 à 10 - comme dans le nom de position mosLoadModules ( "new" .$rand_num , display_settings) ; Je pense qu'en renommant le dossier /administrator/, je rendrai mon site plus sécurisé

Cette option n'est pas fournie en standard. Mais en fait, il est possible, en organisant une recherche dans les fichiers Joomla, de remplacer toute occurrence d'un tel mot par la vôtre - secret. Parfois, plus tard, des erreurs peuvent apparaître concernant l'impossibilité d'accéder aux fichiers, mais connaissant le fichier et le numéro de ligne, elles peuvent être corrigées. Le problème est donc, en principe, résoluble.

Point d'entrée vers Joomla! Le composant est similaire pour la plupart des composants. Pour cet exemple, nous utiliserons l'un des composants principaux de Joomla : les liens Web. Le premier fichier qui sera exécuté dans le front-end : …/components/com_weblinks/weblinks.php .

Nous voyons d’abord un contrôle de sécurité conçu pour garantir que personne ne peut appeler directement cette page. C'est le standard qui doit être utilisé dans tous vos fichiers php (à quelques exceptions près) :

Nous vérifions la chaîne de requête pour voir si un nom de contrôleur spécifique a été envoyé. Si tel est le cas, nous nous assurons de pouvoir charger le fichier requis dans le répertoire des contrôleurs :

// Nécessite un contrôleur spécifique si demandé if ($controller = JRequest:: getWord("controller" ) ) ( $path = JPATH_COMPONENT. DS. "controllers" . DS. $controller . ".php" ; if (file_exists ($path ) ) ( require_once $path ; ) else ( $controller = "" ; ) )

Nous instancions maintenant notre classe de contrôleur en utilisant le nom que nous avons défini ci-dessus :

Dès que la tâche est terminée, nous effectuons une redirection, si nécessaire :

// Redirection si défini par le contrôleur $controller -> redirect () ;
Classe de contrôleur

Le contrôleur générique (spécifique) du composant links est ici : .../components/com_weblinks/controller.php.
Cette classe entière définit une méthode d'affichage, qui est la méthode par défaut utilisée à moins que l'utilisateur ne spécifie une autre tâche.

défini ("_JEXEC" ) ou die ( "Accès restreint" ) ;

jimport("joomla.application.component.controller" ) ;
/** * Weblinks Component Controller * * @package Joomla * @subpackage Weblinks * @since 1.5 */ class WeblinksController extends JController ( /** * Méthode pour afficher une vue des liens Web * * @access public * @since 1.5 */ function display () ( // Définir une vue par défaut s'il n'en existe pas if ( ! JRequest:: getCmd ( "view") ) ( JRequest:: setVar ( "view" , "categories" ) ; ) // mettre à jour le nombre d'accès pour le lien Web if (JRequest:: getCmd ("view" ) == "weblink" ) ( $model =& $this -> getModel ("weblink" ) ; $model -> hit () ; ) // Afficher la logique de mise en cache -- simple ... sommes-nous connectés ? $user = & JFactory::getUser() ; $view = JRequest::getVar("view"); if ($user -> get ("id" ) || ($view == "catégorie" && $viewcache == 0 ) ) ( parent :: display (false) ; ) else ( parent :: display (true) ; ) ) )
Dans cette méthode, nous définissons la vue par défaut pour afficher les catégories, sauf si une autre vue a été transmise en tant que paramètre de chaîne de requête. Si la vue requise est un lien Web, nous incrémentons le compteur de vues du lien. Nous définissons ensuite la valeur de la variable view et appelons la méthode diplay de notre classe JController parent.
Il convient de prêter une attention particulière à l'appel à la méthode getModel. Il charge le modèle requis pour le composant. Dans cet exemple, cette méthode chargera le modèle de lien Web situé ici : .../components/com_weblinks/models/weblink.php.

Ici, nous conviendrons que nous n'avons pas demandé de vue spécifique, et donc notre vue sera définie par catégories.

Ensuite, nous ouvrons la classe view.

// Vérifiez que ce fichier est inclus dans Joomla!< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->défini("_JEXEC") ou die("Accès restreint");

Encore une fois, il s'agit d'une classe très simple avec une seule méthode d'affichage. La majeure partie de la logique ici est spécifique au composant de lien, mais si vous regardez attentivement, vous pouvez trouver des fonctionnalités utilisées dans la plupart des classes de vue de composant. A la fin de la méthode d'affichage, cette classe appelle la méthode d'affichage parent (JView), en lui passant le nom du modèle à afficher. Si le nom du modèle d'affichage n'est pas transmis, le modèle "par défaut" est utilisé.
Et enfin, nous ouvrons la classe modèle.

Classe de modèle

Admettons qu'un nom de modèle spécifique n'a pas été transmis, le modèle par défaut sera donc utilisé. Dans ce cas, le fichier suivant sera considéré : .../components/com_weblinks/views/categories/tmpl/default.php
-> escape ($this -> params -> get ("page_title" ) ) ;

  • ( )

?>

Une grande partie de la logique ici est spécifique au composant en cours d'exécution. Il ressort également du code que ce fichier contient tout du HTML mélangé à du PHP - ce sont ses fonctionnalités et son objectif.

Autres fichiers utilisés dans les composants

  • Plusieurs autres types de fichiers que vous pouvez trouver dans les composants :
  • Helpers - les composants utilisent souvent un fichier helper.php ou un répertoire helpers avec de nombreux fichiers. Ces fichiers contiennent généralement uniquement les fonctionnalités générales du composant.
  • Les ressources semblent être un dossier fourre-tout pour les autres fichiers inclus dans le composant.
  • router.php - ce fichier est utilisé, lorsque le paramètre URL SEF est activé, pour traduire l'URL dans les deux sens (en une URL lisible par l'homme avec des alias et dans la vue système Joomla avec des paramètres).
  • fichiers xml - ils définissent généralement les paramètres et autres informations sur le composant et sa présentation. Ils sont utilisés, par exemple, lors de la création d'éléments de menu de composants.
  • index.html - C'est une bonne pratique d'avoir un fichier index.html vide dans tous vos répertoires. Il s’agit d’une mesure de sécurité tellement passive.

css/images/js - Dossiers contenant divers fichiers pour implémenter la conception et les fonctionnalités côté client (dans le navigateur).

Ce mois-ci, les chercheurs de bogues ne veulent pas nous gâter avec de nouveaux exploits très médiatisés dans des applications populaires. Bien sûr, de nombreux avis ont été publiés dans des produits d'entreprises renommées, mais très peu d'entre eux contiennent des codes PoC lisibles. Dans notre revue, j’ai essayé de rassembler les vulnérabilités les plus importantes et les plus complètes décrites récemment, alors asseyez-vous et bonne lecture.

Le 3 mars, un certain Adam Ivanyuk a découvert une fonctionnalité intéressante dans l'interpréteur PHP, qui ne traite pas assez correctement les requêtes HEAD. Le chercheur a appelé cette vulnérabilité « astuce de la méthode HTTP HEAD dans les scripts php ».

De nombreux codeurs conçoivent leurs scripts PHP en espérant que toutes les instructions qui y sont écrites seront exécutées avec succès sans rupture quelque part au milieu (en particulier dans les scripts courts). C'est ce qui se produit si le script est demandé par l'utilisateur final à l'aide des méthodes GET, POST, PUT.

Mais sachez qu'il existe d'autres méthodes HTTP, par exemple HEAD. C'est justement lors du traitement de cette méthode en PHP qu'une faille de sécurité peut survenir.

Regardons l'une des sources de l'interpréteur : ./main/SAPI.c, ligne 315 :

si (SG(request_info).request_method &&
!strcmp(SG(request_info).request_method, "HEAD"))
{
SG(request_info).headers_only = 1 ;
...

Lorsqu'une donnée arrive, la fonction php_ub_body_write est exécutée. Ensuite, regardez main/output.c, ligne 699 :

si (SG(request_info).headers_only) (
si(SG(headers_sent))
{
renvoie 0 ;
}
php_header(TSRMLS_C);
zend_bailout();
}

Ici vous pouvez voir que la première fois qu'il est imprimé à l'écran et lors de l'utilisation de la méthode HEAD, la fonction zend_bailout interrompt le script.

Exploiter

Accédons maintenant à ce script en utilisant la méthode HEAD :

Comme vous vous en doutez, notre livre d'or arrêtera son exécution à la ligne « echo $data; », le fichier book.txt sera donc simplement remis à zéro.
Cet exemple est de nature plutôt destructrice. Dans le deuxième exemple, nous pouvons contourner l'autorisation dans le panneau d'administration primitif :

Dans ce script, lors de la connexion à l'aide des méthodes habituelles, une variable administrative est définie dans la session. Ensuite, si l'utilisateur saisit un mot de passe incorrect, cette variable est réinitialisée et l'utilisateur ne devient pas administrateur.

Si nous accédons au panneau d'administration via HEAD, son exécution sera interrompue au niveau du morceau de code avec « echo », donc la variable administrative ne sera pas réinitialisée et nous pourrons nous promener en toute sécurité dans la partie fermée de l'application. La chose à garder à l'esprit ici est que la plupart des serveurs Web ont une valeur de mise en mémoire tampon de sortie définie sur 4 096 octets. Par conséquent, dans un exemple fonctionnel, nous pourrions avoir besoin de la chaîne "Une longue chaîne contient environ 4 090 caractères".

Exploiter
  • PHP

    Ici, le tableau $check contient nos données POST et la variable $locked est une chaîne sérialisée obscurcie à l'aide de la fonction str_rot13(), qui est entièrement sous notre contrôle.

    À ce stade, cela vaut la peine de faire une petite parenthèse pour ceux qui n’ont pas lu les articles correspondants dans ][, et de parler brièvement du bug qui se manifeste dans les méthodes magiques de PHP. Ainsi, dans PHP version 5, le concept de base de la programmation POO est apparu : constructeur et destructeur. Un constructeur est implémenté à l'aide de la méthode "__construct" et un destructeur est implémenté à l'aide de la méthode "__destruct". Une fois son travail terminé et lorsqu'il est appelé via la fonction unserialize(), chaque objet exécute sa propre méthode __ destruct, si elle est écrite dans le code.

    Revenons maintenant à notre framework et regardons le destructeur de classe App à partir du fichier ./libs/configure.php :

    fonction __destruct()
    {
    si ($this->__cache)
    {
    $core = App::core("gâteau");
    unset($this->__paths);
    Cache::write("dir_map", array_fi lter ($this->__paths),
    "gâteau_core");
    Cache::write("fi le_map", array_fi lter($this->__map),
    "gâteau_core");
    Cache::write("object_map", $this->__objects,
    "gâteau_core");
    }
    }

    À partir du code ci-dessus, vous pouvez voir que cette méthode peut être compromise en écrivant des valeurs arbitraires dans l'objet Cache. La clé la plus intéressante à cracker est 'file_map'. Il gère les connexions entre les classes et les fichiers PHP correspondants, et est également utilisé pour charger des classes supplémentaires lors de l'exécution du script.

    Le code réel pour charger les classes est un peu plus complexe, mais tout se résume au code suivant de la méthode __load à l'intérieur de la classe App :

    Bingo ! En remplaçant la variable $file, nous pouvons inclure notre propre code PHP ! De plus, il s'agira d'un véritable bug d'inclusion de fichiers à distance - nous n'aurons donc pas besoin d'astuces supplémentaires pour télécharger des fichiers locaux sur le serveur. Cependant, l'auteur de la vulnérabilité trouvée propose une option LFI pour exploiter cette faille, car CakePHP utilise un cache local basé sur des fichiers, qui se trouve sous forme sérialisée dans un répertoire connu de l'attaquant.

    Exploiter

    En tant que petit PoC pour générer une chaîne sérialisée toxique, felix propose le code suivant :

    Bien sûr, vous devez d’abord inclure les classes nécessaires de CakePHP. Il existe également un exploit Python entièrement fonctionnel, que vous pouvez trouver sur malloc.im/burnedcake.py.

    Cet exploit devrait fonctionner dans toutes les applications construites sur CakePHP, utilisant des formulaires POST avec des jetons de sécurité, et dans lesquelles l'emplacement standard des fichiers cache n'a pas été modifié. Par défaut, l'exploit affiche la configuration de la base de données ; d'autres fonctionnalités utiles peuvent être facilement ajoutées en modifiant la charge utile PHP intégrée.

    Cibles
    • CakePHP getState("fi lter_order_dir");
      $fi lter_order = JFilterInput::clean($fi lter_order, "cmd");
      $fi lter_order_dir =
      JFilterInput::clean($fi lter_order_dir, "word");
      // Nous devons obtenir une liste de tous
      // liens web dans la catégorie donnée
      $requête = "SELECT *" .
      "DE #__liens Web" .
      "OÙ catid = ". (int) $this->_id.
      "ET publié = 1" .
      "ET archivé = 0".
      "COMMANDER PAR". $fi lter_order "".
      $fi lter_order_dir .", commande";
      retourner $requête ;
      }

      Ici, vous pouvez voir que les variables $filter_order et $filter_order_dir ne sont pas vérifiées pour vérifier leur stricte conformité avec les instructions SQL ; la vérification est effectuée uniquement en utilisant la méthode clean standard de la classe JFilterInput :

      On colle ce code n'importe où sur le site, qui affiche 5 liens aléatoires de la base de données et une ancre aléatoire. Il est préférable de diluer les ancres plutôt que d'en écrire une seule dans le lien. Avec des liens appropriés sur votre site Web, vous constaterez immédiatement une augmentation du trafic et une amélioration des autres indicateurs du site Web.

      J’attends avec impatience vos questions dans les commentaires de cet article.

      Date de publication : 03 mars 2014
        Avis et commentaires :

        Dmitri :
        Merci pour le script, je vais le mettre en œuvre. Il est impossible de copier le code source du site ; il n'est copié que par petits fragments ; il serait plus pratique de le copier dans son intégralité.

        Kirill :
        Merci pour la note sur la copie, je viens de la voir maintenant, j'essaierai de la réparer bientôt.

        Alexeï Pavlov :
        Erreur dans la ligne $tex = éclater(":",$sendlist[$count] Vous avez besoin d'un point-virgule, pas de deux-points. J'ai un peu modifié le code pour le rendre plus clair :

Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :