你們好,要想挖掘網站的漏洞,對於網站的架構和運行機制必須有一個瞭解。這節課咱們使用市場上最多見的LNMP架構,搭建一個開源的博客程序wordpress,經過這個過程來讓你們瞭解網站的部署和運行。php
先來講說什麼是LNMP架構html
LNMP分別Linux、Nginx、MySQL、PHP四個單詞的縮寫。分別指的是Linux系統、Web服務Nginx軟件、MySQL數據庫系統、PHP編程語言mysql
Linux就不用多解釋了,上節課的Kali即是一個Linux系統。接下來咱們看下Nginxnginx
Nginx在Kali系統自帶有了,若是沒有的話,在命令行下執行一條 apt install nginx 命令即可安裝web
nginx的一些目錄信息以下sql
/etc/nginx/配置文件夾/usr/share/nginx/默認顯示頁面路徑/usr/lib/nginx/模塊依賴路徑/usr/sbin/nginx可執行文件數據庫
啓動nginx的命令是apache
service nginx start編程
在啓動nginx以後,打開瀏覽器訪問127.0.0.1 應該能看到以下輸出瀏覽器
若是你有一些服務端知識經驗,可能看到這個頁面會疑惑,是否是什麼地方錯了,爲何這裏顯示的是apache服務器的頁面
這時候咱們先看一看nginx的默認配置文件,
打開 /etc/nginx/nginx.conf, 能夠發現訪問日誌和錯誤日誌的路徑分別是
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
接着咱們去查看訪問日誌
tail -f /var/log/nginx/access.log
而後瀏覽器刷新一下,看到了新訪問記錄,就能夠證實如今運行的確是nginx
看完了nginx,咱們來看下mysql。
一樣的,Kali也自帶了mysql服務器。直接service mysql start就能夠啓動,默認沒有密碼
若是你的kali沒有,那麼能夠運行命令 apt install default-mysql-server 進行安裝
(屏幕當前啓動mysql)
咱們鏈接mysql看一下,運行命令
mysql -u root
能夠看到直接進來了,不用輸入密碼
爲了方便後續的使用,咱們先給root帳戶設置一個密碼,由於kali內置的mysql有些特殊,因此要用下面的命令來修改密碼,這裏我把密碼修改成123456
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges;
由於Kali版本和MySQL版本的緣由,上面的修改密碼命令可能不能正確的執行。遇到這種狀況時,你能夠Google uninstall mysql,找到一個方式將MySQL從你的kali上移除。
改完以後ctrl + c退出mysql
接着用 mysql -u root -p 鏈接mysql,輸入密碼就能夠進去了
show databases;
能夠看到mysql裏有3個數據庫,其實這都是默認自帶的,不要直接刪除和修改。對於MySQL,暫時咱們就只須要了解這麼多。在學習Web安全的過程當中,若是有遇到其餘須要對MySQL知道更多的時候,咱們會在後續的課程中,與你們分享。
咱們來看下PHP
Kali做爲對Web安全研究友好的系統,自帶有PHP環境,咱們輸入php -v就能夠得知自帶的php版本是php7.2
可是,kali只默認安裝了php cli環境,並無自帶php-fpm組件,php-fpm是搭建web系統經常使用的一個組件,須要咱們輸入 apt install php7.2-fpm進行安裝
在安裝完畢後,只須要輸入 service php7.2-fpm start 即可以啓動了
和nginx同樣,配置文件放在/etc/下,具體是/etc/php/7.2/
因爲咱們如今使用的是php的fpm模式,因此主要看fpm下的配置
這裏就再也不詳細說php的一些細節了,根據經驗分析出fpm自己的配置在 /etc/php/7.2/fpm/pool.d/www.conf 文件裏,而該文件開始位置的。
listen = /run/php/php7.2-fpm.sock
這段配置說明fpm如今用的是以UNIX Domain Socket的形式在監聽,其它應用能夠經過這個文件和php-fpm通信,這行配置須要記住
還有一個要記住的配置是
user = www-data
group = www-data
這段配置是說明php-fpm是以用戶組www-data的用戶www-data運行的,這樣作是爲了限定php-fpm的權限,這樣當php應用程序有漏洞的時候,對服務器的影響有所下降,起碼不會是root級別的影響。
而後找一下日誌相關的配置,在從此的使用中,咱們可能常常須要打開日誌,方便排錯
# access.log = log/$pool.access.log
access.log 是訪問php-fpm組件的日誌,默認是被註釋的,也就是沒有啓用日誌功能
這裏咱們把註釋符號刪掉,讓它起做用
改完以後咱們重啓一下php的fpm組件
service php7.2-fpm restart
接下來咱們讓nginx和php的fpm組件進行通信,這裏能夠參考php官方文檔
https://secure.php.net/manual/zh/install.unix.nginx.php
咱們來配置Nginx,咱們找到和打開/etc/nginx/nginx.conf
能夠看到有2行配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
能夠看到它的意思是分別是說
引入 /etc/nginx/conf.d/ 下全部擴展名是conf的文件
引入 /etc/nginx/sites-enabled/ 下全部文件
那麼咱們看一下 /etc/nginx/conf.d/ 文件夾,發現沒有東西能夠參考。咱們再去到/etc/nginx/sites-enabled/
發現有一個default文件,這個是nginx默認站點配置,咱們看一看,而後在上面改
能夠看到一行配置
root /var/www/html;
這行配置的意思是站點根目錄在 /var/www/html文件夾下
咱們在下面加多一行
index index.php index.html;
這句配置是默認去尋找index.php文件,找不到index.php就去找index.html
爲何是這個文件呢,由於大部分php項目都是用index.php文件做爲一個入口的,只是習慣而已
往下翻,能看到有一段被註釋的php相關的配置
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}
咱們在下面把php官方文檔的說明覆制在下面,而後跟着改一下
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
這裏把由於php的fpm組件如今是以socket文件通信的,因此這裏要修改的應該是
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 這一段
還記得剛剛fpm裏面的listen配置麼,把咱們把sock文件路徑改爲fpm裏的sock文件路徑,也就是
fastcgi_pass unix:/run/php/php7.2-fpm.sock; 以便?
而後執行 nginx -t 看一下配置有沒有語法錯誤的地方
看到這裏就應該知道配置沒有語法錯誤,咱們重啓一下nginx
service nginx restart
接着咱們怎麼去驗證nginx能和php通信了呢?
咱們去站點根目錄建立一個php文件來測試
咱們建立一個簡單的php信息的頁面,並保存爲1.php
<?php
phpinfo();
?>
接下來咱們訪問 http://127.0.0.1/1.php 看到了一個顯示php各類信息的頁面,說明咱們的nginx已經成功和php進行通信了
接着咱們去下載wordpress
訪問
https://cn.wordpress.org/
下載代碼
如今完成後,我把wordpress解壓到/var/www/html文件夾下,
而後咱們訪問
http://127.0.0.1/wordpress/
發現已經能夠看到wordpress的安裝界面了
咱們開始安裝
咱們填入數據庫相關信息,其它默認
看到這個提示,指的是php如今不能建立文件,由於php-fpm如今是以www-data用戶運行的。咱們剛剛直接解壓的行爲,致使了文件夾全部權是當前用戶,也就是root。要讓php-fpm能夠建立文件,咱們要給wordpress文件夾修改一下權限。
root@kali:/var/www/html# ls -al
總用量 32
drwxr-xr-x 3 root root 4096 5月 31 16:17 .
drwxr-xr-x 3 root root 4096 4月 26 10:27 ..
-rw-r--r-- 1 root root 18 5月 31 16:12 1.php
-rw-r--r-- 1 root root 10701 4月 12 06:44 index.html
-rw-r--r-- 1 root root 612 4月 12 06:43 index.nginx-debian.html
drwxr-xr-x 5 root root 4096 2月 7 23:53 wordpress
咱們給wordpress文件夾修改一下權限
chown -R www-data:www-data wordpress/
而後瀏覽器刷新一下,就能夠開始安裝了
填寫以後就安裝完畢了
到此,一個php博客系統wordpress就搭建完成
在上面的部分咱們花費了很大的篇幅給你們介紹瞭如何部署一個Wordpress站點,那接下來咱們來講說當你訪問一個Wordpress站點的時候,爲何瀏覽器會給你訪問對應的內容呢?
首先咱們先來了解下Nginx的角色,Nginx或者你可能知道的IIS、Apache都是一種服務組件,他們的功能是什麼呢?通俗的的解釋就是,以服務形式運行,而後做爲一個守護進程(守護進程的意思就是一直在執行,不退出),時刻監聽着服務器指定端口(通常網站我們採用的是80端口)的請求,當收到請求後,就根據請求的內容返回對應的內容,返回的內容就是咱們前面課程已經瞭解的HTML、JS、CSS那些,而後由瀏覽器再去組織渲染展現給用戶;因此你能夠理解服務組件的功能一句話來解釋就是監聽並響應請求。
說到返回的內容,這裏你們須要瞭解一個概念,靜態網頁和動態網頁;像咱們以前課程學到的HTML,HTML的內容都是直接寫死的,這種是靜態網頁,Nginx在收到靜態網頁的請求後會直接讀取靜態網頁的內容返回給瀏覽器進行渲染,這中間環節沒有涉及到第三者,單單Nginx就能夠完成了一個靜態網頁的部署;那麼咱們上文中花了那麼大篇幅講到的php、php-fpm、MySQL的部署呢?由於Wordpress使用的是動態網頁的技術,是採用PHP這種動態腳本語言編寫的,它的數據存儲是使用MySQL;動態網頁和靜態網頁有個很直觀的感覺差距就是:靜態網頁,你必須訪問不一樣的路徑,如/a和/b,你才能訪問到不一樣的內容;而動態網頁,你就只訪問/a路徑,後面加上個?id=數字,當數字不一樣,頁面內容也就不一樣,而這裏頁面內容實際上就是根據數字的不一樣,而後去MySQL數據庫中讀取到的內容不一樣,id不一樣的狀況下,頁面因爲id而致使不一樣的部分的內容是存儲在數據庫裏的。
那麼php-fpm是什麼呢?Nginx是內容的分發者,剛纔講到,請求靜態頁面的時候,如index.html,會讀取靜態網頁內容返回,那麼若是請求的是index.php呢?,根據配置文件,nginx知道這個不是靜態文件,須要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器,Nginx會傳哪些數據給PHP解析器呢?如URL、查詢字符串(好比?id=1),Header頭等,那麼CGI就是規定要傳哪些數據、以什麼樣的格式傳遞給後方處理這個請求的協議;當Nginx收到index.php這個請求後,會啓動對應的CGI程序,這裏就是PHP的解析器;接下來PHP解析器會解析php.ini文件,初始化執行環境,而後處理請求,再以符合CGI規定的格式返回處理後的結果,退出進程;這中間還有一個叫作fastcgi的東西,是用來提供cgi性能的,而php-fpm你能夠理解爲一種實現了fastcgi的程序,PHP5.3.3版本里已經集成了php-fpm。
因此總體你能夠這樣理解:
靜態網頁:
用戶經過瀏覽器向服務器提交請求->Nginx接收並響應請求->讀取本地網頁文件靜態內容->返回瀏覽器
PHP動態網頁:
用戶經過瀏覽器向服務器提交請求->Nginx接收並響應請求->以CGI協議傳遞請求到php-fpm->php-fpm調用PHP進行動態解析->解析過程根據參數讀取MySQL中內容->根據數據庫返回內容生成靜態網頁內容->返回到瀏覽器
這大概就是一個網頁的運行機制