php escapeshellcmd多字節編碼漏洞(3)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:詳細講解PHP中緩存技術的應用
      PHP,一門最近幾年興起的web設計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp網站,在速度上有絕對的優勢,想mssql轉6萬條數據php如需要40秒,asp不下2分鐘.但是,由于

      大家可以看到,在php的處理過程中,它是單字節處理的,它只把輸入當作一個字節流,而在linux設置了GBK字符集的時候,它的處理是雙字節的,大家的理解很明顯地不一致。我們查下GBK的字符集范圍為8140-FEFE,首字節在 81-FE 之間,尾字節在 40-FE 之間,而一個非常重要的字符的編碼為5c,在GBK的尾字節范圍之內,這樣我們考慮一個特殊的輸入:

      0xbf;id 或 0xbf'id

      經過php的escapeshellcmd單字節轉碼之后將會是

      0xbf5c;id

      0xbf5c'id

      注意0xbf5c是一個合法的GBK編碼,那么在linux執行的時候,會認為輸入是

      [0xbfbc];id

      很好,后面的id將會被執行。可以做個簡單的實驗,如下:

       [loveshell@Loveshelltmp]$echo?lt;br />>
      ?
      [loveshell@Loveshelltmp]$set|grep-ilang
      LANG=zh_CN.GB2312
      LANGVAR=en_US.UTF-8
      [loveshell@Loveshelltmp]$exportLANG=zh_CN.GBK
      [loveshell@Loveshelltmp]$echo?lt;br />?lt;br />[loveshell@Loveshelltmp]$set|grep-ilang
      LANG=zh_CN.GBK
      LANGVAR=en_US.UTF-8
      [loveshell@Loveshelltmp]$

      其中康謀嗦胛?xbf5c,可以看到在不設置LANG為GBK的時候渴且桓齜欠ǖ膅b2312編碼,所以會被認為是兩個字符,所以其中含有的0x5c起作用,被認為命令沒結束。然后我們設置編碼為GBK,烤突岜蝗銜且桓鱟址磂cho了。

      那我們如何來證明php的漏洞呢,拿

      <?php
      $e=escapeshellcmd($_GET[c]);
      //herewedon'tcareif$ehasspaces
      system("echo$e");
      ?>

      作為例子,正常情況下上面的代碼工作很好,我們提交

      分享:利用PHP V5開發多任務應用程序
      許多 PHP 開發人員認為,由于標準的 PHP 缺少線程功能,因此實際 PHP 應用程序不可能執行多任務處理。例如,如果應用程序需要其他 Web 站點的信息,那么在遠程檢索完成之前它都必須停止。這是錯

      共3頁上一頁123下一頁
      來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
      相關PHP教程