禁用HTTP跟踪/跟踪

一、漏洞描述

漏洞描述:

远程web服务器支持跟踪和/或跟踪方法。HTTP TRACE要求Web服务器将请求的内容回送给客户端。完整请求(包括HTTP标头,可包括cookie或身份验证数据等敏感信息)将在TRACE响应的实体主体中返回。该请求主要由开发人员用于测试和调试HTTP应用程序,并且在大多数Web服务器软件中默认可用。
修复建议:
禁用这些HTTP方法。

风险级别:中

CVE-2003-1567
CVE-2004-2320
CVE-2010-0386

二、处理

1、本次漏洞为现场环境使用Doris的http模块导致的,可执行如下验证:

curl -v -X TRACE -I http://localhost:8030
nmap -n -p8030 -sT --script http-methods,http-trace be_ip
cat /proc/BE_pid/status  //会看到TracerPid不为0,其值为附加它的父进程pid
#Linux下可直接使用telnet来测试是否有trace回显
curl -sIX TRACE $TARGET | awk 'NR==1 {print $2}'  //当结果为200时,存在风险;正常应该返回405或501

2、Doris部署BE后端时,会使用python的SimpleHTTPServer(生产环境不建议使用,它只实现了简单的安全性)或http.server模块(不建议生产)来快速实现web服务。以下是一个http-server示例:

# -*- coding: UTF-8 -*-
import time
import os
import sys
import urllib
from BaseHTTPServer import (HTTPServer, BaseHTTPRequestHandler)

def close_std_fd():
    f = open(os.devnull, 'w')
    sys.stdin = f
    sys.stdout = f
    sys.stderr = f

def daemon(func):
    pid = os.fork()
    if pid > 0:
        return
    os.setsid()
    pid = os.fork()
    if pid > 0:
        return
    os.chdir('/')
    os.umask(0)
    close_std_fd()
    func()



class MyHandler(BaseHTTPRequestHandler):
        def do_response(self):
                print(self.request)
                print("request path is %s" % self.path)   #
                print("request from ip  is %s" % self.client_address[0])
                url_path,url_pargs = urllib.splitquery(self.path)
                print("request url path is %s" %url_path) 
                print("request pargs is %s" %url_pargs)
                self.send_response(200)
                self.send_header('Content-type','text/html')
                self.end_headers()
                self.wfile.write("<h1>Device Static Content</h1>")
                return
        def do_GET(self):
                self.do_response()
        def do_POST(self):
                datas = self.rfile.read(int(self.headers['content-length']))
                print("post data is %s" %datas)
                print("post data type is %s" %type(datas))
                self.send_response(200)
                self.send_header('Content-type','text/html')
                self.end_headers()
                self.wfile.write("<h1>Device Static Content</h1>")


def run_server():
    server_address = ("", 99)
    server = HTTPServer(server_address, MyHandler)
    sa = server.socket.getsockname()
    print("sa is below")
    print(sa)
    print("Serving  on %s using port %s ..." %(sa[0], sa[1]))
    server.serve_forever()

if __name__ == '__main__':
    if "-d" in sys.argv:
        daemon(run_server)
    else:
        run_server()

官方示例:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

未找到处理办法,更多参看python.org述

3、基于上,更换doris的web为http或nginx来实现。在http和nginx上实现禁用trace。

注:欢迎成功实践的大佬、程序员指导,如何修复

三、附录

1)HTTP服务禁用TRACE跟踪:

vim /etc/httpd/conf/httpd.conf   //在文件最后一行加上
TraceEnable off
vim host.conf //也加上以上的指令,重启apache
/etc/init.d/httpd restart

#另外有经验表明,借助 mod_rewrite 模块可禁止 HTTP Trace请求。mod_rewrite.so模块默认位置在/usr/local/apache目录下;在httpd.conf配置文件中,LoadModule rewrite_module“/usr/local/apache/modules/mod_rewrite.so”可完成模块加载;然后我们可在httpd.conf文件或在各虚拟主机的配置文件里添加如下语句:

RewriteEngine on
RewriteCond %{
    
    REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
#禁用Options方法:
RewriteEngine On
RewriteCond %{
    
    REQUEST_METHOD} ^(OPTIONS)
RewriteRule .* - [F]
#同时禁用Trace方法和Options方法
RewriteEngine On
RewriteCond %{
    
    REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
RewriteRule .* - [F]

2)Nginx禁用:PATCH|TRACE

if ($request_method ~ ^(PATCH|TRACE)$) {
    
     
			return 405; 
		}
http{
    
    
	server{
    
    
		if ($request_method ~ ^(PATCH|TRACE)$) {
    
     
			return 405; 
		}	
		location / {
    
    
			proxy_pass http://fedser32.stack.com:8080;
		}

		location ~ \.(gif|jpg|png)$ {
    
    
			root /data1;
		}

	}

	server {
    
    
                if ($request_method ~ ^(PATCH|TRACE)$) {
    
     
                        return 405; 
                }
    		listen 8080;
    		root /data1/up1;

    		location / {
    
    
    		}
	}
}

3)IIS里禁用:

IIS7及更高版本:

appcmd.exe set config /section:requestfiltering /+verbs.[verb=‘TRACE’,allowed=‘false’]

IIS6:

REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters] “EnableTraceMethod”=dword:00000000

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/125963107
今日推荐