Windows下PHP+MySQL+IIS安全平臺(tái)III 變態(tài)配置
原創(chuàng)【51CTO.com 獨(dú)家特稿】經(jīng)過(guò)第一,二部分的學(xué)習(xí)我們已經(jīng)了解到了IIS+MySQL+PHP的基本配置過(guò)程和Windows的基本權(quán)限設(shè)置。這一部分我們需要討論php的安全配置還有Web目錄的安全配置,當(dāng)然也必須有IIS的變態(tài)安全配置了。我這里先廢話幾句。
我們最終的目標(biāo)是Web站點(diǎn)只運(yùn)行php,不支持asp不支持asp.net,讓特定的目錄或者子網(wǎng)站不能執(zhí)行php腳本,例如圖片目錄,我們對(duì)它設(shè)置成不能運(yùn)行php,這樣就算您的網(wǎng)站被“黑客”登錄了后臺(tái),能上傳文件。但是最終他也不能執(zhí)行webshell。
就算拿到了webshell,他也不能讀目錄或者文件,不能執(zhí)行命令。換句大話就是說(shuō)強(qiáng)大的webshell在黑客手上沒(méi)有任何的利用價(jià)值,讓黑客最終直接抓狂而死。呵呵!其實(shí)做到這一點(diǎn)不是非常的難,跟隨我的腳步來(lái)吧。學(xué)完本文章你就能獨(dú)立的完成這樣的變態(tài)的服務(wù)器配置了。
一、php.ini文件變態(tài)配置
我們?yōu)槭裁窗裵hp.ini放在最前面寫(xiě)呢,因?yàn)槲覀兊腤eb網(wǎng)站是php的,所以很多默認(rèn)的選項(xiàng)是不安全的。給黑客留下了非常多的可利用機(jī)會(huì),所以第一步我們必須要把php.ini設(shè)置的變態(tài)些,這樣就能阻止一般腳本黑客的攻擊了。
我們首先來(lái)了解一些php.ini的基本概念性??瞻鬃址鸵苑痔?hào)開(kāi)始的行被簡(jiǎn)單地忽略。設(shè)置指令的格式如下:directive = value 指令名(directive)是大小寫(xiě)敏感的!所以"foo=bar"不同于"FOO=bar"。值(value)可以是:
1. 用引號(hào)界定的字符串(如:"foo")
2. 一個(gè)數(shù)字(整數(shù)或浮點(diǎn)數(shù),如:0,1,34,-1,33.55)
3. 一個(gè)PHP常量(如:E_ALL,M_PI)
4. 一個(gè)INI常量(On,Off,none)
5. 一個(gè)表達(dá)式(如:E_ALL & ~E_NOTICE)
還有另外一個(gè)是設(shè)置布爾值,1為On就是開(kāi)啟,0為Off就是關(guān)閉。php.ini分了很多部分,例如:模塊部分,php全局配置,數(shù)據(jù)庫(kù)配置,等等。如圖1所示是一個(gè)基本的php.ini的例子。了解了基本的概念以后我們就可以開(kāi)始變態(tài)配置之旅。
![]() |
圖1 |
第一個(gè)重要的參數(shù)是register_globals. 這個(gè)配置影響到php如何接收傳遞過(guò)來(lái)的參數(shù),說(shuō)白了register_globals的意思就是注冊(cè)為全局變量,所以當(dāng)該參數(shù)為值On的時(shí)候,傳遞過(guò)來(lái)的值會(huì)被直接的注冊(cè)為全局變量直接使用,而當(dāng)該參數(shù)值為Off的時(shí)候,我們需要到從特定的數(shù)組里去得到它。從www.milw0rm.com很多的php漏洞來(lái)看一大部分是因?yàn)镽egister_Globals為On的時(shí)候被利用的,所以強(qiáng)烈推薦將這個(gè)參數(shù)修改成Off,php目前的最高版中此參數(shù)都是默認(rèn)是Off的,沒(méi)啥說(shuō)的了,如果你用的版本比較老的話一定要修改這里。
第二個(gè)重要的參數(shù)是magic_quotes_gpc。如果你把magic_quotes_gpc設(shè)置成了Off,那么php就不會(huì)對(duì)4種字符' (單引號(hào)), " (雙引號(hào)), \ (反斜線) 和 空字符進(jìn)行轉(zhuǎn)義,那這樣的話就會(huì)造成服務(wù)器可能會(huì)被非法注入的可能。但是如果你把Magic_quotes_gpc設(shè)置成On的話,php就會(huì)給$_POST,$_GET,$_COOKIE提交的變量中如果有上面四種字符的話就會(huì)加上\反斜扛.這樣就會(huì)大大地提高php的安全性。強(qiáng)烈推薦將Magic_quotes_gpc設(shè)置為On。
第三個(gè)比較重要的是display_errors。為什么說(shuō)這個(gè)參數(shù)重要呢,因?yàn)闆](méi)有不會(huì)犯錯(cuò)誤的開(kāi)發(fā)者,php的display_errors參數(shù)就是幫助開(kāi)發(fā)者定位和確定這些錯(cuò)誤的??墒侨绻鹥hp提供的這些信息被黑客了解到的話,這就不妙了。如圖2所示為某國(guó)庫(kù)的網(wǎng)站,因?yàn)閷?duì)display_errors沒(méi)有進(jìn)行設(shè)置,導(dǎo)致web目錄泄露。這對(duì)于黑客來(lái)說(shuō)可是非常重要的信息,因?yàn)楹芏鄷r(shí)候的滲透都需要知道web目錄,例如webshell的寫(xiě)入等等。所以我們強(qiáng)烈推薦大家把這個(gè)參數(shù)設(shè)置成Off。
![]() |
圖2 |
第四個(gè)重要的參數(shù)就是safe_mode,就是我們常說(shuō)的安全模式。php的安全模式是個(gè)非常重要的內(nèi)嵌的安全機(jī)制,能夠控制一些php中的函數(shù),比如system()等函數(shù),同時(shí)把很多文件操作函數(shù)進(jìn)行了權(quán)限控制,也不允許對(duì)某些關(guān)鍵文件的訪問(wèn),比如/etc/passwd,但是默認(rèn)的php.ini是沒(méi)有打開(kāi)安全模式的,我們把它打開(kāi)。safe_mode = on。
第五個(gè)參數(shù)是open_basedir,使用open_basedir選項(xiàng)能夠控制PHP腳本只能訪問(wèn)指定的目錄,這樣能夠避免PHP腳本訪問(wèn)不應(yīng)該訪問(wèn)的文件,一定程度上限制了webshell的危害,我們一般可以設(shè)置為只能訪問(wèn)網(wǎng)站目錄(假設(shè)網(wǎng)站目錄為E:\test):open_basedir = E:\test 第六個(gè)參數(shù)是disable_functions,使用disable_functions可以限制一些對(duì)于系統(tǒng)來(lái)說(shuō)威脅很大的函數(shù)。
例如,我們?cè)诘谝徊糠种锌吹降挠衟hpinfo()函數(shù)的網(wǎng)頁(yè)中可以看到關(guān)于php的環(huán)境變量等。還有可以利用system,exec等函數(shù)來(lái)執(zhí)行系統(tǒng)命令等等。這里我們推薦過(guò)濾的函數(shù)如下。disable_functions = phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server。大家如果對(duì)某個(gè)函數(shù)不了解的話,可以google搜索得到函數(shù)的作用,然后來(lái)決定您自己的服務(wù)器是否禁止掉。
第七個(gè)參數(shù)是Com組件。Windows平臺(tái)下的PHP腳本平臺(tái)存在一個(gè)安全漏洞,使得PHP設(shè)置即使在安全模式下(safe_mode),仍舊允許攻擊者使用COM()函數(shù)來(lái)創(chuàng)建系統(tǒng)組件來(lái)執(zhí)行任意命令。漏洞出現(xiàn)的原因是由于在安全模式下的PHP平臺(tái)雖然system();pathru()函數(shù)被禁止,但是com.allow_dcom的設(shè)置依舊是為true。以至于攻擊者可以使用COM()函數(shù)創(chuàng)建系統(tǒng)組件對(duì)象來(lái)運(yùn)行系統(tǒng)命令。
如果是默認(rèn)的Apache設(shè)置或者Web服務(wù)器以Loacalsystem權(quán)限或Administrators權(quán)限運(yùn)行,攻擊者可以使用這個(gè)漏洞來(lái)提升權(quán)限。所以我們必須要關(guān)閉掉com.allow_dcom這個(gè)參數(shù)默認(rèn)是True,我們需要吧這個(gè)參數(shù)修改成com.allow_dcom=false。第八個(gè)參數(shù)是expose_php。這個(gè)參數(shù)決定是否暴露 PHP 被安裝在服務(wù)器上。如圖3所示,如果這個(gè)參數(shù)設(shè)置為On的話就會(huì)把php的版本等泄露出來(lái)了。我們的推薦值是Off。
![]() |
圖3 |
基本上的參數(shù)我們就介紹完了,當(dāng)然php.ini還需要配置,大部分設(shè)置跟安全是沒(méi)有關(guān)系的,很大一部分都跟PHP運(yùn)行的效果(例如優(yōu)化)等有關(guān)系,如果大家有興趣的話可以自己參考一下php的官方手冊(cè)來(lái)具體了解一下。注意:修改完php.ini以后,必須重新啟動(dòng)IIS,不然你設(shè)置的內(nèi)容不會(huì)即時(shí)生效。
#p#
二、 IIS變態(tài)配置
我們配置完了php.ini,雖然已經(jīng)算是相當(dāng)安全了。但是畢竟最重要的設(shè)置還是在IIS上面,IIS可以限制某些用戶的登錄,同時(shí)也可以為數(shù)據(jù)增加SSL(安全套接層)來(lái)增強(qiáng)數(shù)據(jù)在傳輸過(guò)程中的安全性??梢岳肐IS限制某些應(yīng)用程序例如php的執(zhí)行規(guī)則,例如,讓php只能運(yùn)行在指定的目錄中,其他的目錄是不能執(zhí)行php的。下面舉個(gè)例子就好理解了,例如:www.sina.com這個(gè)網(wǎng)站,大家都知道的,這個(gè)是新浪的。
新浪每天的訪問(wèn)量是非常大的,所以他不可能把所有的東西都放在一個(gè)服務(wù)器上面,這個(gè)時(shí)候可能就會(huì)把特定的資源例如圖片,視頻等放到一個(gè)專(zhuān)門(mén)的服務(wù)器上。這個(gè)時(shí)候,新浪的安全管理員就做了個(gè)非常變態(tài)的策略,就是在這些提供特定資源的服務(wù)器上面不能運(yùn)行任何的腳本,例如不能執(zhí)行php等,當(dāng)然我這里只是舉個(gè)例子,因?yàn)榇蟛糠值男吕说姆?wù)器都是Linux系列的,在他上面跑的可能是Nginx或者是apache,apache的這部分設(shè)置我們會(huì)在以后的教程中涉及。
所以希望大家關(guān)注我寫(xiě)的文章啊,呵呵!第一個(gè)變態(tài)的服務(wù)器配置.我們繼續(xù)來(lái)討論IIS.基本的配置請(qǐng)參考第一部分的文章,這里我們就不多說(shuō)廢話了,我們第一個(gè)實(shí)現(xiàn)的功能是特定的php目錄或者是網(wǎng)站不能運(yùn)行php。如圖4所示是我們的網(wǎng)站和網(wǎng)站的資源。劃線部分是我們的目錄,這里我新建一個(gè)目錄例如images目錄,然后在images目錄下建立一個(gè)2009.php的文件,內(nèi)容是phpinfo,如圖5說(shuō)明我們正常執(zhí)行了。我們要達(dá)到的目的是讓這個(gè)目錄不支持php的執(zhí)行.下面我們來(lái)看一下如何實(shí)現(xiàn)的。我們有兩種辦法。
第一種是首先打開(kāi)IIS信息服務(wù)管理器,打開(kāi)我們的網(wǎng)站,然后找到我們剛才新建的目錄,右鍵點(diǎn)擊目錄屬性,如圖6所示。我們看劃紅線的地方,這里有三個(gè)選項(xiàng),分別是無(wú),純腳本,還有一個(gè)是腳本和可執(zhí)行文件。這里我們選擇無(wú),然后單擊“確定”按鈕。如圖7所示,我們?cè)偎⑿乱幌戮蜁?huì)看到2009.php不可以運(yùn)行了。
第二種辦法是利用應(yīng)用程序池來(lái)配置,具體的實(shí)現(xiàn)方法為:如圖8所示,我們選擇畫(huà)紅線的部分,然后就創(chuàng)建了一個(gè)和網(wǎng)站名字一樣的應(yīng)用程序池,然后我們單擊“配置”按鈕出現(xiàn)如圖9所示的畫(huà)面,我們這里把.php的擴(kuò)展去掉。如圖10所示,我們的腳本不能運(yùn)行了,出現(xiàn)了404的錯(cuò)誤,但是我們?cè)L問(wèn)圖片還是一樣可以訪問(wèn),如圖11所示。當(dāng)然上面的配置也可以用于特定的服務(wù)器,例如,您的公司規(guī)模比較大,需要建立一個(gè)專(zhuān)門(mén)的圖片服務(wù)器來(lái)緩解主服務(wù)器的負(fù)載,就可以使用這個(gè)很變態(tài)的方法。
![]() |
圖4 |
![]() |
圖5 |
![]() |
圖6 |
![]() |
圖7 |
![]() |
圖8 |
![]() |
圖9 |
![]() |
圖10 |
![]() |
圖11 |
第二個(gè)變態(tài)的服務(wù)器配置相信一部分人都知道就是給特定的目錄上集成Windows 2003的身份驗(yàn)證功能,例如后臺(tái)的設(shè)置。一個(gè)很常見(jiàn)的場(chǎng)景如下:如果我的后臺(tái)目錄是admin的話,我這里有2個(gè)驗(yàn)證用戶和密碼。
第一道防護(hù)是服務(wù)器上的集成身份驗(yàn)證,就是給服務(wù)器上添加一個(gè)用戶,然后設(shè)置一個(gè)非常變態(tài)的密碼。
第二道防護(hù)就是網(wǎng)站本身的用戶名和密碼,當(dāng)然這兩道防護(hù)的密碼一定不能相同,不然跟沒(méi)用一樣。下面,我們來(lái)實(shí)現(xiàn)一下這個(gè)功能。例如,我們要配置的目錄是admin,右鍵點(diǎn)擊admin的屬性,如圖12所示,我們單擊“身份驗(yàn)證和訪問(wèn)控制”下的“編輯”按鈕,彈出如圖13所示的對(duì)話框,我們選擇“集成windows身份驗(yàn)證”就可以了,同時(shí)去掉“啟用匿名”前面的對(duì)勾,然后單擊“確定”按鈕。我們?cè)俅卧L問(wèn)后臺(tái)目錄就會(huì)出現(xiàn)了如圖14所示的畫(huà)面,要求我們輸入windows服務(wù)器上的用戶名和密碼。
我們現(xiàn)在新建一個(gè)本地的用戶,然后把他的權(quán)限設(shè)置為最小的。我們單擊開(kāi)始菜單 -> 運(yùn)行 -> 輸入cmd,然后在cmd中輸入net user test test /add。添加一個(gè)用戶,這一步?jīng)]啥說(shuō)的。下面講解如何降低test用戶的權(quán)限,右鍵點(diǎn)擊“我的電腦”,選擇“管理”,彈出“計(jì)算機(jī)管理”對(duì)話框,如圖15所示,選擇右鍵單擊剛才新建的test用戶選擇“屬性”,我們選擇用戶“密碼永不過(guò)期”,然后選擇撥入選擇拒絕訪問(wèn).點(diǎn)確定,回到剛才的目錄中,我們輸入我們新建的用戶就可以查看了。
![]() |
圖12 |
![]() |
圖13 |
![]() |
圖14 |
![]() |
圖15 |
![]() |
圖16 |
#p#
三、web目錄的變態(tài)權(quán)限配置
其實(shí)我們?cè)诘?部分的時(shí)候已經(jīng)涉及到了基本的權(quán)限配置原則等,這里我們只是做一些擴(kuò)展。例如,我們的網(wǎng)站的目錄是E:\test。右鍵單擊目錄,選擇“屬性”,彈出如圖17所示對(duì)話框,我們把IUSR_計(jì)算機(jī)名添加進(jìn)來(lái),這個(gè)賬號(hào)是IIS匿名用戶的訪問(wèn)賬號(hào)。
注意畫(huà)長(zhǎng)方形的地方一定不要選擇。不然黑客就能上傳webshell到你的目錄了。但是這樣設(shè)置的話是不行的,例如你的網(wǎng)站需要上傳圖片的時(shí)候,這樣你自己也不能上傳了,這個(gè)時(shí)候我們需要把圖片目錄設(shè)置成可寫(xiě)的,如圖18所示。同時(shí)結(jié)合我們第2部分中學(xué)習(xí)的IIS變態(tài)設(shè)置,把這個(gè)目錄設(shè)置成不能執(zhí)行php的。這樣就達(dá)到了目錄的變態(tài)配置目的了。
![]() |
圖17 |
![]() |
圖18 |
#p#
四、總結(jié)
到這里我們已經(jīng)把Windows+PHP+IIS+MYSQL的變態(tài)安全課程講完了,縱觀本文章,我們可以了解到IIS+MYSQL+PHP的基本配置,NTFS的安全配置等安全配置。這樣我們就得到了一個(gè)比較高水平的而且安全的服務(wù)器了,但是僅這些內(nèi)容是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)閃indows系列不僅包含web服務(wù),還有很多其他的服務(wù),例如FTP的安全,還有組策略等我們都沒(méi)有涉及。
如果以后有機(jī)會(huì)的話,我絕對(duì)會(huì)跟大家繼續(xù)討論有關(guān)于Windows整體安全性。謝謝大家的關(guān)注,如果您有什么問(wèn)題或者是建議的話請(qǐng)聯(lián)系我,我在安天365論壇(http://www.antian365.com/bbs)的ID是cnbird?!?1CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者!】
【編輯推薦】