本文寫給想在win2k平臺上架設一個安全web站臺的朋友們。
所需要的程序:
apache
http://www.apache.org/dist/httpd/binaries/win32/
我們選用apache_1.3.28-win32-x86-no_src.msi,或者apache_2.0.47-win32-x86-no_ssl.msi
都可以,勿使用低版本的程序,它們有缺陷,很容易遭到internet上的攻擊
php
http://cn2.php.net/get/php-4.3.3-win32.zip/from/a/mirror
php-4.3.3
mysql
http://www.mysql.com/get/downloa ... 5-win.zip/from/pick
mysql-4.0.15
注:低于這個版本的mysql,有缺陷,勿使用
zendoptimizer-2[1].1.0a-windows-i386.exe
php的優化器,支持加密php腳本
mysql-front
一個運行于ms平臺的gui的mysql的管理器,非常好用
phpmyadmin-2.5.0-php.zip
基于php腳本的mysql管理器
phpencode.exe
php加密編譯器
install~
1.安裝apache
由于安裝很簡單,pass~!,只是要注意的是,請勿安裝到系統分區上
因為這樣,無論從備份,維護,災難性恢復上,都是有優勢的.
假設安裝到了d://
2.安裝php
具體安裝過程請參考php目錄里的install.txt
需要注意的是,請勿使用cgi方式
以下為引用資料
------------------------------------------------------------------
title 17/2/2002
php for windows arbitrary files execution (gif, mp3)
summary
through php.exe, an attacker can cause php to interpret any file as a php file,
even if its extensions are not php. this would enable the remote attacker to
execute arbitrary commands, leading to a system compromise.
details
vulnerable systems:
php version 4.1.1 under windows
php version 4.0.4 under windows
an attacker can upload innocent looking files (with mp3, txt or gif extensions)
through any uploading systems such as webexplorer (or any other php program that
has uploading capabilities), and then request php to execute it.
example:
after uploading a file a /"gif/" extension (in our example huh.gif) that contains
php code such as:
#------------
<?
phpinfo();
?>
#------------
an attacker can type the following address to get in to cause the php file to be
executed:
http://www.example.com/php/php.exe/upload_directory/huh.gif
notice: php/php.exe is included in the url.
additional information
the information has been provided by compume and rootextractor.
ps:大部分版本都有這個毛病.包括一些最新版本,所以請不要以cgi安裝!切記...
3.安裝mysql
安裝到d://,也很簡單,具體過程pass.
只是mysql安裝后的默認設置實在讓人擔心
以下引用我原來的文章
-----------------------------------------------------------------------------------
2002/12/21
寫在前面:無事可做,生命被消耗,痛~~~啊,所以就寫了,本文no原創,整理而成!
默認安裝的mysql服務不安全因素涉及的內容有:
一.mysql默認的授權表
二.缺乏日志能力
三.my.ini文件泄露口令
四.服務默認被綁定全部的網絡接口上
五.默認安裝路徑下的mysql目錄權限
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一.mysql默認的授權表
由于mysql對身份驗證是基于mysql這個數據庫的,也叫授權表。所有的權限設置都在這里了。
我們只討論最為重要的一個表 user表。它控制的是接受或拒絕連接。
先看一下
select host,user,password,delete_priv from user;
+-----------+------+------------------+-------------+
| host | user | password | delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | y |
| % | root | | y |
| localhost | | | y |
| % | | | n |
+-----------+------+------------------+-------------+
現在新的版本,安裝完畢都會出現一個快速設置窗口,用于設置口令。
以上,就是user表里的內容(略了點)看看有什么問題?
我們知道mysql的驗證方式是比較特殊的,它基于兩個2個信息來進行的
1.從那里連接
2.用戶名
第一條沒什么問題,當然口令必須是安全的。
第二條從任何主機,以用戶root,不需要口令都可以連接,權限為所有的權限。(注:這里的權限是全局權限)
第三條從本地主機,任何用戶名(注:user為空白,不表示不需要用戶名),不需要口令,都可以連接,所有的權限
第四條從任何主機,任何用戶名,不需要口令,都可以連接,無任何權限。
可以看出,2//3//4都是不安全的,如何攻擊這里就不說了,請參看資料文庫。
如果你mysql只允許本地連接,刪除host的%和user中的nul(表示空)
delete from user where host=‘%‘;
delete from host where user=‘‘;
最后的user表,看起來因該是這個樣子
+-----------+------+------------------+-------------+
| host | user | password | delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | y |
+-----------+------+------------------+-------------+
最后需要刷新授權表,使其立刻生效
flush privileges;
如果你的mysql需要被遠程使用,需要為%段中的root帳號,加上一個安全的密碼
update user set password=password(‘youpass‘) where host=‘%‘;
其中youpass,就是口令
mysql> select host,user,password,delete_priv from user;
+-----------+------+------------------+-------------+
| host | user | password | delete_priv |
+-----------+------+------------------+-------------+
| localhost | root | 67457e226a1a15bd | y |
| % | root | 77c590fa148bc9fb | y |
+-----------+------+------------------+-------------+
更好的做法是,對遠程主機的連接,指定為特定的
修改host中的%為允許連接的主機,比如:
192.168.0.% 允許一個特定的子網
www.sandflee.net 允許一個特定的主機
帳號默認的名字也是擔心的問題。有可能導致被暴力破解
update user set user=‘localadmin‘ where host=‘localhost‘;
update user set user=‘remoteadmin‘ where host=‘%‘;
最后的user表看起來像是這個樣子
mysql> select host,user,password,delete_priv from user;
+-----------+-------------+------------------+-------------+
| host | user | password | delete_priv |
+-----------+-------------+------------------+-------------+
| localhost | localadmin | 67457e226a1a15bd | y |
| % | remoteadmin | 77c590fa148bc9fb | y |
+-----------+-------------+------------------+-------------+
更為詳細的資料,請去參考晏子的《mysql中文參考手冊》。隨便那都有下
二.缺乏日志能力
mysql安裝完成以后,會在%systemroot%目錄下產生my.ini的設置文件
默認的內容如下:
——————————————————————————————
basedir=c:/mysql
#bind-address=192.168.0.1
datadir=c:/mysql/data
#language=c:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16m
[winmysqladmin]
server=c:/mysql/bin/mysqld-nt.exe
user=root
password=root
———————————————————————————————
注意log#=這個
它沒有被定義,且被注銷掉了。
更改為一個適合的路徑,比如:
log=c:/mysql/logs/mysql.log
三.my.ini文件泄露口令
我們看到my.ini最后,有這兩句
user=root
password=root
如果,你安裝完成時,使用了mysql所提供的快速設置功能,(較新的版本)你的帳號和口令將被寫到my.ini文件中。
這也是mysql寫到啟動組里的winmysqladmin.exe工具,運行時需要讀取的。它提供的mysql服務
的一些監視功能。這樣winmysqladmin.exe才能獲得mysql服務的狀態信息。
其實,這個也不算漏洞,我們看看my.ini默認的權限,它可以被user組用戶讀取。
從而導致口令被泄露
解決方法:
從新設定my.ini文件的權限.
從新設定帳號及口令
不使用快速設置
四.服務默認被綁定全部的網絡接口上
服務被綁定到了所有的網絡接口上,比如,你只需要一個運行在內網的mysql服務,但是你的機器有
外網的接口,mysql也會被綁定上,從而帶來一些不必要的麻煩和威脅。
在my.ini里的這句
#bind-address=192.168.0.1
它默認被注銷掉了
應該打開它
如果,只是本地使用,更改為
bind-address=127.0.0.1
如果是其它情況,應該選者一個合適的網絡接口
五.默認安裝路徑下的mysql目錄權限
mysql默認的安裝路徑為c://mysql,基本上都難得改,要改的話也是麻煩,還要去改my.ini。
但,這樣就有個問題
通常c://的權限是everyone組-所有的權限。這是默認的,由于繼承性,導致mysql下的data目錄
也是everyone組-所有的權限。導致被隨意訪問、讀取、刪除,可能泄露和破壞數據。
更改mysql目錄到一個合適,安全的訪問權限。
over...
-----------------------------------------------------------------------------------------
這里面有個小小的語法錯誤,請自己找出來:)
setup~
3個配置文檔
httpd.conf---apache
php.ini-----php
my.ini------mysql
1.http.conf
由于ms版本的apache不像*nix下有
user,group這兩條指令,所以你別指望它能像iis一樣,把服務器應答影射到了iusr_name賬號上
*nix下為nobody,所以你的apache是以system權限來運作的,它不太適合用于架設提供個人主頁服務器
httpd.conf很多參數,基本不用修改就可以工作了
以下是要修改的地方
刪除htdocs目錄下的所有文件.刪除cgi-bin下的所有文件,它們是用于測試用的,不應該被保留.
bindaddress * --需要綁定的地址 *只所有地址
directoryindex index.html index.htm --默認首頁的名字
accessfilename .htaccess --控制文件名字,建議關掉或改名字,而且以/"./"開始的文件名在windows下是不允許的
serversignature on --出錯信息,建議off.這樣就不會顯示你apache的版本號了
-----------------------------------------------
alias /manual/ /"d:/apache/htdocs/manual//"
<directory /"d:/apache/htdocs/manual/">
options indexes followsymlinks multiviews
allowoverride none 清除
order allow,deny
allow from all
</directory>
-----------------------------------------------
addhandler cgi-script .cgi .pl --如果需要支持cgi,就需要打開,否者注釋掉
loadmodule php4_module d:/php/sapi/php4apache.dll
addmodule mod_php4.c
addtype application/x-httpd-php .php --加入對php腳本的支持
2.php.inf
engine = on --打開php支持,如果不讓php工作可以engine = off
safe_mode = off --安全模式,應該打開它safe_mode = on
safe_mode_exec_dir = --設定安全模式下可以執行程序的目錄
disable_functions = 要關閉的函數,用/",/"分隔建議關閉phpinfo,get_cfg_var
expose_php = on 建議expose_php = off,這樣在header里就不會有php的版本號
display_errors =on 建議 display_errors =off,這樣所有錯誤信息,都將關閉
register_globals = off 自動全局變量,一般都要打開register_globals = on,但會引發很多
安全問題,特別是一些寫編寫的不是很好的php腳本,有可能危及到你的web server
file_uploads = on 是否允許上傳文件,如果你不需要就off
allow_url_fopen = off 是否遠程打開功能,建議關閉
;extension=php_gd.dll
;extension=php_gettext.dll
;extension=php_hyperwave.dll
;extension=php_iconv.dll
;extension=php_ifx.dll 打開一些需要支持的庫,比如使用要使用圖形函數
需要copy php/extensions/php_gd.dll到你的系統目錄,然后去掉;
重新啟動apache,就可以使用了
3.my.ini
上面有了,pass
安全建議,以上3個設置文件,把他們的權限設定為system所有權限,administrators所有權限
4.強化虛擬目錄的安全性
一些重要的指令
具體的列子:
<directory /"d:/apache/htdocs/tools/">
options indexes
allowoverride none
order allow,deny
allow from all
</directory>
php_flag engine off ;關閉php解釋執行功能
php_admin_value safe_mode 1 ;安全模式 1-打開 0-關閉
php_admin_value open_basedir d:/apache/htdocs/tools ;限制在一個制定的目錄
這樣就限制了php腳本只能打開d:/apache/htdocs/tools下的文件.
以下代碼就沒什么用了
-----------------------------------------------------------
$fd = fopen( $filename, /"r/" );
$view = fread($fd, filesize($filename));
echo /"<pre>/";
echo htmlspecialchars(/"$view/";
echo /"</pre>/";
fclose( $fd );
-----------------------------------------------------------
啟用apache-http驗證功能
清除
<directory /"d:/apache/htdocs/home/">
...
...
allowoverride authconfig
</directory>
中的
參數 allowoverride authconfig
注意的,這里的d:/apache/htdocs/home,表示為我安裝的apache服務的web根目錄,你的和我的不一定一樣
默認的,好象就沒這個 allowoverride authconfig參數。
allowoverride authconfig參數的含義。
它的含義是,根目錄下所有目錄的訪問控制由它目錄下的.htaccess文件來設定。
這里,我要多說點廢話了。
為什么是.htaccess,這個文件名,而不是其它的。
這個是在accessfilename參數中定義的。默認的是這樣。
accessfilename .htaccess
你要做的清除allowoverride authconfig參數(加#或者刪掉)
這樣做的理由
1.我覺得麻煩(每個目錄都需要放上.htaccess文件,且以/"./"開頭的文件名在windows系統下,是不允許的。)
2.不太安全 (它有可能被人看到。)
如何對你所想要指定的目錄進行驗證?
一個列子
<directory /"d:/apache/htdocs/home/"> //定義要驗證目錄路徑
authtype basic //方式,windows不支持md5,所以請使用basic方式
authname test //定義顯示在對話框領域名字
authuserfile d:/apache/user //定義密碼文件
errordocument 401 /"error password //定義驗證失敗后顯示的內容,當然可以是文件了
require valid-user 注意,我這里讓它直接顯示error password,用/"開頭就是了,只有一個哦
</directory>
直接加到httpd.conf后面就是了。
然后在apache的安裝目錄里的bin目錄里有個htpasswd.exe文件
請到cmd下運行它
d://apache//bin>htpasswd.exe
usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password
htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c create a new file. //創建一個新的密碼文件(你第一次使用,因該使用這個參數)
-n don/'t update file; display results on stdout. //顯示到屏幕
-m force md5 encryption of the password (default). //加密口令(md5方式)默認的
-d force crypt encryption of the password. //使用crypt方式加密口令
-p do not encrypt the password (plaintext). //不加密口令
-s force sha encryption of the password. //使用sha算法加密
-b use the password from the command line rather than prompting for it. //互交方式
on windows, tpf and netware systems the /'-m/' flag is used by default.
on all other systems, the /'-p/' flag will probably not work.
——————————————————————————————————————
列子:
d://apache//bin>htpasswd.exe -c d://apache//user taotao
automatically using md5 format on windows.
new password: ***
re-type new password: ***
adding password for user taotao
就創建完成了
其中,要注意的
passwordfile,不應該放到web目錄,因為會被人下載,很蠢,雖然密碼已經被md5過
-c 參數是用于創建一個新的密碼文件。
d://apache//user路徑,要和你在
authuserfile d:/apache/user 設置的一致。
然后從新啟動你的apache服務
記得備份你的httpd.conf,php.ini和my.ini
安裝zendoptimizer-2[1].1.0a-windows-i386.exe
很簡單,它回自動修改你的php.ini(c://winnt//php.ini)文件
添加了如下內容:
[zend]
zend_optimizer.optimization_level=15
zend_extension_ts=/"c://program files//zend//lib//zendoptimizer.dll/"
安裝php優化器有很多的好處
加速了php的運行速度,最為重要的是它可以加密php腳本
這樣你寫在php腳本里的user ,pass就可以很好的被保護了
此外,你還可以修改apache的header,用utraedit32打開apachecore.dll
查找你所對應的apache版本號,改成別的就可以了,比如我改成了
2000