php escapeshellcmd多字節編碼漏洞(3)_PHP教程
推薦:詳細講解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 站點的信息,那么在遠程檢索完成之前它都必須停止。這是錯
- 相關鏈接:
- 教程說明:
PHP教程-php escapeshellcmd多字節編碼漏洞(3)
。