1.脆弱性の説明
脆弱性の説明:
リモートWebサーバーは、トレースやトレース方法をサポートしています。HTTP TRACEでは、Webサーバーが要求されたコンテンツをクライアントに送り返す必要があります。完全なリクエスト(Cookieや認証データなどの機密情報を含む可能性のあるHTTPヘッダーを含む)は、TRACEレスポンスのエンティティ本体で返されます。このリクエストは、主に開発者がHTTPアプリケーションをテストおよびデバッグするために使用し、ほとんどのWebサーバーソフトウェアでデフォルトで使用できます。
修正の提案:
これらのHTTPメソッドを無効にします。
リスクレベル:中
CVE-2003-1567
CVE-2004-2320
CVE-2010-0386
2.処理
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に無効化トレースを実装します。
注:成功したプラクティスリーダーとプログラマーのガイダンスへようこそ、修復方法
3.付録
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