2016-11-08 25 views
1

今天我得到一個錯誤,很驚訝得到它,因爲一切看起來都很好......在調用CGI時,Apache2中是否存在特殊情況,並且URI包含一個沒有值的單個查詢字符串參數?

我有一個用C++編寫的CGI,它接受查詢字符串的URI。查詢字符串就是選擇頁面等CGI安裝在一個Ubuntu安裝標準位置:

/usr/lib/cgi-bin/snapmanager.cgi 

今天我完成了添加登錄屏幕並登錄後,我想添加一個註銷鏈接。鏈接只需在網址的末尾添加?logout

http://www.example.com/cgi-bin/snapmanager.cgi?logout 

失敗。

檢查錯誤日誌,我得到一個錯誤,說「註銷」實際上出現在命令行上。令人驚訝的是,如果你問我!我嘗試過:

http://www.example.com/cgi-bin/snapmanager.cgi?logout=now 

和一切按預期工作。在命令行上沒有註銷。

我也試過:

http://www.example.com/cgi-bin/snapmanager.cgi?logout&host=foo 

這工作太。再一次,沒有在命令行上註銷。

但是,如果切換參數的位置再次失敗:

http://www.example.com/cgi-bin/snapmanager.cgi?host=foo&logout 

所以看起來的Apache2叫我與logout查詢字符串作爲命令行參數CGI當一個查詢字符串名稱是最後定義。

爲了以防萬一,我試圖在名稱的開頭添加破折號,果然,在我的日誌中顯示爲命令行開關!

error:snapmanager.cgi: option --logout is not supported. 

真的很可怕。這是一個巨大的安全風險,如果你知道一個開關,可以「調整你的方式」...

是否記錄在某處?

回答

2

其實我在第4.4

4.4找到了答案在RFC3875。腳本命令行

某些系統支持向CGI腳本提供字符串數組的方法。這僅在'索引'HTTP查詢中使用,該查詢由具有不包含任何未編碼的「=」字符的URI查詢字符串的'GET'或'HEAD'請求標識。對於這樣的請求時,服務器應該將查詢字符串作爲搜索字符串,並將其解析爲詞語,使用規則

search-string = search-word *("+" search-word) 
search-word = 1*schar 
schar   = unreserved | escaped | xreserved 
xreserved  = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "," | 
       "$" 

解析後,將各搜索詞是URL解碼,在任選地編碼系統定義的方式,然後添加到命令行參數列表中。

如果服務器無法創建參數列表的任何部分,那麼服務器絕不能生成任何命令行信息。例如,參數的數量可能會大於操作系統或服務器的限制,或者其中一個單詞可能無法表示爲參數。

該腳本應該檢查查看QUERY_STRING值是否包含未編碼的「=」字符,並且不應該使用命令行參數。

重點煤礦

相關問題