渗透知识靶场实战
全文参考:来自书籍《渗透测试理论与实践》
靶场文件下载
BupLoaderKeygen和 DVWA 的下载地址:
1)Github 下载地址
https://github.com/h3110w0r1d-y/BurpLoaderKeygen
2)网盘下载地址:
https://pan.baidu.com/s/1XTu6riBMf0lfFOhbXdHzlQ?pwd=9999
靶机的 VMware 虚拟机镜像下载地址:
https://download.vulnhub.com/meandmygirlfriend/Me-and-My-Girlfriend-1.ova
环境来源
本书中所使用的靶机全部来自VulnHub(https://www.vulnhub.com/),这是一个全球知名的开源靶场,我们可以从网站中下载靶机镜像,然后直接导入VMware虚拟机中使用
除了靶机,本书还引用了大量CTF例题,这些例题主要来自以下网站。这些网站都是知名的公共学习平台,网站中所有题目都是免费的。
BUUCTF : https://buuoj.cn/challenges。
攻防世界:https://adworld.xctf.org.cn。
Bugku : https://ctf.bugku.com/。
青少年CTF :https://www.qsnctf.com/。
另外需要强调的是,如果未取得授权,切记一定不要在真实环境中进行渗透测试,否则就是违法行为。本书中的所有操作都是在实验环境中进行的。
Kali的官网是https://www.kali.org,可以从官网免费下载最新的Kali系统。
CentOS的官网是www.centos.org,但笔者推荐从国内的镜 站阿里云开源像(https://developer.aliyun.com/mirror/)下载CentOS镜像。截至笔者截稿,CentOS的最新版本是CentOS8,这里推荐下载较为成熟且应用更为广泛的CentOS 7版本
在CentOS 7系统中,由于提供了network和NetworkManager两种不同的网络服务,有时会因为这两种服务的冲突而导致IP地址等网络参数丢失问题。
当执行ifconfig ens33命令后,发现ens33网卡没有IP地址,这说明出现冲突了。这时可以单击桌面右上角的电源按钮,将“有线”设置为“已连接”即可。
远程登录的工具有很多,如SecureCRT、putty等,这里推荐使用Xshell,这是一款商业软件(官网为https://www.xshellcn.com/),读者可以从https://www.xshell.com/zh/free-for-home-school/下载免费的试用版。
Burp Suite是一款商业软件,官网地址是https://portswigger.net/burp。官网提供了免费的community社区版。
首先,从Burp Suite官网下载安装文件(网址为https://portswigger.net/burp/releases)。注意:下载时要选择JAR格式的Burp Suite
Burp Suite运行时需要Java环境,所以还需要从Oracle官网下载并安装JDK。JDK的网址为https://www.oracle.com/java/technologies/java-se-glance.html,我们选择一个最新版本的即可。
专业版Burp Suite是商业软件,为了使用全部功能,可以从Github下载激活工具BurpLoaderKeygen,下载链接为https://github.com/h3110w0r1d-y/BurpLoaderKeygen。如果Github无法访问,也可以从本书的资源中获取。
常用命令
ifconfig eth0 IP 如果没有IP地址,可以执行命令设置IP需要注意,IP地址应该与NAT模式的网段保持一致,例如在笔者的实验环境中,NAT模 式使用的是192.168.80.0/24网段。
route -n命令可以查看默认网关

route add default gw网关地址 如果没有默认网关,可以执行命令添加默认网关。
cat /etc/resolv.conf命令可以查看DNS服务器
netstat命令,Windows还是Linux系统中都自带了,这是一个非常重要的网络命令,通过它就可以查看当前系统正在使用哪些端口与网络上的其他主机在进行通信。
执行netstat -an命令查看端口状态。最后一列的ESTABLISHED表示它们之间建立了一个连接,目前正处于通信状态。

ping命令,我们可以查出51CTO博客的IP,即203.107.44.140
curl是在大部分Linux系统中自带的一个工具,在Kali中执行curl www.baidu.com命令就可以向百度发出HTTP请求,并显示所接收到的HTTP响应,HTTP协议所传输的主要是HTML代码,浏览器可以解析这些代码,但是curl命令则只能将代码原样显示。
设置中文语言包
安装中文语言包,然后就可以将系统设置为中文界面了,首先,修改系统安装源配置文件,执行命令如下
vim /etc/apt/sources.list
在文件中将原有的安装源注释禁用,然后再新添加两个设置项,将安装源设置为阿里云开源镜像站

修改完成后,再执行下面的命令,更新软件索引列表:
apt-get update
执行下面的命令安装中文语言包字体
apt-get install xfonts-intl-chinese ttf-wqy-microhei
执行下面的命令将系统语言设置为zhCN.UTF-8
dpkg-reconfigure locales

执行reboot命令,重启系统。重启之后,就可以发现系统已经切换到中文界面。
关闭Centos的NetworkManager服务
为了彻底避免这个地址冲突问题,还是建议为CentOS虚拟机设置一个固定的静态IP地址,并且关闭NetworkManager服务。
执行下面的命令,修改网卡配置文件
[root@CentOS ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
在网卡配置文件中,首先需要修改原有的两个设置项
BOOTPROTO=static ONBOOT=yes
IPADDR=192.168.80.140
NETMASK=255.255.255.0
GATEWAY=192.168.80.2 DNS1=223.5.5.5
BOOTPROTO设置项的默认值是dhcp,表示使用动态IP地址,修改为static,表示要设置静态地址。
[root@CentOS ~]# systemctl restart network
剩余部分自行百度。
关闭并禁用NetworkManager服务
[root@CentOS ~]# systemctl stop NetworkManager
[root@CentOS ~]# systemctl disable NetworkManager
配置yum源
执行下面的命令,将默认的yum源文件全部删除:
[root@CentOS ~]# rm -f /etc/yum.repos.d/*
再执行下面的命令从阿里云开源镜像站下载yum源文件:
[root@CentOS ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
至此,CentOS的yum源就设置好了。
关闭防火墙和selinux
对于CentOS,还需要再做最后一项配置,即关闭防火墙和SELinux。CentOS主要是用作服务器,会接收到很多来自客户端的访问请求,而防火墙和SELinux默认会拦截所有的访问请求,导致服务无法被正常访问。虽然可以通过设置防火墙和SELinux来放行客户端的访问请求,但对于初学者来说,这无疑存在很大难度,因而建议直接将防火墙和SELinux全部关闭,以防止它们对后续操作的干扰。
#停止运行防火墙服务
[root@CentOS ~]# systemctl stop firewalld
#禁止开机自动运行防火墙
[root@CentOS ~]# systemctl disable firewalld
#临时关闭selinux
[root@CentOS ~]# setenforce 0
修改配置文件/etc/selinux/config,将其永久关闭。
[root@CentOS ~]# vim /etc/selinux/config
在配置文件中将设置项SELINUX的值修改为disabled:
SELINUX=disabled
修改kali默认不允许root用户远程登录
由于Kali默认不允许root用户远程登录,所以首先需要在Kali中修改SSH服务的配置文件/etc/ssh/sshd_config,命令如下:
┌──(root㉿kali)-[~] └─# vim /etc/ssh/sshd_config
将配置文件中“PermitRootLogin”设置项的默认值“prohibit-password”修改为yes,从而允许root用户远程登录:
PermitRootLogin yes
修改完成后,还需要重启SSH服务,使设置生效,再将SSH服务设置为开机自动运行:
┌──(root㉿kali)-[~] └─# systemctl restart ssh ┌──(root㉿kali)-[~] └─# systemctl enable ssh
至此,Kali的配置就完成了,最后在Xshell中创建会话并连接即可。
搭建LAMP平台
渗透测试主要是指针对网站的Web渗透测试,要学习Web渗透测试。
搭建网站的方法有很多,很多初学者通常利用phpStudy之类的模拟软件来一键搭建网站,但本书更加推荐在CentOS系统中搭建一个真实的网站。当然,这会涉及大量的操作,整体比较烦琐,但只有这样,才能为我们的学习奠定良好的基础,我们才能对网站以及整个服务器有更为深入的理解。因为我们所需要的并非仅仅只是一个可以运行的网站,而是要从整个服务器的角度去了解网站的整体架构,以及如何对网站进行维护和配置。
笔者强烈建议读者购买一台云服务器,这将非常有助于提高大家的实践能力。如果读者掌握了下面介绍的搭建LAMP网站平台的方法,您将自然而然地精通云服务器的配置。
什么是LAMP网站
即Web服务器,主要由以下4个部分组成:操作系统、Web容器、脚本语言程序、数据库。
(1)操作系统主要是Linux和Windows Server,目前绝大多数的服务器采用的都是Linux系统,尤其是CentOS,因为它本身就是一个专门用于服务器的操作系统。本书推荐使用CentOS 7。
(2)Web容器是用于提供Web服务的服务程序,就像在客户端必须要借助于浏览器才能访问网站一样,在服务器端也同样要借助于Web容器才能提供Web服务。目前常用的Web容器主要有Apache、Nginx和IIS等,本书使用的是Apache。
(3)除了Apache这类Web服务程序,还需要安装脚本语言程序与之配合。因为Apache或Nginx默认只支持对静态资源的访问,本身并不具备执行脚本程序的能力。而目前的网站基本上都是采用动态资源,这就必须要借助于外部程序来运行脚本程序,如ASP.NET、PHP或JSP等。本书使用的脚本程序是PHP。
(4)数据库也是网站的核心组成部分,因为网站中的绝大部分数据都是存储在数据库中的。数据库也有很多不同种类,本书使用的是在中小型网站中广泛应用的MySQL数据库。
综合以上,我们下面要搭建的Web服务器使用的是Linux操作系统、Apache容器、MySQL数据库、PHP脚本程序,因而合称LAMP(Linux+Apache+MySQL+PHP)。
安装LAMP
在部署LAMP时,软件安装的一般顺序是Apache→PHP→MySQL。
1.安装Apache
Apache的软件名和所对应的服务名都是httpd,执行下面的命令安装并启动httpd服务,并将其设为开机自动运行:
[root@CentOS ~]# yum install httpd -y [root@CentOS ~]# systemctl start httpd [root@CentOS ~]# systemctl enable httpd
由于Apache中已经设置好了一个默认的Web站点,因而这时在客户端输入Web服务器的IP地址就可以访问默认网站了。如果在客户端无法正常访问,那多半是由于防火墙或SELinux的原因,因此用户需要将服务端的防火墙和SELinux关闭。

2.安装PHP
Apache本身只支持对静态资源的访问,所以接下来需要接着安装PHP。
PHP安装包的名称就是php,CentOS 7系统中所提供的PHP版本是5.4.16。同时,还要再安装一个软件包php-mysql,只有安装了这个软件包之后,PHP才可以操作MySQL数据库:
[root@CentOS ~]# yum install php php-mysql
需要注意的是,PHP并不是一个独立的服务,而是被视作Apache的一个功能模块,因而在安装完PHP之后,需要重启httpd服务才能生效。
[root@CentOS ~]# systemctl restart httpd
下面测试Web服务器是否可以支持PHP动态页面。首先,在网站主目录/var/www/html中生成一个PHP的测试网页test.php,页面代码中只有一个phpinfo( )函数。当客户端访问test.php页面时,会先在服务器端执行该函数,然后将函数的执行结果返回给客户端。
<?php phpinfo( ); ?>
然后,在客户端浏览器中输入URL地址“http://服务器IP/test.php”来访问该测试页面,如果成功出现PHP测试页面,则证明Apache已经可以支持PHP动态网页了。

3.安装MySQL
在CentOS 7系统中默认提供的是MySQL的分支MariaDB,但MariaDB与MySQL完全兼容,所以完全可以使用它作为MySQL的替代品。
MariaDB服务的安装包名称为mariadb-server,安装完软件之后,启动服务,并将其设为开机自动运行:
[root@CentOS ~]# yum install mariadb-server -y [root@CentOS ~]# systemctl start mariadb [root@CentOS ~]# systemctl enable mariadb
下面还需要对MariaDB做一些初始化的操作,主要是设置MariaDB的管理员密码。MariaDB的管理员账号也叫root,但并非Linux中的根用户,它们只是名字相同而已。
可以利用CentOS中的mysqladmin命令为MariaDB的管理员账号设置密码,为了方便之后的操作,笔者这里使用了弱口令123:
[root@CentOS ~]# mysqladmin -u root password "123"
然后,就可以利用客户端工具mysql来登录MariaDB了,成功登录之后可以进入MariaDB的交互模式,使用quit或exit命令即可退出:
[root@CentOS ~]# mysql -uroot -p123
下面测试是否可以利用PHP来连接MariaDB数据库。在网站主目录/var/www/html中创建一个测试页面test2.php,页面代码如下。
<?php $conn=mysql_connect("127.0.0.1","root","123"); if ($conn) { echo "success"; }else{ echo "fail"; } mysql_close($conn); ?>
这段代码表示以root用户的身份,使用密码123来连接位于本地服务器上的MariaDB数据库,如果连接成功,则输出success,否则输出fail。
在客户端浏览器通过URL地址“http://服务器IP/test2.php”访问该测试页面,如果出现success,则表示之前的配置全部成功。
至此,一个功能完备的LAMP平台就搭建好了。
安装DVWA
搭建好LAMP环境之后,我们继续通过安装一个真实的网站,从而更加真切地了解网站的整体架构,这里要安装的网站是DVWA(Damn Vulnerable Web App)。
DVWA是用PHP+MySQL编写的一套用于常规Web漏洞教学和检测的测试网站,包含了SQL注入、命令执行、文件上传等常见的一些安全漏洞,是一个非常好的Web安全实验平台。
目前DVWA的最新版本是1.9,对于初学者,笔者这里推荐使用相对较旧的版本DVWA-1.0.8。DVWA压缩包可以从本书的资源中获取。
下面介绍DVWA的安装过程
首先,将下载的压缩文件上传到网站主目录/var/www/html中,推荐使用Xshell连接到CentOS虚拟机,这样就可以将物理主机中的文件直接拖到虚拟机中了。
然后,用unzip命令解压,并将解压后生成的目录改名为dvwa:
[root@CentOS ~] # cd /var/www/html [root@CentOS html] # unzip DVWA-1.0.8.zip [root@CentOS html] # mv DVWA-1.0.8 dvwa
修改网站配置文件:
[root@CentOS html]# vim dvwa/config/config.inc.php
这里需要将配置文件中的“$_DVWA[ 'db_password' ]”修改为我们之前为MariaDB的root用户设置的密码,也就是在安装完MariaDB后用mysqladmin命令所设置的密码,本书设置的密码是123。
DVWA中的核心数据都是存放在数据库中的,所以这里必须要告知网站MySQL的账号和密码,这样网站才能连接到MySQL并对其进行操作。

接下来就可以在客户端浏览器中访问DVWA了,DVWA在CentOS中的路径为/var/www/html/dvwa,所以它的URL地址就是“http://虚拟机IP/dvwa”。
首次登录会提示我们去安装数据库。

单击here超链接之后,在设置页面中单击Create/ResetDatabase按钮创建数据库,成功安装后会出现“Setup successful!”的提示。

再次访问URL地址“http://虚拟机IP/dvwa”,就会出现DVWA的登录页面,如图1-43所示。默认的用户名和密码是admin和password。

至此,DVWA安装完成,我们的整个实验环境也搭建好了。
漏洞产生类型
那么,具体哪些地方可能会产生漏洞呢?大概包括以下3个层面。
通信层面:主要是在数据传输过程中存在的一些漏洞如ARP欺骗、明文传输、拒绝服务等。
系统层面:包括操作系统(Linux、Windows)本身,以及系统中运行的各种服务(Apache、Nginx、IS),都可能会存在各种漏洞.
应用层面:主要是指Web应用,即网站。网站是黑客最主要的攻击目标,相应的Web安全也是目前信息安全中最主流的一个分支。Web安全中涉及的漏洞非常多,如SQL注入、命令执行、文件上传、反序列化等:
靶机教学
靶机1--ME AND MY GIRL FRIEND
通过本章学习,读者可以达到以下目标:
1.了解nmap扫描以及端口的概念。
2.掌握HTTP协议相关的Web安全知识点。
3.掌握网站前端代码的相关知识点。
4.了解SSH服务以及相关工具的使用。
5.了解sudo权限,并掌握sudo提权
本书中所使用的靶机全部来自VulnHub,这是一个全球知名的开源靶场,读者可以从网站下载靶机的虚拟机镜像,导入VMware中就可以使用。
靶机页面为https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/,在Description中描述了这个靶机的故事背景。
Alice和Bob是一对情侣,但自从Alice到一家私人公司Ceban Corp任职之后,他们之 间就发生了一些变化,Bob感觉Alice对他隐瞒了什么。Bob让我们帮助他找出Alice隐藏在Ceban Corp公司中的秘密。从靶机描述信息中可知,靶机中共有2个flag,我们的目标就是找出这2个flag。

注意:靶机的VMware虚拟机镜像下载地址可以从本书资源中获取。
直接运行下载的ova文件,就可以自动将靶机导入VMware中。如果出现导入失败的提示只需单击“重试”按钮再次导入即可。
靶机导入之后,将靶机的网络模式改为NAT模式,然后启动靶机。
靶机启动之后,会停留在登录界面,但现在我们没有任何账号密码信息,所以不可能登录。

下面通过渗透测试的方式来获取隐藏在靶机中的flag,并成功登录靶机。
工具使用
nmap扫描
常用指令
-sV选项,这个选项的作用是在探测开放端口的同时,检测该端口对应的服务以及版本信息。
-sn选项,它的作用是以ping方式扫描,同时不扫描开放端口。
-oG选项表示以一种易于检索的格式记录信息,即将每台主机的信息都集中到单独一行来显示,但是该选项默认会将扫描结果保存成文件,如果我们不想保存为文件,那么可以使用“-oG -”的方式,最后的“-”表示将扫描结果直接在屏幕上输出,而不保存成文件。
主机发现
执行的nmap命令中用到了-sn选项,可以通过执行图2-7中的命令查看该选项的帮助信息。可以看到,它的作用是以ping方式扫描,同时不扫描开放端口。
默认情况下,nmap不仅会扫描哪些主机在线,还会扫描这些在线的主机开放了哪些端口,由于我们的目标只是扫描在线主机,因而用该选项可以加快扫描速度。


在上面的扫描结果中包含了很多信息,而我们的目的只是获知哪台主机在线,因而可以进一步使用-oG选项来简化输出
-oG选项表示以一种易于检索的格式记录信息,即将每台主机的信息都集中到单独一行来显示,但是该选项默认会将扫描结果保存成文件,如果我们不想保存为文件,那么可以使用“-oG -”的方式,最后的“-”表示将扫描结果直接在屏幕上输出,而不保存成文件。所以在用nmap扫描整个网段进行主机发现时,推荐的用法是:

扫描端口
计算机网络中的端口并不是指在某台设备上真实存在的物理接口,而是纯粹的逻辑接口。在计算机网络中,所谓的端口实际上就是一个编号。
在网络通信时可以通过IP地址来定位网络中的计算机,但是在每台计算机中可能会同时运行了很多程序。计算机是如何区分这个数据应该交由哪个程序来处理,这就要用到端口,端口的主要作用是用来区分各种网络应用程序。
网络上传送的大多数数据不仅仅只携带了IP地址,还会带有端口号。“IP地址+端口号”称为socket,通过socket就可以准确定位网络上某台主机中运行的某个程序(准确地说应该是某个进程)。网络通信的本质是网络中不同主机上所运行的进程之间的通信,而这些主机和进程都要通过socket进行区分。
端口分类
端口号的十进制取值为0~65535,其中0端口未用,可用的端口号是1~65535。
端口号总体被分为两大类:
固定端口:1~1023。
随机端口:1024~65535。

端口号为什么要分为固定端口和随机端口呢?
笔者使用的计算机(IP地址为192.168.31.184)属于客户端,计算机中运行的浏览器所使用的端口号是55203。按照上面的分类,这是一个随机端口。也就是说,如果把浏览器关闭,那么,当用户再次打开浏览器访问51CTO博客时,使用的就不再是这个端口了。对于客户端而言,什么时候会去访问网站,这完全是随机行为,所以自然应该采用随机端口。当客户端的某个应用层程序需要通过网络传输数据时,系统就为它分配一个随机端口;当数据传输完毕,与服务器之间的连接断开,那么端口就被自动收回,可以再分配给其他程序使用。如果也没有其他程序要使用这个端口,那么端口就会被关闭。
51CTO博客作为服务端(IP地址203.107.44.140),所使用的端口号是443,这是一个固定端口。
固定端口包含以下两层含义:
这个端口是固定分配给某个程序使用的。TCP443端口对应的就是HTTPS协议。
固定端口不会自动关闭,即使没有任何数据在传输,这个端口也会一直开放着。
在服务端只要运行了某种服务,就会开放相应的固定端口,端口与服务是一一对应的。至此我们就可以理解,为什么渗透测试的第一步是扫描靶机上开放的端口,因为只要知道了靶机开放了什么端口,就可以了解靶机上正在运行的服务,从而可以进一步寻找可以利用的地方。这就要求我们要熟悉那些在网络安全中经常涉及的敏感端口,例如TCP80和TCP443端口都是对应了Web服务,TCP22端口对应了SSH服务,TCP445端口对应了Samba服务,TCP21端口对应了FTP服务等。
端口映射关系查询
对于一些不熟悉的端口,我们可以通过grep命令在/etc/services文件中查询,这个文件中记录了所有端口和服务之间的对应关系。
查询TCP2049端口对应的服务,可以执行图2-17所示的命令,从命令的执行结果中可以看到,TCP2049端口对应了NFS(Network File System)服务。

端口查看
执行netstat -an命令查看端口状态。从命令的执行结果中可以看出,当前主机192.168.31.184:55203是本地主机的socket,55203是本地主机上的浏览器所使用的端口号。203.107.44.140:443是51CTO博客服务器的socket,443是这台服务器上的Web服务所使用的端口号。

绝大多数的网络通信都是在socket之间进行的。socket中的IP地址对应了网络中的某台具体主机,socket中的端口号则对应了这台主机中的一个具体的应用程序。
解释传输层端口号的起源
传输层的协议只有两个:TCP和UDP(存疑,不只是这两个,还有其他的传输层协议),而应用层的程序则是多种多样,所以这就带来一个问题:
传输层的协议如何区分它所接收到的数据到底是对应了应用层的哪个程序端口就是为了解决这个问题而引入的。所以在理论层面,端口是一个传输层的概念,它是传输层的协议为了区分应用层的程序,而为它们分配的一个编号。
每个端口都对应着一个应用层的程序,当一个应用程序要与远程主机上的应用程序通信时,传输层协议就为该应用程序分配一个端口。端口号是唯一的,不同的应用程序有着不同的端口,以使彼此的数据互不干扰。

现在就可以解释为什么像ping命令这类网络程序不需要端口号,原因其实很简单,因为ping命令使用的是网络层的ICMP协议,而网络层在传输层之下,所以ping命令的数据不需要经过传输层的处理,这样自然就不需要为其分配端口号了。
同理,数据链路层的ARP协议也不需要端口号。但这类程序毕竟是少数,我们平时使用的绝大多数网络程序都是位于应用层,因而都会有相应的端口号。
端口是一个传输层的概念,是由传输层的TCP或UDP协议给应用层的程序分配的。在表示端口时,应标明这是一个TCP端口还是一个UDP端口。
基础知识
web服务两大核心技术
Web服务有两大核心技术:超文本标记语言(HTML)和超文本传输协议(HTTP)。
网页的本质是HTML代码,关于HTML的内容将在后面进行介绍,这里我们先来了解HTTP。HTTP首先是一种协议,在之前的计算机网络模型部分也曾介绍过,网络协议是在计算机网络中通信双方所应遵循的规则。网络中的每一项服务都要遵循相应的协议,其中Web服务所遵循的就是HTTP协议。
HTTP协议遵循请求(Request)/响应(Response)模型,所有的HTTP通信都被构造成一对HTTP请求和HTTP响应报文。HTTP请求只能由客户端发起,服务器不能主动向客户端发送数据。
用户在客户端上通过浏览器去访问网站,这其实是在通过HTTP协议向网站发出访问请求,网站接收到请求之后,找到相应的网页并以HTTP响应的方式返回客户端,客户端的浏览器接收到响应后对其进行解释,最终将图、文、声并茂的页面呈现给用户。这就是Web服务的基本工作过程
web基本概念
下面介绍几个Web相关的基本概念。
1.静态资源和动态资源
在一次HTTP请求和响应的过程中,客户端所请求以及服务器所返回的内容就称为Web资源。
Web资源总体上分为静态资源和动态资源两类。静态资源和动态资源的分类依据是,服务器是否需要对这些资源处理之后再发送给客户端。
对于静态资源,只要客户端请求访问这些资源,服务器无须对其进行额外的处理,直接将这些资源发送给客户端即可。
典型的静态资源如下。
文件名后缀为“.htm”或“.html”的各类静态网页文件。
文件名后缀为“.jpg”“.jpeg”“.gif”“.png”的各类图片文件。
文件名后缀为“.txt”的各类文本文件。
文件名后缀为“.mp3”“.avi”的各类音频和视频文件。
文件名后缀为“.css”“.js”的各类前端脚本文件。
动态资源通常是指用脚本语言开发的脚本程序文件。
根据网站所使用的脚本语言不同,脚本程序文件主要有
文件名后缀为“.php”的PHP脚本文件以及
文件名后缀为“.jsp”的JSP脚本文件等。
这些脚本程序文件在接收到客户端发来的请求之后,需要先在服务器端运行,然后再将得到的结果发给客户端。
客户端可以向这些脚本程序发送参数,然后,服务器根据客户端请求参数的不同而向客户端发送动态变化的内容,从而实现客户端与服务器端的交互。
例如,在CentOS虚拟机中创建一个html文件/var/www/html/test.html,文件内容是一行简单的HTML代码:
<h1>This is my WebSite</h1>
然后,在客户端访问test.html并查看其源码,可以发现源码与服务器端是完全一样的,所以这是一个典型的静态资源。

在CentOS虚拟机中再创建一个PHP文件/var/www/html/test.php,文件内容是一行简单的PHP代码:
<?php phpinfo( ); ?>
在客户端访问test.php并查看其源码,看到的是大量的HTML代码。这些都是PHP代码执行后的结果,因而这是一个典型的动态资源。

目前的绝大多数网站都是采用的动态页面,例如在一个购物网站中可能会存在大量不同类别、不同型号的商品,每种商品都有各自的商品信息,如果为每种商品都设计一个单独的网页,那么整个网站将无比庞大和复杂,运维人员后期维护起来也将非常困难。所以正确的做法是将所有的商品信息都存放在网站数据库中,然后编写一个脚本程序文件,该文件接收到客户端发来的要浏览某个商品的请求之后,就先从数据库中调取相关商品的信息,然后再将这些信息与css框架、js脚本等结合在一起,以HTML代码的形式发送到客户端。客户端所看到的内容是由服务器端动态生成的,所以称为动态资源。
2.统一资源定位符
URL地址格式如下:、
协议名://主机名(IP地址)/路径?参数名1=参数值1&参数名2=参数值2
参数:用于客户端向网站传送数据,参数可以有多个,中间用&分隔。由于多数情况下,客户端并不需要向网站传送数据,所以很多URL中并没有参数部分。
对于初学者,一定要理解URL中的主机名,其实对应的就是Web服务器中的网站主目录。例如对于使用LAMP平台的网站,默认的网站主目录是/var/www/html。假设网站的域名是www.test.com,那么URL地址http://www.test.com/在Web服务器中所对应的就是网站主目录/var/www/html。
另外,这里还涉及一个网站首页的概念,网站首页是指客户端在访问网站时默认打开的页面,首页文件通常都是以index命名,如index.html、index.php等。假设www.test.com网站的首页文件是index.php,那么URL地址http://www.test.com/就等同于http://www.test.com/index.php,都表示要去访问Web服务器中的/var/www/html/index.php文件。
3、网站的框架固定性
get方法
需要注意的是,客户端是否需要向服务器传送数据,这需要由网站开发人员根据实际需求来进行设置。
对于目前广泛使用的动态页面,页面的框架通常都是固定的,客户端向服务器端传送相应的参数,网站就根据用户传递的不同参数在这个页面中显示相应的信息。
例如,进入我们之前搭建的DVWA网站,找到SQLInjection模块,在User ID文本框中输入1,然后单击Submit按钮,就可以看到这个数据通过GET方法发送给了网站。
通过GET方法传送的数据会直接暴露在浏览器的地址栏中,这增加了信息泄露的风险。因此,对于敏感信息,如用户密码,使用GET方法进行传输是不妥当的。
如要登录某个网站,那么客户端就需要向服务器传递用户名和密码等数据,所以HTTP协议也允许客户端通过GET方法向服务器传送少量数据。例如请求头“GET index.php?id=1 HTTP/1.1”,表示客户端请求访问服务器的index.php页面,并用GET方法向服务器传递数据“id=1”,id是在服务器端事先定义好的一个参数,数值1就是客户端所传送的数据。如果要同时传递多个参数,参数之间以“&”分隔,如“id=1&name=admin”。
post方法
为了解决GET方法存在的问题,随后引入了POST方法。顾名思义,POST方法专门设计用于客户端向服务器传送数据。
POST方法把要传送的数据放在HTTP请求报文的正文中,所以这些数据不会显示在浏览器的地址栏中。使用POST方法传送的数据没有长度限制,因此可以用于向服务器发送大量数据,所以在诸如用户登录、文件上传、留言提交等场景都会使用POST方法。
payload
掌握GET和POST这两种请求方法对于学习Web安全非常重要,因为要对网站进行渗透测试,通常都需要向网站发送一些经过精心构造的数据或代码,这些数据或代码被称为payload。这些payload要根据不同的需求,采用相应的请求方法发送给网站。
浙公网安备 33010602011771号