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);