CGI 程 序 的 功 能 是 強 大 的, 但 正 是 因 為 如 此 , 如 果 您 作 為 CGI 開 發 人 員 或 系 統 管 理 人 員 不 注 意 編 寫 和 設 置 CGI 程 序 的 話,將 使 您 的 系 統 千 瘡 百 孔。 本 篇 就 CGI的 安 全 性 問 題 做 一 討 論。
3 、 CGI 的 安 全 性
CGI 程 序 的 功 能 是 強 大 的 , 它 不 僅 可 以 具 有 普 通 程 序 的 功 能 , 而 且 可 以 將 程 序 的 結 果 發 布 在 WEB 上 。 但 正 是 因 為 CGI 程 序 的 功 能 如 此 強 大 , 如 果 您 作 為 CGI 開 發 人 員 或 系 統 管 理 人 員 不 注 意 編 寫 和 設 置 CGI 程 序 的 話 , 將 使 您 的 系 統 千 瘡 百 孔 , 讓 一 些 非 法 用 戶 有 機 可 乘 。
這 裡 所 講 到 的 安 全 性 並 不 是 CGI 規 范 引 起 的 , 而 是 編 程 和 系 統 設 置 不 當 引 起 的 。 CGI 規 范 使 用 戶 可 以 利 用 服 務 器 的 計 算 能 力 , 是 在 服 務 器 上 的 計 算 不 當 導 致 了 系 統 的 安 全 漏 洞 。 下 面 我 給 出 一 個 在 UNIX 系 統 上 的 一 個 CGI 安 全 漏 洞 , 這 個 漏 洞 是 非 常 常 見 的 。
# !/usr/local/bin/perl
# formmail.CGI
require "CGI.pl";
# Launch e-mail application "/bin/mail" with Subject: header from the "formname" fIEld
open (MAIL, "|/bin/mail -s '".$input{"formname"}."' webweave");
# Add send "formcontents" fIEld as the body of the message
print MAIL $input{"formcontents"};
close(MAIL);
exit(0);
在 這 個 例 子 中 , CGI 程 序 將 表 單 的 信 息 提 交 給 /bin/mail , 並 發 送 到 webveave 服 務 器 上 去 。 在 大 多 數 情 況 下 這 個 CGI 程 序 可 以 正 常 完 成 任 務 , 但 此 CGI 程 序 未 過 濾 用 戶 在 WEB 表 單 中 輸 入 的 信 息 , 因 此 留 下 了 安 全 隱 患 。 當 用 戶 或 別 有 用 心 的 人 輸 入 了 錯 誤 的 數 據 可 能 導 致 系 統 錯 誤 或 得 到 不 應 有 的 權 限 。
例 如 用 戶 在 WEB 表 單 的 "formname" 中 填 寫 下 面 的 內 容 :
"ls /etc/passwd '
[email protected] #'
在 用 戶 的 WEB 浏 覽 器 中 就 會 顯 示 出 /etc/passwd 的 內 容 , 若 此 UNIX 系 統 的 passwd 文 件 沒 有 shadow , 用 戶 就 可 以 利 用 此 內 容 , 使 用 crack jack 或 crack john 就 可 以 試 圖 破 解 密 碼 !
前 面 已 經 提 到 , CGI 的 安 全 是 程 序 員 和 系 統 管 理 員 都 應 負 責 的 , 下 面 我 就 分 別 講 一 講 二 者 應 注 意 的 事 :
系 統 管 理 員 的 工 作 :
1 、 與 程 序 員 合 作 , 共 享 有 關 服 務 器 安 全 的 信 息 , 同 時 互 相 檢 查 代 碼 , 及 時 發 現 代 碼 中 的 安 全 問 題 。
2 、 使 用 好 的 服 務 器 軟 件 , 經 常 去 服 務 器 軟 件 的 WEB 站 點 了 解 最 新 的 信 息 。
3 、 將 服 務 器 的 用 戶 限 制 在 特 定 的 網 絡 主 機 上 , 使 用 服 務 器 的 安 全 管 理 功 能 、 設 置 路 由 存 取 控 制 等 。
4 、 對 CGI 功 能 進 行 限 制 , 部 分 高 級 服 務 僅 限 於 信 任 的 用 戶 , 將 測 試 中 的 CGI 程 序 的 使 用 限 制 在 開 發 人 員 中 , 只 提 供 給 用 戶 經 過 測 試 的 CGI 程 序 。
5 、 在 使 用 其 他 人 的 CGI 程 序 時 , 仔 細 檢 查 代 碼 。
6 、 將 CGI 程 序 的 使 用 限 制 在 受 保 護 的 環 境 中 , 服 務 器 設 置 成 非 特 權 用 戶 訪 問 , 並 為 CGI 程 序 專 門 設 立 一 個 運 行 帳 戶 或 組 。
7 、 將 運 行 CGI 程 序 的 服 務 器 設 置 在 防 火 牆 外 , 這 一 點 一 定 要 注 意 , CGI 程 序 的 服 務 器 必 須 設 置 在 防 火 牆 外 , 如 果 設 置 在 防 火 牆 內 , 一 旦 非 法 用 戶 找 到 了 CGI 程 序 服 務 器 的 安 全 漏 洞 , 他 就 可 以 控 制 在 防 火 牆 內 的 所 有 主 機 !
8 、 降 低 CGI 程 序 的 運 行 優 先 級 , 防 治 用 戶 惡 意 運 行 大 量 的 CGI 程 序 導 致 服 務 器 過 載 。
9 、 訂 閱 有 關 網 絡 安 全 性 的 郵 件 , 參 加 網 絡 安 全 性 的 新 聞 組 。
CGI 程 序 員 的 工 作 :
1 、 同 系 統 管 理 員 合 作 , 了 解 系 統 的 安 全 信 息 , 相 互 檢 查 代 碼 。
2 、 使 用 可 靠 的 庫 程 序 , 檢 查 庫 程 序 的 源 代 碼 。
3 、 從 REMOTE_HOST 中 得 到 客 戶 機 名 , 將 一 些 高 級 功 能 限 制 在 受 信 任 的 客 戶 機 。
4 、 如 果 WEB 服 務 器 提 供 HTTP 口 令 確 認 , 使 用 HTTP 口 令 來 限 制 訪 問 。
5 、 過 濾 用 戶 的 輸 入 , 去 除 非 法 的 輸 入 數 據 。
6 、 限 制 輸 入 數 據 的 大 小 , 防 止 惡 意 用 戶 輸 入 大 量 數 據 使 服 務 器 過 載 。
7 、 避 免 傳 遞 用 戶 數 據 到 其 他 應 用 程 序 , 以 免 用 戶 調 用 命 令 解 釋 器 或 利 用 其 他 應 用 程 序 的 安 全 漏 洞 。
8 、 發 現 了 CGI 程 序 的 漏 洞 時 , 不 要 對 任 何 人 講 , 更 不 要 在 程 序 中 注 釋 說 明 , 您 應 該 作 的 就 是 立 刻 修 補 漏 洞 。
9 、 學 作 攻 擊 者 , 找 出 CGI 程 序 的 安 全 漏 洞 。