0x00 任務
任務目標: 準備學習環境, 學習 web 服務器的搭建過程, 並做相應的加固學習
操作系統: 虛擬機 ubuntu 18.04
推薦環境: linux+nginx+php-fpm+mysql(爲後續搭建 nginx+lua 的 waf 做準備, 不可以使用集成好的環境)
報告要求: 將整個環境的搭建過程進行詳細記錄, 收集網絡上的加固文檔, 學習加固技術, 從而思考不加固可能存在的安全問題, 對於加固的過程以及對於安全的思考都需要做詳細的記錄。
最終目標: 能夠運行 php 代碼並且可以使用 php 連接 mysql, 成功執行 mysql 的語句
拓展任務: 除了這個 web 環境還有其他的環境可以搭建, 能力強者可以做更多的練習, 比如:基於 apache 的環境、基於 Windows server 的 iis 環境等
0x01 nginx+php環境
nginx
安裝 nginx
sudo apt update
sudo apt install nginx
查看 nginx 服務版本
nginx -v
啓動 nginx 服務和查看 nginx 狀態
sudo service nginx start # 啓動nginx
sudo service nginx status # 查看運行狀態
還有重啓 nginx 和停止 nginx 服務命令如下:
sudo service nginx restart # 重新啓動nginx
sudo service nginx stop # 停止nginx
這時在ubuntu中的瀏覽器中輸入127.0.0.1
如下:
備份 nginx 配置文件
- 安裝位置:
/etc/nginx
- 全局站點的配置文件:
/etc/nginx/nginx.conf
- 網站默認站點配置文件:
/etc/nginx/sites-available/default
這裏插入一個題外話, 因爲我的是 ubuntu 系統, 所以站點默認配置文件在/etc/nginx/sites-available/default
, 如果是 centos 的話, 應該在/etc/nginx/conf.d/default.conf
也就是說, 對於 nginx 來說, 你的站點配置文件可以放在/etc/nginx/sites-available/
目錄下, 也可以放在/etc/nginx/conf.d/
下. 這點我們可以通過查看全局配置文件/etc/nginx/nginx.conf
可以看到, 兩個配置文件路徑都 include 進來了
只不過, 如果你放在sites-available
目錄下, 需要進入sites-enabled
目錄下創建軟連接. 當然因爲是默認配置, 已經自動創建好了
cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/default
至於放在哪裏好, 大佬們已經討論過了: https://serverfault.com/questions/527630/what-is-the-different-usages-for-sites-available-vs-the-conf-d-directory-for-ngi
這裏的話, 我還是選擇默認的位置/etc/nginx/sites-available/
這裏我們可以先備份一份默認配置文件, 這樣子, 我們待會修改的時候改壞了還可以恢復.
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default-bak
然後再備份一份全局備份文件
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
html 測試
接下來是編寫一個簡單的html來測試, 首先要找到網站目錄, 由配置文件/etc/nginx/sites-available/default
中的root
節點決定
由上圖可以看出是/var/www/html
, 因此我們進入該目錄, 寫一個簡單的html
因爲
/var/www/html
默認是 755 權限, 所以, 只有它的所屬 root 用戶有權限寫, 因此我們需要sudo
在本機瀏覽器中輸入127.0.0.1/1.html
, 可以看到如下輸出:
至此, nginx配置完成!
修改端口
sudo vim /etc/nginx/sites-available/default
在文件中更改listen: 80
爲您要收聽的端口
不要忘記重新加載服務: service nginx reload
加固
原文鏈接: https://www.cnblogs.com/alummox/p/11370607.html
隱藏服務器版本號
默認我們訪問不存在的頁面時, 報錯頁面上會有nginx的版本信息, 這會向黑客提供信息, 以方便查找當前版本的漏洞, 加以利用
修改 nginx.conf
, http層
裏面添加取消server_tokens off;
前面的#
號
然後重新加載 nginx 配置文件
sudo service nginx reload
我們訪問不存在的頁面試一下
發現此時沒有版本信息了
禁止目錄瀏覽
默認是不允許列出整個目錄的, 如果不是做下載服務器的, 就不要打開這個, 避免敏感信息暴露給黑客並下載
如果開啓了就會是下面這樣的效果
配置關閉即可, 再訪問就顯示 403 了
autoindex off;
限制訪問敏感資源
有些資源我們可能不想對外開放, 比如一些版本控制的備份文件, 如.git
, .svn
等, 這些暴露了可能會將整個項目的結構或是源代碼都泄露了
配置前, 訪問如下:
然後進行如下配置, 修改/etc/nginx/sites-available/default
, 設置了test
這個目錄下的所有資源都拒絕, 重載nginx 配置後, 效果如下
location ^~ /test{
deny all;
}
目錄後帶
/
只禁止訪問目錄, 不帶/
禁止訪問目錄中的文件
所以要識別不想公開的資源, 限制敏感資源的訪問
限制HTTP請求方法
關閉沒必要的請求方法, 一般都是get|post
了
下面配置在server
裏面, 預期之外的會返回500
狀態
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 500;
}
這個要放到最前面
限制IP/域名訪問
ngx_http_access_module
模塊使有可能對特定IP客戶端進行控制. 規則檢查按照第一次匹配的順序
location ~ .*a.php$ {
root /usr/share/nginx/html;
deny 192.168.0.105; # 禁止ip
allow 192.168.189.134; # 允許ip
deny all; # 拒絕其他所有
}
限制訪問的ip, 即限制了服務的客戶, 防止不允許的人訪問, 減少風險
控制超時時間
可以緩解dos攻擊, 避免黑客僞造用戶訪問服務, 造成服務器壓力過大, 帶寬佔滿,
編輯 nginx.conf
配置文件(記得先備份!!), 具體設置如下:
client_body_timeout 10; # 設置客戶端請求主體讀取超時時間
client_header_timeout 10; # 設置客戶端請求頭讀取超時時間
keepalive_timeout 5 5; # 第一個參數指定客戶端連接保持活動的超時時間, 第二個參數是可選的, 它指定了消息頭保持活動的有效時間
send_timeout10; # 指定響應客戶端的超時時間
錯誤頁面重定向
避免錯誤頁面提供敏感信息, 一般我們會定製一些通用的錯誤頁面返回給客戶端
我們在http段
配置
error_page 500 502 503 504 /50x.html;
類似上面這種配置, 將狀態碼500、502、503、504全部重定向到50x.html
nginx降權
如果發生入侵, 獲取了當前運行 nginx 的用戶, 則擁有該用戶的權限了, 我們應當使用最低權限運行 nginx, 絕對禁止root用戶運行!!!
編輯配置文件, 添加如下一行內容:
user nobody;
保存, 然後後重啓nginx服務.
說明:
nobody
在linux中是一個不能登陸的帳號, 一些服務進程如apache, aquid等都採用一些特殊的帳號來運行, 比如nobody
,news
,games
等等, 這是就可以防止程序本身有安全問題的時候, 不會被黑客獲得root權限
php
安裝 php
sudo apt-add-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4 php7.4-fpm
php -v
啓動和查看 php 服務狀態
sudo service php7.4-fpm start #啓動
sudo service php7.4-fpm status #運行狀態
php 服務的重啓和停止命令如下:
sudo service php7.4-fpm restart #重新啓動
sudo service php7.4-fpm stop #停止
修改 nginx 配置
接下來編輯nginx配置文件: /etc/nginx/sites-available/default
文件, 讓它支持 php
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php7.0-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
php 測試
然後重啓 nginx 和 php 服務
sudo service nginx restart
sudo service php7.4-fpm restart
在瀏覽器中輸入: 127.0.0.1/1.php
訪問
加固
原文鏈接: http://www.thinkphp.cn/code/3990.html
啓用php的安全模式
php的安全模式是個非常重要的內嵌的安全機制, 能夠控制一些php中的函數, 比如system()
, 同時把很多文件操作函數進行了權限控制, 也不允許對某些關鍵字文件的文件, 比如/etc/passwd
, 但是默認的php.ini
是沒有打開安全模式的, 我們可以把它打開:
safe_mode = on
用戶組安全
當safe_mode
打開時, safe_mode_gid
被關閉, 那麼php腳本能夠對文件進行訪問, 而且相同組的用戶也能夠對文件進行訪問。建議設置爲:
safe_mode_gid = off
如果不進行設置, 可能我們無法對我們服務器網站目錄下的文件進行操作了, 比如我們需要對文件進行操作的時候。
安全模式下執行程序主目錄
如果安全模式打開了, 但是卻是要執行某些程序的時候, 可以指定要執行程序的主目錄:
safe_mode_exec_dir = /usr/bin
一般情況下是不需要執行什麼程序的, 所以推薦不要執行系統程序目錄, 可以指向一個目錄:然後把需要執行的程序拷貝過去, 比如:
safe_mode_exec_dir = /temp/cmd
但是, 我更推薦不要執行任何程序, 那麼就可以指向我們網頁目錄:
safe_mode_exec_dir = /usr/www
安全模式下包含文件
如果要在安全模式下包含某些公共文件, 那麼就修改一下選項:
safe_mode_include_dir = /usr/www/include/
其實一般php腳本中包含文件都是在程序自己已經寫好了, 這個可以根據具體需要設置。
控制php腳本能訪問的目錄
使用open_basedir
選項能夠控制PHP腳本只能訪問指定的目錄, 這樣能夠避免PHP腳本訪問不應該訪問的文件, 一定程序上顯示了phpshell的危害, 我們一般可以設置爲只能訪問網站目錄:
open_basedir = /usr/www
關閉危險函數
如果打開了安全模式, 那麼函數禁止是可以不需要的, 但是我們爲了安全還是考慮進去。比如, 我們覺得不希望執行包括system()
等在內的執行明瞭的php函數, 或者能夠查看php信息的phpinfo()
等函數, 那麼我們就可以禁止它們:
disable_functions= system, passthru, exec, shell_exec, popen, phpinfo, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl
如果你要禁止任何文件和目錄的操作, 那麼可以關閉很多文件操作
disable_functions= chdir, chroot, dir, getcwd, opendir, readdir, scandir, fopen, unlink, delete, copy, mkdir, rmdir, rename, file, file_get_contents, fputs, fwrite, chgrp,chmod, chown
以上只是列了部分比較常用的文件處理函數, 你也可以把上面執行命令函數和這個函數結合, 就能給抵制大部分的phpshell了。
關閉php版本信息在http頭中的泄露
我們爲了防止黑客獲取服務器中php版本的信息, 可以關閉該信息泄露在http頭中:
expose_php = off
比如黑客在 telnet domain 80
的時候, 那麼將無法看到PHP的信息
關閉註冊全局變量
在PHP中提交的變量, 包括使用POST或者GET提交的變量, 都將自動註冊爲全局變量, 能夠直接訪問, 這是對服務器非常不安全的, 所以我們不能讓它註冊爲全局變量, 就把註冊全局變量選項關閉:
register_globals = off
當然, 如果這樣設置了, 那麼獲取對應變量的時候就要採取合理方式, 比如獲取GET提交的變量var, 那麼就要用$_GET['var']
來進行獲取, 這個php程序員要注意。
SQL注入防護
SQL注入是非常危險的問題, 小則網站後臺被入侵, 重則整個服務器淪陷, 所以一定要小心。php.ini中有一個設置:
magic_quotes_gpc = off
這個默認是關閉的, 如果它打開後將自動把用戶提交對sql的查詢進行轉換, 比如把'
轉爲\'
等, 這對防止sql注入有很大作用, 所以我們推薦設置爲:
magic_quotes_gpc = off
錯誤信息控制
一般php在沒有連接到數據庫或者其他情況下會有錯誤提示, 一般錯誤信息中會包含php腳本當前的路徑信息或者查詢的SQL語句等信息, 這類信息提供給黑客後, 是不安全的, 所以一般服務器建議禁止錯誤提示:
display_errors = Off
如果你確實要顯示錯誤信息, 一定要設置顯示錯誤的級別, 比如只顯示警告以上的信息:
error_reporting = E_WARNING & E_ERROR
當然, 我還是建議關閉錯誤提示。
錯誤日誌
建議在關閉 display_errors
後能夠把是錯誤信息記錄下來, 便於排查服務器運行的原因:
log_errors = On
同時也要設置錯誤日誌存放的目錄, 建議根apache的日誌存在一起:
error_log = /usr/local/apache2/logs/php_error.log
注意:給文件必須允許apache用戶或組具有寫的權限。
mysql
mysql 安裝
sudo apt install mysql-server mysql-client php7.4-mysql
然後初始化 mysql, 根據提示來就行
sudo mysql_secure_installation
創建普通用戶
# 創建只允許本地登錄的用戶, 如果想要支持遠程登錄, 將 localhost 改成 %
create user 'wenhua'@'localhost' identified by 'wenhua123';
給予該用戶將要操作的數據庫的所有權限
# 先創建一個測試數據庫sectest, 並設定編碼集爲utf8
create database sectest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# 然後授予該用戶 wenhua 該數據庫 sectest 的所有權限
grant all privileges on sectest.* to 'wenhua'@'localhost';
刷新數據庫權限
flush privileges;
查看用戶權限
show grants for 'wenhua'@'localhost';
測試連接
sudo gedit /var/www/html/conn.php
<?php
echo 'start to connect mysql....<BR>';
$link=mysqli_connect("127.0.0.1","wenhua","wenhua123");
if(!$link) //failed
{
echo "connect failed!";
echo "error message:".mysql_error()."<BR>";
}
else
echo "connect success! <BR>";
?>
忘記root密碼
要是忘記root密碼了, 就執行這一步
sudo cat /etc/mysql/debian.cnf
使用賬號 debian-sys-maint
賬號登錄mysql密碼爲 debian.cnf
中 password
值
mysql -u debian-sys-maint -p
切換到mysql
然後修改root密碼(自己方便修改爲123456了)
set global validate_password_policy=LOW;
update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost';
update user set plugin='mysql_native_password';
flush privileges;
exit;
然後用修改的密碼登錄即可
mysql -uroot -p
加固
https://mp.weixin.qq.com/s?src=11×tamp=1580574479&ver=2132&signature=lYX-2zFY6Zj55w0565BrtF22yA2xJUdhrnU9Hg29HC69Gnnzf7JA2vh7cTrSDUZfoc79q-O9WkD6a*nwsADT0w42VDuIx2GnUJsyORjQ60Dr4a6Z9zMs3FTiu9OZFQfy&new=1
賬號安全
禁止 Mysql 以管理員帳號權限運行
以普通帳戶安全運行 mysqld, 禁止以管理員帳號權限運行 MySQL 服務。在 /etc/mysql/my.cnf
配置文件中進行以下設置。
[mysql.server]
user=mysql
避免不同用戶間共享帳號
mysql> insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","phplamp",password("passwd"),'','','');
執行以上命令可以創建一個 phplamp
用戶。使用該用戶登錄 MySQL 服務。
mysql>exit;
@>mysql -u phplamp -p
@>輸入密碼
mysql>登錄成功
刪除無關帳號
DROP USER
語句可用於刪除一個或多個 MySQL 賬戶。使用 DROP USER
命令時, 必須確保當前賬號擁有 MySQL 數據庫的全局 CREATE USER
權限或 DELETE
權限。賬戶名稱的用戶和主機部分分別與用戶表記錄的 User 和 Host 列值相對應。
執行DROP USER user;
語句, 您可以取消一個賬戶和其權限, 並刪除來自所有授權表的帳戶權限記錄。
口令
檢查賬戶默認密碼和弱密碼。口令長度需要至少八位, 幷包括數字、小寫字母、大寫字母和特殊符號四類中的至少兩種類型, 且五次以內不得設置相同的口令。密碼應至少每 90 天進行一次更換。
您可以通過執行以下命令修改密碼。
mysql> update user set password=password('test!p3') where user='root';
mysql> flush privileges;
授權
在數據庫權限配置能力範圍內, 根據用戶的業務需要, 配置其所需的最小權限。
查看數據庫授權情況
mysql> use mysql;
mysql> select * from user;
mysql> select * from db;
mysql> select * from host;
mysql> select * from tables_priv;
mysql> select * from columns_priv;
通過 revoke
命令回收不必要的或危險的授權。
mysql> help revoke
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type]
{
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
FROM user [, user] ...
開啓日誌審計功能
數據庫應配置日誌功能, 便於記錄運行狀況和操作行爲。
MySQL服務有以下幾種日誌類型:
錯誤日誌: -log-err
查詢日誌: -log
(可選) 慢查詢日誌: -log-slow-queries
(可選) 更新日誌: -log-update
二進制日誌: -log-bin
找到 MySQL 的安裝目錄, 在 /etc/mysql/my.cnf
配置文件中增加上述所需的日誌類型參數, 保存配置文件後, 重啓 MySQL 服務即可啓用日誌功能。例如,
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the error log file. Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
該參數中啓用錯誤日誌。如果您需要啓用其他的日誌, 只需把對應參數前面的 #
刪除即可。
執行show variables like 'log_%';
命令可查看所有的 log。 執行show variables like 'log_bin';
命令可查看具體的 log
禁止網絡連接
防止猜解密碼攻擊、溢出攻擊、和嗅探攻擊。
注意: 僅限於應用和數據庫在同一臺主機的情況。
如果數據庫不需要遠程訪問, 可以禁止遠程 TCP/IP 連接, 通過在 MySQL 服務器的啓動參數中添加--skip-networking
參數使 MySQL 服務不監聽任何 TCP/IP 連接, 增加安全性。
您可以使用 安全組 進行內外網訪問控制, 建議不要將數據庫高危服務對互聯網開放。
設置可信 IP 訪問控制
通過數據庫所在操作系統的防火牆限制, 實現只有信任的 IP 才能通過監聽器訪問數據庫。
mysql> GRANT ALL PRIVILEGES ON db.* TO 用戶名@'IP子網/掩碼';
0x02 apache+php 環境
Apache
安裝 Apache
sudo apt update
sudo apt install apache2
Apache 默認的配置文件在/etc/apache2/apache2.conf
, 這個文件的末尾可以看到, include
了其它所有的配置文件.
/etc/apache2/ports.conf
始終包含在主配置文件中. 它用於確定傳入連接的偵聽端口, 默認爲80
- 其它配置文件在 /etc/apache2/sites-enabled, /etc/apache2/conf-enabled, /etc/apache2/mods-enabled 目錄下。
Apache2的默認web目錄:/var/www/html
, 在 /etc/apache2/sites-enabled/000-default.conf
裏可以看到這個 DocumentRoot /var/www/html
配置
Apache2 的默認用戶是 www-data
, 定義在 /etc/apache2/envvars
文件中
設置默認主頁的配置文件/etc/apache2/mods-enabled/dir.conf
修改 Apache 端口
因爲上面 nginx 已經使用了80
端口, 所以我們需要給 Apache 修改端口, 這裏我改成8099
- 修改監聽端口
sudo vim /etc/apache2/ports.conf
- 修改它的主機端口
sudo vim /etc/apache2/sites-available/000-default.conf
- 重啓 Apache
sudo service apache2 restart
- 用瀏覽器訪問之前我們寫的
1.html
加固
https://www.cnblogs.com/peteremperor/p/10595035.html
賬號設置
以專門的用戶帳號和用戶組運行 Apache 服務。
-
根據需要,爲 Apache 服務創建用戶及用戶組。如果沒有設置用戶和組,則新建用戶,並在 Apache 配置文件中進行指定。
-
創建 Apache 用戶組。
groupadd apache
-
創建 Apache 用戶並加入 Apache 用戶組。
useradd apache –g apache
-
將下面兩行設置參數加入 Apache 配置文件
httpd.conf
中:User apache Group apache
-
-
檢查 httpd.conf 配置文件中是否允許使用非專用賬戶(如
root
用戶)運行 Apache 服務。默認設置一般即符合要求。Linux 系統中默認使用 apache 或者 nobody 用戶,Unix 系統默認使用 daemon 用戶。
授權設置
嚴格控制 Apache 主目錄的訪問權限,非超級用戶不能修改該目錄中的內容。
-
Apache 的 主目錄對應於 Apache Server配置文件
httpd.conf
中的 Server Root 控制項,應設置爲:Server Root /usr/local/apache
-
判定條件: 非超級用戶不能修改該目錄中的內容。
-
檢測操作: 嘗試進行修改,看是否能修改該目錄中的內容。
該目錄一般設置爲
/etc/httpd
目錄,默認情況下屬主爲 root 用戶,其它用戶不能修改該目錄中的文件。默認設置一般即符合要求。
-
-
嚴格設置配置文件和日誌文件的權限,防止未授權訪問。
-
執行
chmod 600 /etc/httpd/conf/httpd.conf
命令設置配置文件爲屬主可讀寫,其他用戶無讀寫權限。 -
執行
chmod 644 /var/log/httpd/*.log
命令設置日誌文件爲屬主可讀寫,其他用戶擁有隻讀權限。注意:
/etc/httpd/conf/httpd.conf
配置文件的默認權限是644,可根據需要修改權限爲600。/var/log/httpd/*.log
日誌文件的默認權限爲644,默認設置即符合要求。
-
日誌設置
Apache 設備應配置日誌功能,對運行錯誤、用戶訪問等事件進行記錄,記錄內容包括時間,用戶使用的 IP 地址等內容。
修改 httpd.conf
配置文件,設置日誌記錄文件、記錄內容、記錄格式。
-
錯誤日誌:
LogLevel notice #日誌的級別 ErrorLog /…/logs/error_log #日誌的保存位置(錯誤日誌)
-
訪問日誌:
LogFormat %h %l %u %t \”%r\” %>s %b “%{Accept}i\”%{Referer}i\” \”%{User-Agent}i\”” combined CustomLog /…/logs/access_log combined (訪問日誌)
注意:
ErrorLog
指令設置錯誤日誌文件名和位置。錯誤日誌是最重要的日誌文件。Apache httpd 程序將在這個文件中存放診斷信息和處理請求中出現的錯誤。若要將錯誤日誌傳送到 Syslog,則執行ErrorLog syslog
命令。CustomLog
指令指定了保存日誌文件的具體位置以及日誌的格式。訪問日誌中會記錄服務器所處理的所有請求。LogFormat
命令用於設置日誌格式,建議設置爲 combined 格式。LogLevel
命令用於調整記錄在錯誤日誌中的信息的詳細程度,建議設置爲 notice。日誌的級別,默認是 warn 級別,notice 級別比較詳細,但在實際中由於日誌會佔用大量硬盤空間。
禁止訪問外部文件
禁止 Apache 訪問 Web 目錄之外的任何文件。
-
修改 httpd.conf 配置文件。
Order Deny,Allow Deny from all
-
設置可訪問的目錄。
Order Allow,Deny Allow from /web
說明: 其中
/web
爲網站根目錄。 -
默認配置如下,可根據您的業務需要進行設置。
Options FollowSymLinks AllowOverride None
禁止目錄列出
目錄列出會導致明顯信息泄露或下載,建議禁止 Apache 列表顯示文件。在 /etc/httpd/httpd.conf 配置文件中刪除 Options 的 Indexes 設置即可。
-
修改
httpd.conf
配置文件:#Options Indexes FollowSymLinks #刪掉Indexes Options FollowSymLinks AllowOverride None Order allow,deny Allow from all
將
Options Indexes FollowSymLinks
中的Indexes
去掉,就可以禁止 Apache 顯示該目錄結構。Indexes
的作用就是當該目錄下沒有 index.html 文件時,自動顯示目錄結構。 -
重新啓動 Apache 服務。
錯誤頁面重定向
Apache 錯誤頁面重定向功能可以防止敏感信息泄露。
-
修改 httpd.conf 配置文件:
ErrorDocument 400 /custom400.html ErrorDocument 401 /custom401.html ErrorDocument 403 /custom403.html ErrorDocument 404 /custom404.html ErrorDocument 405 /custom405.html ErrorDocument 500 /custom500.html
注意: Customxxx.html 爲要設置的錯誤頁面。
-
重新啓動 Apache 服務。
注意: 此項配置需要應用系統設有錯誤頁面,或者不在 httpd 中設置,而完全由業務邏輯實現。
拒絕服務防範
根據業務需要,合理設置 session 時間,防止拒絕服務攻擊。
-
修改 httpd.conf 配置文件:
Timeout 10 #客戶端與服務器端建立連接前的時間間隔 KeepAlive On KeepAliveTimeout 15 #限制每個 session 的保持時間是 15 秒 注:此處爲一建議值,具體的設定需要根據現實情況。
-
重新啓動 Apache 服務。
注意: 默認值爲Timeout 120
,KeepAlive Off
,KeepAliveTimeout 15
,該項設置涉及性能調整。
隱藏 Apache 的版本號
隱藏 Apache 的版本號及其它敏感信息。
修改 httpd.conf 配置文件:
ServerSignature Off ServerTokens Prod
關閉 TRACE功能
關閉 TRACE 功能,防止 TRACE 方法被訪問者惡意利用。
在 /etc/httpd/conf/httpd.conf
配置文件中添加以下設置參數:
TraceEnable Off
注意: 該參數適用於 Apache 2.0 以上版本。
禁用 CGI
如果服務器上不需要運行 CGI 程序,建議禁用 CGI。
如果沒有CGI程序,可以修改 /etc/httpd/conf/httpd.conf
配置文件,把 cgi-bin 目錄的配置和模塊都進行註釋。
#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
#
#AllowOverride None
# Options None
#Order allow,deny
#Allow from all
#
綁定監聽地址
服務器有多個 IP 地址時,只監聽提供服務的 IP 地址。
-
執行以下命令查看是否綁定 IP 地址。
cat /etc/httpd/conf/httpd.conf|grep Listen
-
修改 /etc/httpd/conf/httpd.conf 配置文件。
Listen x.x.x.x:80
監聽功能默認監聽所有地址,如果服務器只有一個 IP 地址可不修改該項設置,如果有多個 IP 可根據需要進行設置。
刪除缺省安裝的無用文件
刪除缺省安裝的無用文件。
-
刪除缺省 HTML 文件:
# rm -rf /usr/local/apache2/htdocs/*
-
刪除缺省的 CGI 腳本:
# rm –rf /usr/local/apache2/cgi-bin/*
-
刪除 Apache 說明文件:
# rm –rf /usr/local/apache2/manual
-
刪除源代碼文件:
# rm -rf /path/to/httpd-2.2.4*
-
刪除 CGI。
可根據實際情況刪除,一般情況下
/var/www/html /var/www/cgi-bin
默認就是空的。
注意: 根據安裝步驟不同和版本不同,某些目錄或文件可能不存在或位置不同。
禁用非法 HTTP 方法
禁用 PUT、DELETE 等危險的 HTTP 方法。
修改 httpd.conf 配置文件,只允許 get、post 方法。
<Location />
<LimitExcept GET POST CONNECT OPTIONS>
Order Allow,Deny
Deny from all
</LimitExcept>
</Location>
您可根據需要進行設置,如果需要用到 PUT 或 Delete 等 HTTP 方法的話,在 /etc/httpd/conf/httpd.conf
配置文件中相應添加即可。
php
sudo apt install libapache2-mod-php7.4 php7.4-curl php7.4-json php7.4-cgi php7.4-mbstring php7.4-xml php7.4-intl
mysql
sudo apt install php7.4-mysql
0x03 iis+asp/php
IIS安裝
-
保證2003連接了安裝光盤
-
開始菜單 -> 管理您的服務器
-
添加或刪除角色 -> 下一步
-
自定義配置 -> 下一步
-
IIS -> 下一步
-
全選 -> 下一步 -> 下一步
-
然後等一會就安裝完成了
-
開始菜單 -> 管理工具 -> Internet 信息服務(IIS)管理器 -> 拖動到桌面
-
打開
Internet 信息服務(IIS)管理器
, 發現有一個默認的網站, 可以瀏覽一下, 會顯示建設中
IIS 的
默認網站
只能用html的, 如果想要搭建asp的, 還需要配置一下
asp網站配置
-
右鍵
默認網站
-> 打開, 然後就會打開網站根目錄了, 然後將打開的文件夾的裏面的文件全部刪掉 -
找到隨便找個 asp 的源碼, 如
sql注入-xycms搬家
, 將裏面的源碼全部複製到剛剛的目錄 -
這時候如果直接訪問的話, 是沒有顯示的, 因爲我們的網站是asp的, 還需要一些配置
-
右鍵
網站
->屬性
, 在打開的窗口處選擇文檔
, 然後添加一個index.asp
, 然後點擊應用
, 再彈出的"繼承覆蓋"對話框中全選
->確定
, 這樣子, 該iis下的所有網站的默認打開頁面就會多了一個index.asp
-
右鍵
網站
->屬性
->主目錄
->配置
->選項
->啓用父路徑
->調試
->打開兩個調試標記 -
Web 服務器擴展
->Active Server Pages
->允許
-
接下來用ie訪問一下: http://127.0.0.1, 發現需要輸入賬號密碼, 原因是還未配置好網站目錄下的文件夾和文件的權限
-
接下來配置權限: 選中所有目錄 ->
屬性
->安全
->添加
-> 輸入e
(代表everyone所有人的意思) ->確定
-> 勾選完全控制
->應用
->確定
-
同樣操作選中所有文件, 這時候再刷新一下ie就可以看到網站了
新建一個網站
這裏用的是同一個ip不同端口
-
因爲默認網站已經用了
80
端口, 所以再新建其他網站, 只能用不同的端口了 -
右鍵
網站
->新建
->網站
->下一步
-> 描述隨便填 ->下一步
-
這裏的端口不能和之前的重複, 所以我們可以填一個
8081
, 然後下一步
-
這裏選中網站主目錄, 隨便給一個就行, 然後
下一步
-
這裏設置網站的訪問權限, 勾上
運行腳本
和執行程序
就行 -
最後點擊
完成
, 然後按照之前的步驟, 將源碼拖進網站主目錄就行了
php網站配置
這裏直接使用 phpstudy
-
新建一個網站
-
將一個php源碼的站點文件拷貝進來
-
修復一下權限
-
特別地, php的網站, 還需要給該網站的根目錄權限
-
接下來就可以訪問了: http://127.0.0.1:8080
加固
https://www.cnblogs.com/xiaozi/p/10117741.html
限制目錄執行權限
- 在IIS中設置需要上傳文件的目錄,雙擊處理程序映射
- 在處理程序映射中,把編輯功能權限中的腳本去掉,這樣即使上傳了木馬文件在此目錄,也是無法執行的。
開啓日誌審計
- 打開IIS管理工具,選擇需要設置日誌的站點,切換到功能視圖,雙擊日誌,進入日誌配置界面。
- 默認情況下Web日誌存放於系統目錄
%SystemDrive%\inetpub\logs\LogFiles
, 將Wb日誌文件放在非網站目錄和非操作系統分區,並定期對Web日誌進行異地備份。
雙擊日誌,可進行日誌屬性的設置如下圖:
自定義404錯誤頁面
- 選擇站點,在功能視圖頁面,雙擊錯誤頁,進入錯誤頁配置頁面:
- 選擇404狀態代碼,進入自定義錯誤頁編輯狀態:
最佳經驗實踐
防止.mdb數據庫文件被下載
很多網站都是使用的是asp+access數據庫,mdb路徑可能被猜解,數據庫很容易就被別人下載了,利用IIS設置可有效防止mdb數據庫被下載。
步驟一:在 C:\Windows\System32\inetsrv\config目錄下找到applicationHost文件;
步驟二:打開 applicationHost
文件,選擇requestFiltering 下的節點: <add fileExtension=".mdb" allowed="false" />
,修改allowed的值爲“false”,mdb文件不能被下載。
步驟三:保存後,即無法下載.mdb數據庫文件。
訪問源IP限制
在條件允許的條件下,對IIS訪問源進行IP範圍限制。只有在允許的IP範圍內的主機纔可以訪問WWW服務。常用於限制網站管理後臺對外開放。
- 開始->管理工具->Internet 信息服務(IIS)管理器 選擇相應的站點目錄,然後在功能視圖中找到IP地址和域名限制,雙擊IP地址和域名限制進入設置。
- 在IP地址和域限制中,添加允許條目
關閉WebDAV
開始->管理工具->Internet 信息服務(IIS)管理器, 選擇一個站點,在功能視圖中找到WebDAV創作規則,雙擊 WebDAV創作規則,進入設置:
2、在WebDAV創作規則中,選擇禁用WebDAV
關閉目錄瀏覽
- 開始->管理工具->Internet 信息服務(IIS)管理器 選擇相應的站點目錄,然後在功能視圖頁面找到“目錄瀏覽”,雙擊進入目錄瀏覽設置頁面:
- 在最右邊,操作欄進行“禁用”,即可禁用目錄瀏覽
關閉FTP匿名訪問
開始->管理工具->Internet 信息服務(IIS)管理器 點擊WIN-主機名後在中間位置FTP欄找到FTP身份驗證,雙擊進入;
右鍵匿名身份驗證->禁用,即可關閉FTP匿名訪問
解決IIS短文件名漏洞
- 打開Internet 信息服務(IIS)管理器,選擇站點,在功能視圖界面,雙擊請求篩選
- 在URL添加拒絕序列URL序列設置爲【~】
風險操作項
停用或刪除默認站點
IIS安裝後的默認主目錄是C:\inetpub\wwwroot
,爲更好地抵抗踩點、刺探等攻擊行爲,應該更改主目錄位置,禁用默認站點,新建立站點並進行安全配置。
開始->管理工具->Internet 信息服務(IIS)管理器 選擇相應的站點,然後右鍵站點,選擇停止或者刪除。
刪除不必要的腳本映射
打開IIS服務管理器,選擇需要設置的站點,找到“處理程序映射”雙擊,從列表中刪除以下不必要的腳本。
包括 .asa .cer .cdx .idq .htw .ida .shtml .stm .idc .htr .printer
等。
刪除的原則:只保留需要的腳本映射。
根據需要可以在已經存在的腳本上點擊右鍵進行編輯和刪除,也可以自定義添加映射。
設置最大併發連接數
打開IIS服務管理器,選擇需要設置的站點,點擊瀏覽網站下的“高級設置“,打開高級設置對話框,切換到“連接限制”選項卡,設置連接限制,包括最大併發連接數等的設置。
獨立站點帳戶
在Windows server 2008R2系統下,用IIS架設Web服務器,合理的爲每個站點配置獨立的Internet來賓賬號,這樣可以限制Internet 來賓賬號的訪問權限,只允許其可以讀取和執行運行網站所的需要的程序。
- 選中“我的電腦”右鍵,選擇“管理”,打開“計算機管理”,選擇“本地用戶和組”,然後點擊“用戶”,接着“右鍵”,新建一個用戶,如下圖:
最後點擊“創建”,完成用戶創建。
- 刪除新建立的用戶屬的用戶組“USERS”,然後點擊“添加”,讓用戶屬於Guests組,如下圖:
- 網站設置獨立運行用戶,加強網站安全
獨立應用程序池
給網站設置獨立運行的程序池,這樣每個網站與錯誤就不會互相影響:
卸載不需要的IIS角色服務
開始->管理工具->服務器管理器” 雙擊“角色”,在右邊最下方可以看見角色服務,點擊““刪除角色服務”,可對不需要的IIS角色服務進行刪除。