LAMP环境安全配置之Web应用程序安全漏洞分析与防范

2014年09月09日 技术资料 3244 views 0

PHP是目前互联网环境中最主流的动态网站开发脚本语言之一,使用PHP开发的Web应用程序的安全性也是黑客喜欢关注的焦点。本文将通过源码分析的方式对使用PHP编写的Web应用程序的安全性进行分析和描述。


在前几期文章中我们针对常见Web安全漏洞的攻击与防范方法进行了分析和描述,并结合实例对ASP语言编写的Web应用程序的源码进行漏洞分析。与ASP语言类似,PHP语言也是目前互联网环境中最主流的动态网站开发脚本语言之一,近几年中使用PHP的用户量远远超过了ASP,并且在我国互联网环境中随处可见使用PHP语言编写的开源Web应用程序。本文将通过源码分析的方式对PHP语言开发的Web应用程序安全漏洞进行分析,并结合实际的漏洞描述可行有效的防范方法。


正如前几期文章中介绍,分析Web应用程序的安全性主要是分析Web应用程序中的变量和存在安全问题的函数。对PHP语言编写的Web应用程序的分析过程也是一样,分析程序中可被用户控制的变量信息,并分析程序在处理变量过程是否存在着一定的缺陷或使用了不安全的函数,而这些不安全的操作正是导致Web应用程序存在安全问题的根本原因。由于不同语言对变量的获取和操作过程中存在着一定的差异,因此我们接下来会对PHP语言对变量的获取以及常见的安全漏洞进行分析。


变量的获取
使用PHP编写的Web应用程序在变量获取可以通过多种方式实现,常见的获取变量方式有$_GET、**、$_COOKIE和$_SERVER等方式,其中$_GET方式表示通过GET方式进行获取变量内容,**方式是指通过HTTP数据报文中数据段部分获取变量内容,$_COOKIE方式是指通过HTTP数据报文中Cookie段部分获取变量内容,$_SERVER方式是指通过HTTP数据报文中HTTP数据头部中的数据内容获取变量内容。所以在分析PHP程序变量获取时,可以通过查找上述关键字的方式对变量进行查找,也可以使用一些文件编辑器类软件对Web应用程序目录下的PHP文件进行批量查找,确定变量获取的位置,如下图1所示为使用Editplus对Web应用程序源码目录下的PHP文件进行搜索,查找$_GET关键字出现的位置。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第1张


然而在有些使用PHP开发的Web应用程序中,也有不经过变量初始化操作而直接对变量进行操作的情况,所以我们在对上述关键字进行查找分析的同时,也需要对未经过初始化的变量进行分析和测试,以防止遗漏的情况发生。
漏洞分析与防范


本次漏洞分析使用的PHP编写的Web应用程序是DAMN VULNERABLE WEB APP(DVWA)。该程序是由国外网络安全人员编写的专门用于教学目的使用的Web应用程序,该程序中集合了PHP应用程序中常见的安全漏洞,如SQL注入漏洞、XSS跨站脚本攻击漏洞、文件上传漏洞以及命令执行漏洞等,程序通过定义安全等级高、中、低的方式对每种漏洞进行定义,方便用户在学习中进行分析。安全等级低的漏洞往往是没有经过任何过滤而导致漏洞存在,安全等级中的漏洞是表示代码中有一定的过滤,但是却因为过滤不够完善导致可以被黑客进行利用,而安全等级高的情况则被认为是比较理想的安全防范方法,高等级的演示表示用户可以进行参考的代码等级。下面我们结合漏洞实例对该程序的安全性进行分析和描述。


SQL注入漏洞
在进行漏洞分析和测试过程中,我们需要在DVWA安全性设置中对安全等级进行设置,通过设置实现程序加载不同等级的PHP代码,如下图2所示,我们首先将安全等级设置为低级,其后每种漏洞的分析和测试方法相同。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第2张

在SQL注入漏洞分析中,功能代码是通过输入指定ID来查询数据库并显示相应的数据信息,如下图3所示,通过填写ID为1并提交以后显示的数据内容为admin的信息。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第3张

图3

通过对代码分析中我们发现,DVWA程序通过.htaccess文件将magic_quotes_gpc设置为Off,也就是说我们通过GET/POST/COOKIE提交的单引号和双引号等字符不会经过魔法转义,而在分析低等级的存在SQL注入漏洞的代码时,发现代码内容如下图4所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第4张

从代码中我们了解到,程序在通过GET方式获取变量以后,没有对$id内容进行任何的检查和过滤就带入到SQL语句中进行查询,同时因为magic_quotes_gpc被设置为Off,使得我们可以轻易实现通过联合查询的方式来遍历所有数据内容信息。通过对数据库表结构查看,我们了解到users表结构如下图5所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第5张

