Apache Mod_Access_Referer模块可实现基于\"Referer\" HTTP头字段的访问控制。 Mod_Access_Referer模块解析非法HTTP Referer头字段时存在问题,远程攻击者可以利用这个漏洞对Apache进行拒绝服务攻击。 在find_allowdeny()函数中,uri_components结构的\"uptr\"由Apache ap_parse_uri_components函数初始化,这个结构\"hostname\"指针回提供给is_ip()函数用于判断由referer字段的值是否为IP地址或主机名。相关代码如下: --- -snip snip- --- ap_parse_uri_components (r->pool, ap_table_get (r->headers_in, \"Referer\"), &uptr); if (!is_ip (uptr.hostname)) { --- -snip snip- --- static int is_ip (const char *host) { /* this just tests if it matches [\d.]* */ /* XX is a better test needed? */ while ((*host == \'\'.\'\') || ap_isdigit (*host)) host++; return (*host == \'\'\0\'\'); } --- -snip snip- --- 当服务器接收到不正确的referer头字段,ap_parse_uri_components会不初始化uptr.hostname指针,这就导致is_ip()会读取NULL指针而发生段错误,产生服务崩溃。
Apache Mod_Access_Referer模块可实现基于\"Referer\" HTTP头字段的访问控制。 Mod_Access_Referer模块解析非法HTTP Referer头字段时存在问题,远程攻击者可以利用这个漏洞对Apache进行拒绝服务攻击。 在find_allowdeny()函数中,uri_components结构的\"uptr\"由Apache ap_parse_uri_components函数初始化,这个结构\"hostname\"指针回提供给is_ip()函数用于判断由referer字段的值是否为IP地址或主机名。相关代码如下: --- -snip snip- --- ap_parse_uri_components (r->pool, ap_table_get (r->headers_in, \"Referer\"), &uptr); if (!is_ip (uptr.hostname)) { --- -snip snip- --- static int is_ip (const char *host) { /* this just tests if it matches [\d.]* */ /* XX is a better test needed? */ while ((*host == \'\'.\'\') || ap_isdigit (*host)) host++; return (*host == \'\'\0\'\'); } --- -snip snip- --- 当服务器接收到不正确的referer头字段,ap_parse_uri_components会不初始化uptr.hostname指针,这就导致is_ip()会读取NULL指针而发生段错误,产生服务崩溃。