PHP-CGI遠程任意代碼執行漏洞(CVE-2012-1823)修復方案


 

  首先介紹一下這個漏洞,其實是在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM