首先介紹一下這個漏洞,其實是在apache調用php解釋器解釋.php文件時,會將url參數傳我給php解釋器,如果在url后加傳命令行開關(例如-s、-d 、-c或
-dauto_prepend_file%3d/etc/passwd+-n)等參數時,會導致源代碼泄露和任意代碼執行。
這個漏洞影響php-5.3.12以前的版本,mod方式、fpm方式不受影響。
既然出現了,那就補吧,以下都是自己親身經驗,本着開源精神,做個分享,歡迎留言!
三種方案:
1.升級php版本;(php-5.3.12以上版本);
2.在apache上做文章,開啟url過濾,把危險的命令行參數給過濾掉,由於這種方法修補比較簡單,采用比較多吧。
具體做法:
修改http.conf文件,找到<Directory/>增加以下三行
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]
重啟一下apache即可,但是要考慮到,相當於每次request就要進行一次url過濾,如果訪問量大的話,可能會增加apache的負擔。
3.打上php補丁,我個人也比較傾向這一點。
補丁下載地址:https://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
補丁作用:其實就是增加了一個判斷,如果是普通的cgi方式,命令行-s等參數就不再處理,遺憾的是驗證的時候,補丁和我當時的php版本不一致,所以補丁一直打不上。
后來索性改源碼吧,把補丁手動打上,涉及到sapi/cgi/cgi_main.c這個文件。在main函數中,搜索php_getopt用下面這行替換,一共有兩處。
if (!cgi) while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0)) != -1)
替換后就是重新編譯安裝,經我驗證完美解決。
最后上傳cgi_main.c文件,有需要的可以直接下載覆蓋。
下載地址:http://files.cnblogs.com/files/virgree/cgi_main.rar