2018-3-7 11周2次課 限定某個目錄禁止解析php、限制user_agent、php相關配置
禁止php解析:防止被上傳有害php文件,而被執行,php中可能有危險的函數,如果開放了上傳權限,肯定會被上傳惡意木馬文件,會被拿到服務器權限,root權限,非常危險。
更可以在加上FilesMatch訪問限制
檢查並重新加載配置文件 -t,graceful
[root@localhost ~]# cd /data/wwwroot/111.com/ [root@localhost 111.com]# mkdir upload [root@localhost 111.com]# cp 123.php upload/ [root@localhost 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php -I HTTP/1.1 403 Forbidden Date: Mon, 05 Mar 2018 14:00:22 GMT Server: Apache/2.4.29 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1
(已經403了)
先把FilesMatch去除,看下禁止解析php是什麽效果
[root@localhost 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php <?php echo "123.php"; ?>
(根本無法解析,直接返回了php的源代碼,並未解析)
而在瀏覽器中輸入111.com/upload/123.php時,文件準備開始下載,說明無法解析
在將配置文件,進一步限制
再訪問111.com/upload/123.php時,被禁止訪問
11.29 限制user_agent
user_agent 訪問控制的需求背景:網站會受到CC攻擊,原理為攻擊者通過手段(軟件,肉機)讓成千上萬肉機同時去訪問某個站點,站點可能掛掉
CC攻擊非常有規律,他們的user_agent非常有規律
上方為條件,下方位規則
OR為或,user_agent匹配上面條件的或下方的條件,比價OR則為並且,但是不可能同時匹配curl和baidu.com
NC 表示忽略大小寫 (user_agent中類似於Mozilla就有大小寫)
F為forbidden
curl一下111.com/123.php,被禁止
查看日誌,被限制
為了證明是user_agent限制的,模擬user_agent,可以直接被訪問
[root@localhost 111.com]# curl -A "A4L" -x127.0.0.1:80 111.com/123.php 123.php[root@localhost 111.com]# curl -A "A4L" -x127.0.0.1:80 111.com/123.php -I HTTP/1.1 200 OK Date: Mon, 05 Mar 2018 14:36:14 GMT Server: Apache/2.4.29 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Content-Length: 7 Content-Type: text/html; charset=UTF-8
查看日誌信息,可以看到user_agent就是我們指定的
·curl常用配置選項:
-e 指定referer (必須 http:// 開頭)
-A 指定user_agent
-x 指定ip,相當於省略了hosts
-I 查看狀態碼
擴展:CC攻擊 https://baike.baidu.com/item/cc%E6%94%BB%E5%87%BB/10959545?fr=aladdin
11.30/11.31 php相關配置
·查看php配置文件位置
/usr/local/php/bin/php -i|grep -i "loaded configuration file"
[root@localhost php-7.1.6]# /usr/local/php/bin/php -i|grep -i "loaded configuration file" PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date. timezone to select your timezone. in Unknown on line 0 Loaded Configuration File => /usr/local/php/etc/php.ini
編輯index.php,內容為phpinfo
[root@localhost 111.com]# vim index.php
瀏覽器可訪問111.com/index.php,為phpinfo
我們可以看到php配置目錄在/usr/local/php7/etc下,但是並沒有加載
既然沒有加載,那麽可以去源碼包中復制
[root@localhost 111.com]# cd /usr/local/src/php- php-5.6.30/ php-7.1.6/ [root@localhost 111.com]# cd /usr/local/src/php-7.1.6/ [root@localhost php-7.1.6]# cp php.ini- php.ini-development php.ini-production [root@localhost php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini [root@localhost php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
重新加載配置後,可以看到php.ini被加載
·配置php.ini:
1,限定disable_fuctions(危險函數)
危險函數:eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo
有些公司也會將phpinfo給禁掉,因為phpinfo會將系統的一些目錄暴露給他人,很危險。
配置完成後,查看111.com/index.php,已經被禁掉
2,定義date.timezone(時區)
時區定為Asia/Shanghai 或者 Asia/Chongqing
3,日誌相關
display_errors
display_errors 顯示錯誤信息,如果on,打開的話,那麽會把錯誤信息顯示在瀏覽器上,很可能會暴露目錄
那麽,設置為off之後,再訪問,則會顯示白頁,那麽一切都是未知,不太好找問題所在。
因此,再講display_errors改為off之後,需要編輯錯誤日誌log_errors
log_errors
1)log_errors:錯誤日誌打開
2)錯誤日誌記錄到一個目錄去,自行更改
3)還要定義一個error_log的級別,非常嚴謹的話,那麽只會記錄一些嚴重的錯誤,一些不太嚴重的錯誤則不記錄,忽被略掉,我麽可以放松一些,級別低一點
生產環境中,一般使用E_ALL & ~E_NOTICE
再次訪問,會新生成錯誤日誌
(php errors.log的屬主和屬組是deamon,而demon是httpd的屬主,php errors.log是以httpd進程的身份生成的。)
[root@localhost php-7.1.6]# cat /tmp/php_errors.log [06-Mar-2018 11:56:52 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
我們再模擬一個錯誤,再/data/wwwroot/111.com/目錄下創建2.php,內容如下
[root@localhost php-7.1.6]# vim /data/wwwroot/111.com/2.php
[root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php [root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php -I HTTP/1.0 500 Internal Server Error Date: Tue, 06 Mar 2018 12:09:39 GMT Server: Apache/2.4.29 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Connection: close Content-Type: text/html; charset=UTF-8 [root@localhost php-7.1.6]# cat /tmp/php_errors.log [06-Mar-2018 11:56:52 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2 [06-Mar-2018 12:09:35 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4 [06-Mar-2018 12:09:39 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
查看日誌可以發現,Parse error比之前Warning更嚴重
4、open_basedir
比如一個服務器上跑了很多站點,其中一個站點寫的漏洞比較多,被人黑了,被人拿到了權限,那麽可定會被進一步滲透,進到另一個站點。
但是如果增加了open_basedir,那麽就有可能黑不了
A網站在A目錄,B網站在B目錄,即使被黑,那也是黑一個目錄,不會連帶其他目錄被黑
修改 /usr/local/php7/etc/php.ini ( : 為分隔符,分割需要限制的多個目錄,默認的臨時文件在tmp下,所以要帶上tmp目錄)
php.ini是針對站所有點做限制,但如果有多個網站運行,多個網站運行在同一個文件夾下,那麽等於是沒有分開限制。
只有針對站點去做open_basedir才行,php.ini做不到,只有在apache的虛擬主機中定義才行
php_admin_value可以定義php.ini中的參數,如error_log,error_reporting,可以針對不同虛擬主機限制不同的open_basedir
·針對不同虛擬主機限制不同的open_basedir
用php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/“限定目錄,而針對多個不同的虛擬主機限制不同的open_basedir,可以用上方第一個虛擬主機來限制
(為什麽要帶臨時文件?因為默認的臨時文件在/tmp/下,這樣連臨時文件都不給寫)
[root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php 123[root@localhost php-7.1.6]#
如有錯誤,歡迎指正,互相學習,共同進步!
2018-3-7 11周2次課 限定某個目錄禁止解析php、限制user_agent、php相關配置