十一周二次课
2019獨角獸企業重金招聘Python工程師標準>>>
十一周二次課
11.28限制某個目錄禁止解析PHP
11.29限制user_agent
11.30/11.31PHP相關配置
11.28限制某個目錄禁止解析PHP
? 核心配置文件內容
??? <Directory /data/wwwroot/www.123.com/upload>
??????? php_admin_flag engine off
??? </Directory>
? curl測試時直接返回了php源代碼,并未解析
案例
- 假設有一個目錄是可以上傳圖片,但是可能被有心之人上傳php文件上去,因為httpd開放了php模塊,所以如果被人上傳了木馬文件(php類型),httpd就有可能會進行執行,一旦執行,就會讓對方獲得我們服務器的root權限,或者是被惡意刪除或修改一些參數,導致服務器癱瘓或者是被攻擊。
- 案例:
- 一臺服務器,網站被入侵,但不知道是什么原因,不知道怎么入侵的,也不知道入侵到什么程度,只知道他們公司的數據庫泄露了,數據是一些電話號碼,黑客并沒有去刪除數據,因為他知道這個服務器的數據庫里,電話號碼每天都在增長,它就可以源源不斷的獲得新的電話號碼,獲得的電話號碼可以賣給第三方。
- 分析:
- 把一個沒有在這個服務器提交過的電話號碼,在這個服務器的網站上提交一次,結果,馬上就有人打電話過來,證明,黑客獲得電話號碼,到打電話給新的用戶,這套體系,已經完全自動化了(每天都會去抓取一個新的電話號碼來隊列,然后馬上賣給第三方,第三方馬上打電話給這個用戶),所以就猜測,網站的程序(php)存在漏洞。另一種可能就是sql注入的漏洞(可以把查詢的sql通過一些特殊的提交,提交到服務器上,服務器就會把這個sql語句轉換成正常的查詢,最終獲得一些數據回來);但是sql注入漏洞,很容易修復,只要在網站提交的入口,增加一些特殊符號的過濾,就能完全的阻斷sql注入的漏洞。
- 解決方法:
- 首先抓包,監控數據庫的查詢,因為電話號碼是通過查詢了數據庫來的,寫一個死循環的腳本,每隔一分鐘抓一次查詢數據,抓完以后生成一個日志文件。
- 查看日志以后,發現有一條sql查詢,和網站源生的查詢不一樣,通過日志定位到了時間點,然后就去web服務器上查看時間點的訪問日志,通過日志查看到了一個非常特殊的請求,名字是以php結尾的文件,而且這個php文件是在圖片的目錄下進行訪問的,然后去查看這個php 文件,發現這個文件內容(一句話木馬),是獲取服務器的權限,相當于在服務器開了一個后門;這個問題產生的根本原因,就是因為上傳圖片目錄并沒有禁止解析php。在這個目錄中上傳了一個一句話木馬,PHP文件,通過瀏覽器訪問這個1.php,拿到了更高的權限,最終把數據庫的權限拿到,去查詢了他想要的數據。為了避免這種情況的發生,把上傳圖片的這個目錄做一個禁止PHP解析,這樣即便上傳了一句話木馬,但是不能解析,解析不了就獲得不了權限。
sql注入
- 所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。[1] 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊..
訪問控制 – 禁止php解析
1.打開虛擬主機主機配置文件
[root@tianqi-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//把代碼放到配置文件中
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/abc.com"
? ? ServerName abc.com
? ? ServerAlias www.abc.com www.123.com
? ? ErrorLog "logs/abc.com-error_log"
? ? CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/111.com"
? ? ServerName 111.com
? ? ServerAlias www.example.com 2111.com.cn
? ?# <Directory /data/wwwroot/111.com>
? ?#<FilesMatch 123.php>
? ? ? ? #AllowOverride AuthConfig
? ? ? ? #AuthName "111.com user auth"
? ? ? ? #AuthType Basic
? ? ? ? #AuthUserFile /data/.htpasswd
? ? ? ? #require valid-user
? ? #</FilesMatch>
? ? <Directory /data/wwwroot/111.com/upload>?##把upload目錄下所有的php禁止解析
? ? ? ? php_admin_flag engine off????//禁止解析php
? ? ? ? <FilesMatch (.*)\.php(.*)>????//現在這里所有訪問php都會是403
? ? ? ? Order allow,deny????//如果不做這個deny,就會直接訪問到源代碼,這樣就不太友好
? ? ? ? Deny from all
? ? ? ? </FilesMatch>
? ? </Directory>
? ? <Directory /data/wwwroot/111.com>
? ? ? ? <FilesMatch ?"admin.php(.*)">
? ? ? ? Order deny,allow
? ? ? ? Deny from all
? ? ? ? Allow from 127.0.0.1
? ? ? ? </FilesMatch>
? ? </Directory>
? ? <Directory /data/wwwroot/111.com>
? ? ? ? SetEnvIfNoCase Referer "http://111.com" local_ref
? ? ? ? SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
? ? ? ? SetEnvIfNoCase Referer "^$" local_ref
? ? ? ? <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
? ? ? ? ? ? Order Allow,Deny
? ? ? ? ? ? Allow from env=local_ref
? ? ? ? </FilesMatch>
? ? </Directory>
? ? SetEnvIf Request_URI ".*\.gif$" img
? ? SetEnvIf Request_URI ".*\.jpg$" img
? ? SetEnvIf Request_URI ".*\.png$" img
? ? SetEnvIf Request_URI ".*\.bmp$" img
? ? SetEnvIf Request_URI ".*\.swf$" img
? ? SetEnvIf Request_URI ".*\.js$" img
? ? SetEnvIf Request_URI ".*\.css$" img
? ? CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
2.檢查配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 ~]#?
3.創建upload目錄,新建php文件
[root@tianqi-01 111.com]# mkdir upload
[root@tianqi-01 111.com]# ls
123.php ?admin ?eagle1.jpg ?index.php ?upload
[root@tianqi-01 111.com]# cp 123.php upload/
[root@tianqi-01 111.com]#?
4.curl訪問
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 05 Mar 2018 13:28:50 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]#?
5.這時再去虛擬主機配置文件中注銷掉FilesMatch
[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
? ?<Directory /data/wwwroot/111.com/upload>
? ? ? ? php_admin_flag engine off? ? //把upload目錄下的所有php禁止解析
? ? ? ? #<FilesMatch (.*)\.php(.*)>
? ? ? ? #Order allow,deny
? ? ? ? #Deny from all
? ? ? ? #</FilesMatch>
? ? </Directory>
然后保存退出
6.檢查配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#?
7.這時候訪問php,會發現無法解析php
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'
<?php
echo "123.php";
[root@tianqi-01 111.com]#?
8.在瀏覽器中訪問http://111.com/upload/123.php,會提示直接下載,這是因為無法解析php
9.這時候再打開虛擬主機配置文件,取消FilesMatch注釋
[root@tianqi-01 111.com]# !vim
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
? ? ? ? php_admin_flag engine off
? ? ? ? <FilesMatch (.*)\.php(.*)>
? ? ? ? Order allow,deny
? ? ? ? Deny from all
? ? ? ? </FilesMatch>
? ? </Directory>
10.檢查配置文件是否存在語法錯誤并重新加載配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#?
11.這時再去瀏覽器訪問php,會直接顯示Forbidden
12.即使去訪問一個不存在的php文件,也會顯示顯示Forbidden
總結
- 禁止php解析操作,其實就是為了服務器更加安全,特別是針對可以寫的目錄;
- 可寫的目錄,一般(99%)是不需要解析php,這個需要牢記,一般靜態文件存放的目錄是不允許解析php 的。
11.29限制user_agent
? user_agent可以理解為瀏覽器標識
? 核心配置文件內容
?? <IfModule mod_rewrite.c>
??????? RewriteEngine on
??????? RewriteCond %{HTTP_USER_AGENT}? .*curl.* [NC,OR]
??????? RewriteCond %{HTTP_USER_AGENT}? .*baidu.com.* [NC]
??????? RewriteRule? .*? -? [F]
??? </IfModule>
? curl -A "123123" 指定user_agent
常用知識介紹
-
有時候,網站會受到一種叫 cc 攻擊,CC攻擊就是黑客,通過軟件,肉雞同時去訪問一個站點,超過服務器的并發,就會導致站點宕機;通過肉雞,軟件去訪問站點,就是普通的訪問,沒有什么特殊的,只是讓站點超過并發導致嚴重超負荷而宕機,所以沒辦法去進行控制;所謂CC攻擊都會有一個規律的特征,就是user_agent是一致的,比如同一個IP、同一個標識、同一個地址;遇到這種規律的user_agent頻繁訪問的情況我們就可以判定他就是CC攻擊,我們就可以通過限制他的user_agent 減輕服務器壓力,只需要讓他從正常訪問的200,限制為403,就能減輕服務器的壓力,因為403僅僅是一個請求,只會使用到很少的帶寬,畢竟他沒有牽扯到php 和mysql
-
cc攻擊
- 攻擊者借助代理服務器生成指向受害主機的合法請求,實現DDOS和偽裝就叫:CC(ChallengeCollapsar)。
- CC主要是用來攻擊頁面的。大家都有這樣的經歷,就是在訪問論壇時,如果這個論壇比較大,訪問的人比較多,打開頁面的速度會比較慢,訪問的人越多,論壇的頁面越多,數據庫壓力就越大,被訪問的頻率也越高,占用的系統資源也就相當可觀。
- 一個靜態頁面不需要服務器多少資源,甚至可以說直接從內存中讀出來發給你就可以了,但是論壇就不一樣了,我看一個帖子,系統需要到數據庫中判斷我是否有讀帖子的權限,如果有,就讀出帖子里面的內容,顯示出來——這里至少訪問了2次數據庫,如果數據庫的數據容量有200MB大小,系統很可能就要在這200MB大小的數據空間搜索一遍,這需要多少的CPU資源和時間?如果我是查找一個關鍵字,那么時間更加可觀,因為前面的搜索可以限定在一個很小的范圍內,比如用戶權限只查用戶表,帖子內容只查帖子表,而且查到就可以馬上停止查詢,而搜索肯定會對所有的數據進行一次判斷,消耗的時間是相當的大。
- CC就是充分利用了這個特點,模擬多個用戶(多少線程就是多少用戶)不停的進行訪問(訪問那些需要大量數據操作,就是需要大量CPU時間的頁面).這一點用一個一般的性能測試軟件就可以做到大量模擬用戶并發。
-
肉雞 (受黑客遠程控制的電腦)
- 肉雞也稱傀儡機,是指可以被黑客遠程控制的機器。比如用”灰鴿子”等誘導客戶點擊或者電腦被黑客攻破或用戶電腦有漏洞被種植了木馬,黑客可以隨意操縱它并利用它做任何事情。
- 肉雞通常被用作DDOS攻擊。可以是各種系統,如windows、linux、unix等,更可以是一家公司、企業、學校甚至是政府軍隊的服務器。
1.打開虛擬主機配置文件
- 在兩個條件中用OR做了一個連接符,理解起來就是 匹配第一條規則或者第二條規則;如果不加OR就是并且的意思,必須兩個條件同時匹配以后才會執行
- NC表示忽略大小寫,因為user_agent,可能會是大寫的,比如:Mozilla/5.0,他首字母就是大寫的
- RewriteRule .* - [F] 這里的F表示Forbidden
[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/abc.com"
? ? ServerName abc.com
? ? ServerAlias www.abc.com www.123.com
? ? ErrorLog "logs/abc.com-error_log"
? ? CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/111.com"
? ? ServerName 111.com
? ? ServerAlias www.example.com 2111.com.cn
? ?# <Directory /data/wwwroot/111.com>
? ?#<FilesMatch 123.php>
? ? ? ? #AllowOverride AuthConfig
? ? ? ? #AuthName "111.com user auth"
? ? ? ? #AuthType Basic
? ? ? ? #AuthUserFile /data/.htpasswd
? ? ? ? #require valid-user
? ? #</FilesMatch>
? ? <IfModule mod_rewrite.c>
? ? ? ? RewriteEngine on
? ? ? ? RewriteCond %{HTTP_USER_AGENT} ?.*curl.* [NC,OR]
? ? ? ? RewriteCond %{HTTP_USER_AGENT} ?.*baidu.com.* [NC]
? ? ? ? RewriteRule ?.* ?- ?[F]
? ? </IfModule>
2.然后檢查配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#?
3.去訪問的時候,會顯示403,這是因為限制了user_agent
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:04:51 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:05:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]#?
4.查看訪問日志
[root@tianqi-01 111.com]# tail /usr/local/apache2.4/logs/111.com-access_20180306.log
127.0.0.1 - - [06/Mar/2018:08:40:44 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
[root@tianqi-01 111.com]#?
5.測試是否是因為user_agent才會被信任的
6.首先自定義user_agent
- curl -A,去自定義
//模擬user_agent,去訪問會看到狀態嗎為200,可以正常訪問
[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 01:09:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php'
123.php[root@tianqi-01 111.com]#?
7.查看訪問日志,會看到user_agent是tianqi tianqi?
123.php[root@tianqi-01 111.com]# !tail
tail /usr/local/apache2.4/logs/111.com-access_20180306.log
127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:09:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:09:13 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
[root@tianqi-01 111.com]#?
curl命令
- curl命令是一個利用URL規則在命令行下工作的文件傳輸工具
- -A ,指定user-agent,設置用戶代理發送給服務器
- -e ,指定referer,就是來源網址
- -I ,僅僅查看它的狀態碼
- -x ,在指定的端口上使用HTTP代理
11.30/11.31PHP相關配置
- 查看php配置文件位置
- /usr/local/php/bin/php -i|grep -i "loaded configuration file"
- date.timezone
- disable_functions 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
- error_log, log_errors, display_errors, error_reporting
- open_basedir
- php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
PHP相關配置
- 查看php配置文件的位置
- 通過瀏覽器,訪問phpinfo找到配置文件的路徑
- 也可以用/usr/local/php/bin/php -i |grep -i “loaded configuration file”找到他的路徑;但是有些情況“php -i ”是不準的,因為Apache它是調用了php 的模塊,而且“php -i” 只是php 的一個程序,它和libphp5.so可能有關系也可能沒有關系;
- 案例:
- 有時改了php.ini,改動了也重啟了服務,結果配置還是不生效;因為使用“php -i” 找到的配置文件和在web上的phpinfo找到的php.ini不是同一個,如果想要準確的找到php.ini配置文件,就在對應的站點目錄下,創建一個phpinfo的php文件,在web上打開,在phpinfo上找到的,才是最準確的
[root@tianqi-01 111.com]# ls
123.php ?admin ?eagle1.jpg ?index.php ?upload
[root@tianqi-01 111.com]# vim index.php
<?php
phpinfo();
在瀏覽器中打開111.com/index.php
//配置文件并沒有加載,下載去復制一個
[root@tianqi-01 111.com]# cd /usr/local/src/php-7.1.6
[root@tianqi-01 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
此時再去瀏覽器中打開111.com/index.php,會看到配置文件已經有了,所以phpinfo是最準的。
- 設置安全函數
- disable_functions //安全函數
- eval 之前提到的一句話木馬涉及到的函數,如果把這個函數禁用,那么那個木馬將不會生效
- 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 以上是比較危險的函數
設置PHP文件
1.打開php文件,禁掉一些危險的函數(默認里面是空的)
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索disable_functions,在disable_functions=后面禁掉一些危險的函數
disable_functions=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涉及到服務器很多php 的配置相關,如果一不小心上傳到了線上,那么久很容易被黑客查到,進行對應的攻擊。
2.查看是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
3.再去瀏覽器訪問111.com/123.php,會看到phpinfo被禁掉了
4.還需要使用phpinfo,所以在此編輯配置文件,在disable_functions后面去掉phpinfo,檢查語法錯誤并重新加載配置文件
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
disable_functions=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
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
5.編輯php配置文件
- 定義data.timezone時區,如果不定義,有時候會有告警信息
- display_errors=On(On顯示,Off不顯示),這樣設置就會把錯誤的信息直接顯示在瀏覽器上,這樣就會把目錄給暴露出來,所以這里就更改成display_errors=Off。
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索timezone
在date.timezone定義時區
//需要刪除分號;
date.timezone = Asia/Shanghai
//搜索display
//需要刪除分號;
將display_errors = On改為display_errors = Off
將disable_functions=后面加上phpinfo,繼續做實驗
6.檢查配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
7.這時候再去用瀏覽器訪問111.com/index.php,會看到的是白頁,這就是因為display_errors=Off
8.用curl試一下
[root@tianqi-01 php-7.1.6]# curl -x127.0.0.1:80 http://111.com/index.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.php
on this server.<br />
</p>
</body></html>
[root@tianqi-01 php-7.1.6]#?
現在看到的狀態碼還是403,因為此時限制了user_agent。
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php -I
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 02:33:32 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 php-7.1.6]#?
沒有任何的輸出,就是白頁這就有問題了,因為不顯示任何內容,一切都是未知的。
9.打開配置文件
- 定義錯誤日志log_errors = On-->On表示打開
- 定義錯誤日志文件路徑error_log=/tmp/php_errors.log
- error_reporting = E_ALL,定義日志的級別,默認是ALL,表示把所有的errors都記錄下來,這是最不嚴謹的
- 在生產環境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices)
[root@tianqi-01 php-7.1.6]# !vim
vim /usr/local/php7/etc/php.ini
搜索log_errors,log_errors = On,將錯誤日志文件打開
搜索/error_log,將錯誤日志文件定義到tmp目錄下
將;error_log = php_errors.log改為error_log=/tmp/php_errors.log,去掉分號;。
搜索error_reporting,定義日志級別
; error_reporting
; ? Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; ? Development Value: E_ALL
; ? Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
按n鍵查找下一個
error_reporting = E_ALL
保存退出
10.檢查配置配置文件是否存在語法錯誤,并重新加載配置配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
11.這時再去訪問一遍,會看到tmp目錄下生成了php_errors.log
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# ls /tmp/
pear
php_errors.log
systemd-private-10939be3906d4885a694c9ccaa969513-vgauthd.service-up8a1e
systemd-private-10939be3906d4885a694c9ccaa969513-vmtoolsd.service-qrMrpr
systemd-private-42380971d6c34175aa4f900510bf7f60-vgauthd.service-Wj57Dr
systemd-private-42380971d6c34175aa4f900510bf7f60-vmtoolsd.service-EC3gse
systemd-private-491ebf486ca940d885ed9348c17675f5-vgauthd.service-3sBthy
systemd-private-491ebf486ca940d885ed9348c17675f5-vmtoolsd.service-sJ80kS
systemd-private-70996ce584314349997855a51a9da3d4-vgauthd.service-fehOdP
systemd-private-70996ce584314349997855a51a9da3d4-vmtoolsd.service-WZC9Q4
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vgauthd.service-DBvBHm
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vmtoolsd.service-AjXoy6
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vgauthd.service-vh8gyS
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vmtoolsd.service-koi7xB
systemd-private-9644814bb86e455d8e911deb7225488b-vgauthd.service-KLJ6Yc
systemd-private-9644814bb86e455d8e911deb7225488b-vmtoolsd.service-g2bpAg
systemd-private-aa279ed589d542bcbc4f2903687ce469-vgauthd.service-xDYbZY
systemd-private-aa279ed589d542bcbc4f2903687ce469-vmtoolsd.service-tTo26l
[root@tianqi-01 php-7.1.6]#?
12.查看php_errors.log,會看到屬主屬組是daemon
[root@tianqi-01 php-7.1.6]# ll /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 145 Mar ?6 11:07 /tmp/php_errors.log
[root@tianqi-01 php-7.1.6]#?
13.deamon實際上是httpd的屬主,php_errors.log日志文件是以httpd這個進程的身份去生成的
[root@tianqi-01 php-7.1.6]# ps aux |grep httpd
root ? ? ? 1113 ?0.0 ?1.3 258888 13628 ? ? ? ? ?Ss ? 08:39 ? 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon ? ? 1886 ?0.0 ?1.2 545716 12428 ? ? ? ? ?Sl ? 11:07 ? 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon ? ? 1887 ?0.0 ?1.0 545716 10404 ? ? ? ? ?Sl ? 11:07 ? 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon ? ? 1888 ?0.0 ?1.4 613364 14868 ? ? ? ? ?Sl ? 11:07 ? 0:00 /usr/local/apache2.4/bin/httpd -k graceful
root ? ? ? 1977 ?0.0 ?0.0 112660 ? 984 pts/0 ? ?S+ ? 11:11 ? 0:00 grep --color=auto httpd
[root@tianqi-01 php-7.1.6]#?
- 有時候,定義了一個錯誤日志,但是這個錯誤日志始終沒有生成,那么就需要檢查一下定義錯誤日志所在的目錄,到底httpd有沒有寫權限;
- 最保險的辦法,就是在所在目錄創建一個錯誤日志的文件,然后賦予它777的權限,這樣就不需要擔心這個文件httpd是否有寫權限了。
[root@tianqi-01 111.com]# grep error_log /usr/local/php7/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@tianqi-01 111.com]#?
- 可以先創建好/tmp/php_errors.log文件,然后賦予chmod 777權限
14.查看文件日志
[root@tianqi-01 111.com]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: ?phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[root@tianqi-01 111.com]#?
15.下面模擬一個錯誤
[root@tianqi-01 111.com]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
dgebszfhasdf
16.訪問2.php,會出現一些錯誤
[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 06 Mar 2018 06:08:02 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@tianqi-01 111.com]#?
同樣是一個白頁,只不過這個白頁的狀態碼是500
17.看一下錯誤日志
[root@tianqi-01 111.com]# cat /tmp/php_errors.log?
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: ?phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error: ?syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error: ?syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[root@tianqi-01 111.com]#?
這里是syntax error,比warning的級別更高
安全相關的參數
- 一臺服務器上,運行了多個站點,有一臺服務器假如代碼有問題,結果這個站點被黑客攻擊了,被黑客拿到了權限,黑客拿了權限肯定會繼續往里滲透,就會有可能滲透到其他的站點,同時導致其它的站點被黑;
- open_basedir,它是一個安全選項,A網站在A目錄下,B網站在B目錄下,這兩個目錄會做一個隔離,即使說A網站被黑了,最多也就黑一下A目錄,其它目錄看不到也進不去,也不會有權限進去,這就是open_basedir的作用。即使說服務器上只有一個網站,open_basedir限制也是很有必要的,網站一旦被黑,就會可能導致黑客到其它目錄做壞事,限制了以后,即使這個目錄被黑了,也只能在這個目錄下搞事情;
- php.ini文件中的內容是針對所有虛擬主機進行的配置!!!
1.打開php配置文件
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索open_basedir,并刪除分號;
open_basedir=/data/wwwroot/1111.com:/tmp????? ? //如果限制錯了,限制成1111.com:
然后保存退出
2.查看配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
3.用curl訪問2.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:05:42 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@tianqi-01 php-7.1.6]#?
4.現在改正2.php,去掉第3行的亂碼
[root@tianqi-01 php-7.1.6]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
保存退出
5.再次用curl訪問2.php,狀態碼還是500
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:08:06 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@tianqi-01 php-7.1.6]#?
6.查看錯誤輸出
[root@tianqi-01 php-7.1.6]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: ?phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error: ?syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error: ?syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning: ?Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning: ?Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Fatal error: ?Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[root@tianqi-01 php-7.1.6]#?
7.重新編輯配置文件,將1111.com改為111.com
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/1111.com:/tmp改為
open_basedir = /data/wwwroot/111.com:/tmp
保存并退出
8.查看配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
9.再次用curl訪問2.php,狀態碼會顯示200
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.1 200 OK
Date: Wed, 07 Mar 2018 11:15:15 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 php-7.1.6]#?
10.若是服務器上跑了n多個站點,該如何做限制呢?
11.應該針對站點、這些網站做open_basedir,但是php.ini是做不到的,因為php.ini是針對所有站點的
12.取消第一步中對open_basedir的設置
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
將open_basedir = /data/wwwroot/111.com:/tmp改為
open_basedir =
然后保存退出
13.但我們可以在虛擬主機配置文件中設置,在apache虛擬主機文件中去設置
- 在這里可以針對不同的虛擬主機限制不同的open_basedir
[root@tianqi-01 php-7.1.6]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/abc.com"
? ? ServerName abc.com
? ? ServerAlias www.abc.com www.123.com
? ? php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp"? ? //這里限定在abc.com目錄下
? ? ErrorLog "logs/abc.com-error_log"
? ? CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
? ? DocumentRoot "/data/wwwroot/111.com"
? ? ServerName 111.com
? ? ServerAlias www.example.com 2111.com.cn
? ?# <Directory /data/wwwroot/111.com>
? ?#<FilesMatch 123.php>
? ? ? ? #AllowOverride AuthConfig
? ? ? ? #AuthName "111.com user auth"
? ? ? ? #AuthType Basic
? ? ? ? #AuthUserFile /data/.htpasswd
? ? ? ? #require valid-user
? ? #</FilesMatch>
? ? php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"? ? //這里限定在111.com目錄下
? ? <IfModule mod_rewrite.c>
? ? ? ? RewriteEngine on
? ? ? ? RewriteCond %{HTTP_USER_AGENT} ?.*curl.* [NC,OR]
? ? ? ? RewriteCond %{HTTP_USER_AGENT} ?.*baidu.com.* [NC]
? ? ? ? RewriteRule ?.* ?- ?[F]
? ? </IfModule>
14.查看配置文件是否存在語法錯誤,并重新加載配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#?
15.用curl繼續訪問2.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
123[root@tianqi-01 php-7.1.6]#?
//這里就可以使用不同的虛擬主機去限制不同的open_basedir
友情鏈接:阿銘Linux
轉載于:https://my.oschina.net/u/3744518/blog/1631274
總結
- 上一篇: 轮播图特效 html+css+js
- 下一篇: C++继承问题(白兰花例)