而我们比较感兴趣的内容是user字段和password字段,所以输入框中我们提交内容' union select user,password from users#,而此时在执行查询过程中,执行的SQL语句内容为SELECT first_name, last_name FROM users WHERE user_id = '' union select user,password from users#',其中我们输入的单引号是为了闭合前面的单引号,输入的#号在MySQL数据库查询中作为注释符注释掉后面的语句,使得后面语句失效。通过这样的查询就可以实现直接查看所有users表中的敏感数据信息,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第6张


安全等级为低的代码可以说是没有经过任何过滤处理的代码,所以很容易导致恶意攻击的发生。接下来我们看一下安全等级中的代码内容,如下图7所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第7张


从上图中我们发现,程序在获取变量$id内容以后会使用函数mysql_real_escape_string对变量$id进行处理,然后再带入到SQL语句中执行。当我们按照之前测试安全等级低的代码进行提交时,发现我们提交的单引号内容被转义,导致前面的方法失效,如下图8所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第8张


而这个转义正式函数mysql_real_escape_string的作用是该函数会根据数据库中字符集的定义对变量中存在的单引号双引号等符号进行转义处理,也就是说该函数在处理字符型注入的过滤中是非常有效的。但是我们在分析是发现安全等级为中级的代码中,在执行的SQL语句内容为SELECT first_name, last_name FROM users WHERE user_id = $id,我们发现$id前后并没有单引号的包围,也就是说现在的注入情况是数字型的注入,mysql_real_escape_string函数对该类型的注入将不起作用,所以我们提交内容修改为0 union select user,password from users,提交以后发现成功利用该漏洞,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第9张


那么针对代码要如何彻底防范该SQL注入攻击呢?安全等级高的代码部分提供了完善的解决方案,代码如下图10所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第10张


从代码中我们发现,代码过滤过程中不仅仅对可能存在的字符型注入进行过滤处理,同时也是用了is_numeric函数对变量$id进行判断,判断其是否为数字,如果不是数字就不会继续执行,从而彻底地杜绝了该SQL语句执行过程中可能存在的SQL注入攻击的情况。实际上,针对该情景的SQL注入攻击的过滤,仅通过is_numeric函数对变量$id进行判断是否为数字就足够了,但是程序的作者增加了对字符型注入的过滤,来方便我们的学习。
XSS跨站脚本攻击漏洞
在DVWA程序中,XSS跨站脚本攻击漏洞分为两种类型,分别是反射型和存储型。程序中对反射型和存储型的代码处理过程基本相同,惟一不同是是否将相应数据内容写入数据库中,所以在针对XSS跨站脚本攻击漏洞代码分析过程中,我们仅针对反射型演示代码进行分析。首先我们还是分析安全等级为低的漏洞代码,反射型低安全等级的代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第11张


从代码中我们发现程序仅判断获取内容是否为空,如果不为空的话就会将相应的代码进行输出。根据我们前几期中对XSS跨站脚本攻击漏洞的介绍,可以很方便地提交数据内容为<script>alert(/xss/)</script>实现XSS跨站攻击的目的,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第12张


而在反射型安全等级为中的代码中我们发现,程序通过str_replace函数对用户提交的数据中可能存在的<script>进行过滤,实现用户自定义构造脚本标签的目的,代码如下图13所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第13张


然而这种简单的过滤方式仍然可以轻松地绕过,并且绕过方式有很多种。首先,<script>标签并不是惟一一个被利用执行XSS攻击的标签,如我们提交内容为<img src=# onerror=javascript:alert(/xss/);>时,同样可以实现XSS攻击的目的,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第14张


同样针对该过滤代码的特性,我们还可以提交<scr<script>ipt>alert(/xss/)</script>实现绕过,因为代码中通过str_replace函数对字符串<script>过滤,并替换为空,那么当我们提交<scr<script>ipt>alert(/xss/)</script>时,经过str_replace函数后,数据变为<script>alert(/xss/)</script>,正好符合我们进行XSS攻击目的。
那么针对该情景的XSS跨站脚本攻击漏洞要如何安全防范呢?高安全等级中的代码提供了完善的安全解决方案,代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第15张


从代码中我们发现,高安全等级的代码通过htmlspecialchars函数对提交的name变量进行了过滤,该函数的主要作用是过处理参数字符串中可能存在的HTML代码标签信息,并将标签信息进行转义,使其失去作用。当我们提交先前测试的跨站脚本代码时,我们发现代码会按照字符串形式进行显示,但是在源码中<和>符号被转义,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第16张


针对该XSS跨站脚本攻击漏洞的情形,提交的数据代码中出现在HTML代码的数据内容中,而不是标签的属性信息中,所以如果黑客想利用该漏洞,就必须通过构造HTML标签实现执行代码的目的,而htmlspecialchars函数则是对这种情况实现过滤的,有效防止了XSS跨站脚本攻击漏洞的形成。
命令执行漏洞
在DVWA中,命令执行漏洞页面的主要功能是通过输入一个IP地址执行相应的ping命令,低安全等级文件的代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第17张


