- 要想挖掘网站的漏洞,对于网站的架构和运行机制必须有一个了解。
- 使用LNMP架构,搭建开源的博客程序wordpress
通过这个过程来了解网站的部署和运行。
LNMP架构
-Linux系统
-Web服务Nginx软件
-MySQL数据库系统
-PHP编程语言
Nginx
- 安装
root@kali:~# apt install nginx
- 启动
root@kali:~# service nginx start
在启动nginx之后,打开浏览器访问127.0.0.1 应该能看到如下输出
为什么这里显示的是apache服务器的页面呢?
先看一看nginx的默认配置文件,打开 /etc/nginx/nginx.conf,
root@kali:~# cat /etc/nginx/nginx.conf
可以发现访问日志和错误日志的路径分别是
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
- 启动查看访问日志
root@kali:~# tail -f /var/log/nginx/access.log
然后浏览器刷新一下,看到了新访问记录,就可以证明现在运行的确是nginx
Mysql
- 安装
root@kali:~# apt install default-mysql-server
- 启动
默认没有密码
root@kali:~# service mysql start
- 连接mysql
root@kali:~# mysql -u root
- 给root账户设置一个密码
给root账户设置一个密码,因为kali内置的mysql有些特殊,所以要用下面的命令来修改密码,这里把密码修改为123456
MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO ‘root’@‘localhost’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
因为Kali版本和MySQL版本的原因,上面的修改密码命令可能不能正确的执行。遇到这种情况时,你可以Google uninstall mysql,找到一个方式将MySQL从你的kali上移除。
改完之后ctrl + c退出mysql
接着用 mysql -u root -p 连接mysql,输入密码就可以进去了
- 查看mysql数据库
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+
3 rows in set (0.03 sec)
可以看到mysql里有3个数据库,其实这都是默认自带的,不要直接删除和修改。对于MySQL,暂时我们就只需要了解这么多。
PHP
- 查看PHP
Kali作为对Web安全研究友好的系统,自带有PHP环境,我们输入php -v就可以得知自带的php版本是php7.2
root@kali:~# php -v
PHP 7.2.9-1 (cli) (built: Aug 19 2018 06:56:13) ( NTS )
Copyright © 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright © 1998-2018 Zend Technologies
with Zend OPcache v7.2.9-1, Copyright © 1999-2018, by Zend Technolog
- 安装
kali只默认安装了php cli环境,并没有自带php-fpm组件,php-fpm是搭建web系统常用的一个组件,需要我们输入 apt install php7.2-fpm进行安装
root@kali:~# apt install php7.2-fpm
- 启动
root@kali:~# 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 文件里
在此我们需要关注一下两个配置信息
user = www-data
group = www-data
这段配置是说明php-fpm是以用户组www-data的用户www-data运行的,这样做是为了限定php-fpm的权限,这样当php应用程序有漏洞的时候,对服务器的影响有所降低,起码不会是root级别的影响。
下一段配置信息
listen = /run/php/php7.2-fpm.sock
这段配置说明fpm现在用的是以UNIX Domain Socket的形式在监听,其它应用可以通过这个文件和php-fpm通讯,这行配置需要记住
然后找一下日志相关的配置,在今后的使用中,我们可能经常需要打开日志,方便排错
这是php-fpm受到访问时的日志文件
;access.log = log/$pool.access.log
access.log 是访问php-fpm组件的日志,默认是被注释的,也就是没有启用日志功能。
这里我们把注释符号删掉,让它起作用,然后把日志路径改为自己定义的路径。
access.log = /var/log/php.access.log
改完之后我们重启一下php的fpm组件
service php7.2-fpm restart
nginx和php的fpm组件进行通讯
接下来我们让nginx和php的fpm组件进行通讯,这里可以参考php官方文档
https://secure.php.net/manual/zh/install.unix.nginx.php
- Nginx配置信息
我们找到和打开/etc/nginx/nginx.conf
可以看到有两行配置,通常用来管理站点信息
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/ *;
-
可以看到它的意思是分别是说
-
引入 /etc/nginx/conf.d/ 下所有扩展名是conf的文件
引入 /etc/nginx/sites-enabled/ 下所有文件
我们再去到/etc/nginx/sites-enabled/文件夹
有一个default文件,这个是nginx默认站点配置,根据官方文档进行修改,让PHP和Nginx可以进行通讯。
- 配置
1、
可以看到一行配置
root /var/www/html;
这行配置的意思是站点根目录在 /var/www/html文件夹下
我们在下面加多一行
index index.php index.html;
这句配置是默认去寻找index.php文件,找不到index.php就去找index.html
为什么是这个文件呢,因为大部分php项目都是用index.php文件作为一个入口的,只是习惯而已
2、
往下翻,能看到有一段被注释的php相关的配置
从官方文档复制下面配置到default文件,对此进行修改
location ~* .php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME d o c u m e n t r o o t document_root documentrootfastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
这里把因为php的fpm组件现在是以socket文件通讯的,所以这里要修改的应该是
fastcgi_pass 127.0.0.1:9000这一段
还记得刚刚fpm里面的listen配置么,把我们把sock文件路径改成fpm里的sock文件路径,也就是
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
然后执行 nginx -t 看一下配置有没有语法错误的地方
root@kali:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
看到这里就应该知道配置没有语法错误,我们重启一下nginx。让配置生效
root@kali:~# service nginx restart
- 验证nginx能和php通讯
default文件文件里有这么一行命令,说明站点的目录在此路径下
root /var/www/html;
我们去站点根目录创建一个php文件来测试
root@kali:~# cd /var/www/html/
root@kali:/var/www/html# vi 1.php
我们创建一个简单的php信息的页面,并保存为1.php
<?php phpinfo()?>
接下来我们访问 http://127.0.0.1/1.php 看到了一个显示php各种信息的页面,说明我们的nginx已经成功和php进行通讯了
wordpress
-
创建数据库
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.00 sec)
- 安装
把wordpress解压到/var/www/html文件夹下,
然后我们访问
http://127.0.0.1/wordpress/
发现已经可以看到wordpress的安装界面了
填入数据库相关信息,其它默认
安装完毕后就可以登录WordPress的后台页面
问题
1、期间重启过一次虚拟机,再次连接mysql时报错;
root@kali:~# mysql -u root
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2 “No such file or directory”)
解决:mysql服务停止,使用“service mysql start”命令启动
2、查看php配置文件时在图形化界面找不到/etc/文件夹
打开文件夹-其他位置里可以打开
3、安装wordpress时出现以下报错:
解决:需要在MySQL中先创建数据库
4、创建完数据库继续安装wordpress时出现以下报错:
解决:看到这个提示,指的是php现在不能创建文件,因为php-fpm现在是以www-data用户运行的。我们刚刚直接解压的行为,导致了文件夹所有权是当前用户,也就是root。要让php-fpm可以创建文件,我们要给wordpress文件夹修改一下权限。
查看文件权限
root@kali:/var/www/html# ls -al
total 32
drwxr-xr-x 3 root root 4096 Sep 26 10:21 .
drwxr-xr-x 3 root root 4096 Aug 21 06:52 …
-rw-r–r-- 1 root root 19 Sep 25 11:01 1.php
-rw-r–r-- 1 root root 10701 Jul 31 04:28 index.html
-rw-r–r-- 1 root root 612 Jul 31 04:25 index.nginx-debian.html
drwxr-xr-x 5 root root 4096 Feb 7 2018 wordpress
给wordpress文件夹修改一下权限
root@kali:/var/www/html# chown -R www-data:www-data wordpress/