php escapeshellcmd多字節(jié)編碼漏洞(2)_PHP教程
推薦:詳細(xì)講解PHP中緩存技術(shù)的應(yīng)用PHP,一門最近幾年興起的web設(shè)計(jì)腳本語(yǔ)言,由于它的強(qiáng)大和可伸縮性,近幾年來(lái)得到長(zhǎng)足的發(fā)展,php相比傳統(tǒng)的asp網(wǎng)站,在速度上有絕對(duì)的優(yōu)勢(shì),想mssql轉(zhuǎn)6萬(wàn)條數(shù)據(jù)php如需要40秒,asp不下2分鐘.但是,由于
可以看到,php通過將",',#,&,;.....等等在shell命令行里有特殊意義的字符都通過在前面加上變成".',#,&,;......來(lái)進(jìn)行轉(zhuǎn)義,使得用戶的輸入被過濾,來(lái)避免產(chǎn)生command injection漏洞。在php看來(lái),只要過濾了這些字符,送入到system等函數(shù)中時(shí),參數(shù)就會(huì)是安全的,php手冊(cè)中給出的利用例子如下:
<?php
$e=escapeshellcmd($userinput);
//herewedon'tcareif$ehasspaces
system("echo$e");
$f=escapeshellcmd($filename);
//andherewedo,soweusequotes
system("touch"/tmp/$f";ls-l"/tmp/$f"");
?>
很明顯,如果沒有經(jīng)過escapeshellcmd的處理,用戶輸入hello;id的話,最后system執(zhí)行的會(huì)是:
echo hello;id
;在shell里是分割命令的作用,這樣不僅僅會(huì)echo hello,還會(huì)執(zhí)行id這個(gè)命令,導(dǎo)致命令注入漏洞。用escapeshellcmd處理之后命令變成:
echo hello;id
這樣執(zhí)行的命令就只會(huì)是echo,其他的都變成echo的參數(shù),很安全。
事實(shí)上是這樣么?php在處理完參數(shù)送入system之后它就什么都不管了,后面的工作實(shí)際上都是由linux來(lái)完成的,那么linux在處理這些參數(shù)的時(shí)候是怎么樣的呢?linux在執(zhí)行命令的時(shí)候會(huì)有一些的表示工作環(huán)境的環(huán)境變量,譬如PWD代表當(dāng)前的工作環(huán)境,UID代表了你的身份,BASH代表命令解釋器等等......而在linux系統(tǒng)執(zhí)行命令的時(shí)候,還有一個(gè)非常重要的參數(shù),LANG,這個(gè)參數(shù)決定了linux shell如何處理你的輸入,這樣就可以當(dāng)你輸入一些中文字符的時(shí)候,linux能認(rèn)識(shí)他,不至于出現(xiàn)人與系統(tǒng)之間出現(xiàn)理解上的錯(cuò)誤。默認(rèn)情況下,linux的LANG是en_US.UTF-8,UTF-8是一個(gè)很安全的字符集,其系列中包含有對(duì)自身的校驗(yàn),所以不會(huì)出現(xiàn)錯(cuò)誤,會(huì)工作良好。一些系統(tǒng)支持多字節(jié)字符集如GBK的時(shí)候,這也正是國(guó)內(nèi)的多數(shù)情況,你可以設(shè)置LANG=zh_CN.GBK,這樣你的輸入都會(huì)被當(dāng)作GBK編碼處理,而GBK是雙字節(jié)的,合法的GBK編碼會(huì)被認(rèn)為是一個(gè)字符。
分享:利用PHP V5開發(fā)多任務(wù)應(yīng)用程序許多 PHP 開發(fā)人員認(rèn)為,由于標(biāo)準(zhǔn)的 PHP 缺少線程功能,因此實(shí)際 PHP 應(yīng)用程序不可能執(zhí)行多任務(wù)處理。例如,如果應(yīng)用程序需要其他 Web 站點(diǎn)的信息,那么在遠(yuǎn)程檢索完成之前它都必須停止。這是錯(cuò)
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- 談PHP框架對(duì)PHP發(fā)展的影響
- 網(wǎng)頁(yè)實(shí)例:詳細(xì)介紹用PHP來(lái)編寫網(wǎng)頁(yè)記數(shù)器
- PHP程序中使用session錯(cuò)誤調(diào)試問題
- 用php odbc access數(shù)據(jù)庫(kù)來(lái)操作函數(shù)
- 黑客隱藏PHP文件后門的技巧
- 在PHP中設(shè)置、使用、刪除Cookie的解決方法
- PHP session_start()問題解疑(詳細(xì)介紹)
- PHP CLI模式下的多進(jìn)程應(yīng)用分析
- 《PHP設(shè)計(jì)模式介紹》第十四章 動(dòng)態(tài)記錄模式
- PHP生成縮略圖失真/不清晰的解決方法
- 相關(guān)鏈接:
- 教程說明:
PHP教程-php escapeshellcmd多字節(jié)編碼漏洞(2)
。