[16.02.2008] PHP5.2.3 Remote CGI Buffer Overflow Vulnerability - Learning

php5.2.3 Remote-CGI-Pufferüberlauf-Schwachstelle 2008-02-16 11:41

php5.2.3 Remote-CGI-Pufferüberlauf-Schwachstelle

yuangehttp://hi.baidu.com/yuange1975

Betroffene Version: php5.2.3

Betrifft nicht die Version: andere Versionen

    Wenn php5.2.3 CGI verarbeitet, wird aufgrund eines Programmierfehlers (fehlende Klammern) die Länge einer Zeichenfolge falsch berechnet, was zu einem Heap-Pufferüberlauf führt, der beliebigen Code aus der Ferne ausführen kann.

Trigger-Methode: Konfigurieren Sie die CGI-Zuordnung von .php zu php.exe, fordern Sie GET /test.php/aa HTTP/1.1 an

Der Fehler trat bei php-5.2.3\sapi\cgi\cgi-man.cline 886 auf:

   int path_translated_len = ptlen +env_path_info ? strlen(env_path_info) : 0;

Das Programm sollte sein

int path_translated_len =ptlen + (env_path_info ? strlen(env_path_info) : 0);

   Programmablauf:

          hauptsächlich()

          {

           ......

           init_request_info(TSRMLS_C);

           ......

          }

         statisch voidit_request_info(TSRMLS_D)

         {

                ......

          int path_translated_len = ptlen +env_path_info ? strlen(env_path_info) : 0;

                ......

         path_translated = (char *)emalloc(path_translated_len + 1);   

                ......

                if (env_path_info) {

      memcpy(path_translated + ptlen,env_path_info, path_translated_len - ptlen);  

   }    

         }

================ AppNinja Learning Master Artikel ============================== ==

https://blog.csdn.net/a2831942318

=============================================== ===============

Studienzeit: 17.03.2023

Kompilierungsumgebung: VS2022x64

#define TSRMLS_D 1

statisch void init_request_info(int Flag)

{

    int ptlen = 5;

    const char* env_path_info = "aa";

    int path_translated_len = ptlen + env_path_info ?strlen(env_path_info) : 0;

    char* path_translated = (char*)malloc(path_translated_len+ 1); // emalloc->malloc

    if (env_path_info) {

        size_t nMemcpyLen =path_translated_len - ptlen;

        memcpy(path_translated + ptlen,env_path_info, nMemcpyLen);

    }

}

/*

1. Wenn ptlen = 5; env_path_info = NULL, tritt der Code in strlen(NULL) ein und stürzt ab.

2. Wenn ptlen = 5, env_path_info = "aa", path_translated_len 2 ist, weist malloc 3 zu,

  nMemcpyLen=2-5=0xfffffffd

  Ausgeführt memcpy(path_translated+5, env_path_info, 0xfffffffd);

*/

1. Wenn ptlen = 5; env_path_info = NULL, tritt der Code in strlen(NULL) ein und stürzt ab.

Wissenspunkt: Die Sprache C hat 15 Prioritätsstufen:

Ebene (höchste bis niedrigste) Operator (durch Leerzeichen getrennt) Assoziativität

1 () [] -> .von links nach rechts

2 ! ~ ++ -- + - * (Typ) Größe von rechts nach links

3 * / % von links nach rechts

4 + - von links nach rechts

5 << >> von links nach rechts

6 < <= > >= von links nach rechts

7 == != von links nach rechts

8 & von links nach rechts

9 ^ von links nach rechts

10 | von links nach rechts

11 && von links nach rechts

12 || von links nach rechts

13 ?: von rechts nach links

14 = += -= *= /= %= &= ^= |= <<= >>= von rechts nach links

15, von links nach rechts

Der bedingte ternäre Ausdruck "?:" ist die drittletzte Priorität unter den 15 Prioritätsstufen der C-Sprache.

Der Code führt zuerst die Additionsoperation aus:

int path_translated_len = ptlen + env_path_info ?strlen(env_path_info) : 0;

2. Wenn ptlen = 5, env_path_info = "aa", path_translated_len 2 ist, weist malloc 3 zu,

  nMemcpyLen= 2 -5 = 0xfffffffd

  Ausgeführt memcpy(path_translated+5, env_path_info, 0xfffffffd);

Supongo que te gusta

Origin blog.csdn.net/a2831942318/article/details/129621316
Recomendado
Clasificación