从代码中我们发现,程序在获取完用户输入的IP地址以后,会首先判断服务器的操作系统类型,然后执行相应的ping命令,但是并没有对用户输入的信息进行过滤,根据我们前几期中介绍的命令执行漏洞的利用方式,可以通过利用管道符|的方式实现命令执行漏洞的利用。我们提交内容为|net user并提交就可以看到当前Windows服务器的账户信息


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第18张


而在中安全等级的代码中,我们发现代码通过str_replace函数对用户提交的数据内容中的&&和;进行过滤,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第19张


代码过滤的主要目的是为了防止用户提交的数据内容中存在多条语句执行的目的,也就是说执行完ping命令以后再继续执行下一条命令,但是这种过滤方式却没有将管道符考虑进去,同样可以导致被绕过的情况。而高安全等级代码中针对该场景给出了完善的安全解决方案。


代码如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第20张


代码根据该场景的实际情况进行过滤处理,根据IP地址的特点进行处理,保证输入的数据信息为指定的IP地址格式,如果输入信息不符合格式的话就认为用户输入的信息内容为非法信息。同样,针对该场景,我们也可以通过正则表达式匹配的方式进行检查IP地址格式的有效性。


文件上传漏洞
文件上传漏洞可以说是Web应用程序中最为严重的漏洞之一,因为利用该漏洞黑客可以通过上传Webshell文件的方式直接获网站权限,进而为进一步渗透攻击奠定基础。在DVWA程序中也可以看到比较严重的漏洞情况,因为DVWA程序中提供的高安全等级的示例代码中仍然存在被绕过的情况,下面我们结合DVWA的代码对文件上传漏洞进行分析。


首先我们还是从低安全等级的代码开始分析,低安全等级核心代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第21张


从代码中我们发现,程序在获取用户上传的数据内容信息以后,没有对文件类型、内容进行任何过滤就将上传的文件移动至hackable/uploads/文件夹中。也就是说,黑客可以直接通过文件上传功能,将一个PHP编写的Webshell直接上传到网站目录中,


如下图所示,通过直接上传PHP文件获取Webshell。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第22张


这种低安全等级的上传漏洞是相当危险的,接下来我们看一下中安全等级的代码是如何实现的。中安全等级上传核心代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第23张


从代码中我们发现,程序处理过程中增加了对上传文件类型和上传文件大小进行过滤,但是在我们先前对上传漏洞攻击的文章中曾介绍过,单纯地针对MIME类型进行过滤是很容易被黑客绕过的,黑客可以通过上传抓包,修改数据包中的数据长度和MIME类型为指定类型image/jpeg,然后再通过NC等数据包提交工具再次提交的方式就可以方便实现绕过。


如下图所示,实现对中安全等级的代码实现绕过。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第24张


而针对该漏洞情景,比较严重的是DVWA程序提供的高安全等级的代码同样存在被黑客绕过的情况。高安全等级的上传核心代码


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第25张


从代码中我们发现,高安全等级代码中的安全检查方式是通过检测文件名后缀名的方式进行安全检查的。首先,程序获取到用户上传的文件以后,会检查文件命中最右侧一个.后面的内容,然后判断该内容是否为jpg/JPG/jpeg/JPEG的图片形式,如果是图片形式将文件移动至hackable/uploads/文件夹中。但是这种过滤方式仍然存在被绕过的可能性。如果针对服务器是IIS6.0版本的话,可以通过利用IIS的解析漏洞通过上传phpspy.php;1.jpg的文件,因为该文件名完全符合过滤检查为正常文件的特征,所以利用该方式可以方便实现绕过,并利用解析漏洞获取一个可以执行的Webshell,


如下图所示。

LAMP环境安全配置之Web应用程序安全漏洞分析与防范 第26张


那么针对该上传文件场景,比较好的安全过滤方式是将上传文件保存是进行文件名称随机化。因为上传内容为图片,因此应完全先定移动文件时生成的后缀为图片后缀的形式,以防止各种可能存在的上传攻击的发生。针对文件上传漏洞的安全防范,可以查阅笔者之前的文章《Web攻防系列教程之文件上传攻防解析》。


总结
在DVWA程序中,可以提供演示的安全漏洞不仅仅包括这几个,由于篇幅的原因,本文仅挑选了几个具有代表性的安全漏洞进行分析和描述,并针对安全漏洞的防范进行了分析。在目前互联网环境中,使用开源的Web应用程序构建网站并运营的情况占大多数,而且使用这种开源的Web应用程序很容易受到黑客的攻击,因为这种程序的漏洞也是黑客关注的焦点之一。所以在对代码安全分析有了一定的了解以后,对自己的网站代码进行安全审计无疑会给网站的安全性带来更多的保障,使得网站可以安全稳定地运营。

👍好活当赏🧧