php5.2.3远程CGI缓冲溢出漏洞 2008-02-16 11:41
php5.2.3远程CGI缓冲溢出漏洞
yuangehttp://hi.baidu.com/yuange1975
影响版本: php5.2.3
不影响版本: 其它版本
php5.2.3在处理CGI的时候,由于一编程错误(缺少括号),错误计算一字符串长度,导致堆缓冲溢出,可能远程执行任意代码。
触发方式:配置.php到php.exe的CGI映射,请求GET /test.php/aa HTTP/1.1
错误发生在php-5.2.3\sapi\cgi\cgi-man.cline 886:
int path_translated_len = ptlen +env_path_info ? strlen(env_path_info) : 0;
程序应该是
int path_translated_len =ptlen + (env_path_info ? strlen(env_path_info) : 0);
程序处理流程:
main()
{
......
init_request_info(TSRMLS_C);
......
}
static voidinit_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 学习高手文章的分界线==========================
https://blog.csdn.net/a2831942318
=================================================================
学习时间:2023-03-17
编译环境:VS2022x64
#define TSRMLS_D 1
static 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、ptlen = 5; env_path_info = NULL 时,代码进入了 strlen(NULL), 崩溃。
2、ptlen = 5; env_path_info ="aa" 时,path_translated_len为2,malloc分配了3,
nMemcpyLen=2-5=0xfffffffd
执行了memcpy(path_translated+5, env_path_info, 0xfffffffd);
*/
1、ptlen = 5; env_path_info = NULL 时,代码进入了 strlen(NULL), 崩溃。
知识点:C语言有15级优先级:
级别(由高到低) 操作符(使用空格分隔) 结合性
1 () [] -> . 由左向右
2 ! ~ ++ -- + - * (type) sizeof 由右向左
3 * / % 由左向右
4 + - 由左向右
5 << >> 由左向右
6 < <= > >= 由左向右
7 == != 由左向右
8 & 由左向右
9 ^ 由左向右
10 | 由左向右
11 && 由左向右
12 || 由左向右
13 ?: 由右向左
14 = += -= *= /= %= &= ^= |= <<= >>= 由右向左
15 , 由左向右
条件三元表达式” ?: ”在c语言的15级优先级中,属于倒数第3优先级。
代码先执行了加法运算:
int path_translated_len = ptlen + env_path_info ?strlen(env_path_info) : 0;
2、ptlen = 5; env_path_info ="aa" 时,path_translated_len为2,malloc分配了3,
nMemcpyLen= 2 -5 = 0xfffffffd,
执行了memcpy(path_translated+5, env_path_info, 0xfffffffd);