在前几期文章中我们针对常见Web安全漏洞的攻击与防范方法进行了分析和描述,并了解到Web安全漏洞对网站的安全运营以及企业敏感信息防泄密的影响是巨大的,所以有效防范Web应用程序的漏洞,防止敏感信息泄露是网站运营的关键。通过Web应用程序安全漏洞扫描程序可以在一定程度上帮助我们发现可能存在的安全漏洞,但是由于Web应用程序应用环境的复杂性,导致很多漏洞无法被检测工具发现,而源码分析的方式则可以通过对Web应用程序的工作流程和实现方法进行分析,有效发现各个功能实现过程中可能存在的安全隐患问题。下面我们通过源码分析的方式对ASP语言开发的Web应用程序安全漏洞进行分析,并结合实际的漏洞描述可行有效的防范方法。
在了解了常见Web安全漏洞的攻击方法以后,我们知道对Web应用程序的攻击实际上是对Web应用程序的变量和实现函数的攻击,Web应用程序工作过程是获取用户输入的信息,然后经过Web应用程序处理后将相应的返回结果进行反馈。那么获取用户输入信息的过程就是对变量的获取过程,Web应用程序处理过程就是利用程序中的函数对变量进行操作的过程。所以我们在对Web应用程序漏洞查找过程就是查找危险变量和危险函数的过程,查找过程中可以使通过危险变量查找函数,如果函数在对变量处理过程中不够严格的话,就可能导致漏洞的存在。同样,我们也可以通过危险函数查找变量的方式进行分析,如果函数在处理变量过程中存在问题,那么如果变量在获取过程中始终是用户可控的话,同样可以导致漏洞的形成。为了分析和描述方便我们在网上寻找了一套ASP语言编写的Web应用程序,通过结合实例的方式对漏洞进行描述。
变量的获取
ASP语言编写的Web应用程序在变量的获取主要是通过Request对象实现的,常见的包括Request. QueryString、Request.Form以及Request.ServerVariables等,所以我们在对ASP程序变量获取时,主要是查找Request对象出现的位置。为了方便查找Request特征关键字,我们可以使用一些诸如Editplus、Dreamweaver之类的编辑器类工具,对Web应用程序目录下的ASP文件进行批量查找,确定变量获取的位置,如下图1所示为使用Editplus对Web应用程序源码目录下所有的ASP文件进行搜索,查找Request关键字出现的位置。

图1
漏洞分析与防范
在确定了变量的获取过程以后,我们就需要根据变量的位置去查找Web应用程序对变量的处理过程,如果Web应用程序对变量的处理过程不严格的话,就会导致漏洞的形成。而在对本套ASP程序进行分析后,我们发现该程序虽然代码量不多,但是存在多种安全漏洞,主要包括SQL注入漏洞、XSS跨站脚本攻击漏洞、越权访问漏洞和富文本编辑器漏洞。
SQL注入漏洞
对该程序分析过程中,我们发现多个文件存在SQL注入漏洞,如custom.asp、news_category.asp等,在custom.asp中代码如下图2所示。

图2
我们发现程序通过GET方式获取变量id以后,没有经过任何过滤就直接带入SQL语句中进行查询并将结果进行显示,这是一个典型的SQL注入漏洞,那么我们确定一下这个漏洞是否确实存在。
我们访问custom.asp?id=1的页面,并将id的值提交为id=1 and 1=1,在浏览器中访问发现结果返回为正常结果页面,如下图3所示。

图3
然后我们提交id=1 and 1=2,再一次在浏览器中提交,访问发现返回为错误页面,如下图4所示。

图4
从返回结果中我们可以确定该文件确实存在SQL注入漏洞,当我们提交id=1 and 1=1时,执行的SQL语句内容为select * from custom where id=1 and 1=1,因为id=1的结果在数据库中是存在的,而提交1=1的目的就是提交一个恒成立的结果以方便进行and逻辑运算来确定程序是否对提交的数据进行过滤,当然提交2=2,3=3,甚至100=100,他们的原理都是一样的,所以两个均为真的结果在经过and逻辑运算处理以后结果为真,返回的页面为正常页面。当提交id=1 and 1=2时,由于1=2是不成立的,所以通过and逻辑运算以后返回结果为假,导致查询出错,返回错误的页面,进而验证了注入漏洞确实存在。那么通过之前学习的SQL注入漏洞利用方式,我们知道黑客可以很容易通过该SQL注入漏洞去获取管理员账号和密码,如下图5所示,黑客可以很方便通过SQL注入漏洞利用工具猜解出管理员账号密码等信息。

图5
同样也可以通过union联合查询的方式,直接爆出管理员账号密码信息,以避免SQL注入漏洞利用工具在猜解过程中比较耗时的情况,如下图6所示。

图6
在文件news_category.asp中同样存在比较严重的SQL注入漏洞,该文件中23-25行代码如下图7所示。

图7
从代码中我们发现,该文件的SQL注入漏洞形成的原理和custom.asp漏洞形成原理完全相同,在通过GET方式获取变量id数据以后没有经过任何过滤就带入到SQL语句中进行查询,导致SQL注入漏洞的形成,那么黑客同样也可以利用上述介绍的方法实现对敏感数据信息的获取,如下图8所示为通过news_category.asp存在的注入漏洞利用union联合查询的方式获取管理员账号和密码信息。

图8
在获取了管理员账号信息和密码加密的Md5信息以后,黑客就可以通过破解Md5加密密码后登录管理后台进行后续操作。
防范SQL注入漏洞
通过对上述两个SQL注入漏洞的分析和利用,我们发现了SQL注入漏洞对该程序的安全性造成了严重的影响。而在对程序的代码进行分析过程中,我们发现该程序的作者并非一点安全意识都没有,在一些页面中添加了对变量的判断内容,代码如下图9所示。

图9
作者在获取变量id以后,会判断GET方式获取id是否为空或者是否为数字,如果为空或者不是数字的话就会提示非法操作信息并停止执行。但是并没有针对上述介绍到的SQL注入页面中加入判断。所以针对SQL注入漏洞的防范,我们可以通过以下几种方式实现。
1. 数字型变量获取过程中,需要判断提交的内容是否为数字,如果内容不是数字则认为是非法操作。
2. 字符型变量获取过程中,需要判断提交的内容中是否包含单引号等可能会对SQL语句执行过程中造成影响的特殊字符,如果存在特殊字符则认为是非法操作。
3. 可以通过在Web应用程序中增加通用防注入程序来防止SQL注入攻击。通用SQL防注入程序通常在数据库连接文件中被引入,并在程序执行过程中对常见的GET、POST、Cookie等提交方式进行过滤处理,拦截可能存在的SQL注入攻击。
XSS跨站脚本攻击漏洞
在分析该套ASP程序时,我们发现该程序中存在留言功能,而留言功能对用户提交的数据内容过滤不严,导致存储型XSS跨站脚本攻击漏洞的形成。
在guestbook_add.asp中,程序通过POST方式对用户提交的数据进行获取,获取以后未经过严格过滤便直接插入到数据库中,代码如下图10所示。

图10
从代码中我们发现,程序仅判断名字是否为空以及电子邮件和手机号码的格式,而对其他数据内容均没有过滤,下面我们对该存储型XSS跨站脚本攻击漏洞进行验证。如下图11所示,我们在提交留言页面提交数据信息。

图11
在前台浏览留言和后台浏览留言信息时均可造成XSS跨站脚本攻击,如下图12,图13所示。

图12

图13
防范XSS跨站脚本攻击漏洞
针对XSS跨站脚本攻击漏洞的防范方法我们在前期的文章中有过介绍,主要是针对提交的特殊字符进行HTML编码处理,如常见的单引号、双引号、&符号、<符号和>符号等,在不影响正常数据显示的前提条件下,过滤恶意字符。具体的细节可参见拙作。
越权访问漏洞
在针对该套程序分析过程中,我们发现程序在管理员登录以后是通过判断session("user_name")是否为空来判断访问页面的用户是否为管理员,在管理员后台目录中,大多数的程序中都已经加入session.asp文件实现上述判断,然而在分析过程中我们发现仍有少数文件没有引入session.asp文件进而导致越权访问漏洞的形成。存在该问题的文件主要包括admin_delete.asp、admin_modify.asp、banner_delete.asp、banner_modify.asp、CategoryManagement.asp、custom_delete.asp、download_update_pass.asp、flink.asp、guestbook.asp和guestbook_view.asp。这些文件因为没有引入session.asp文件导致黑客可以在没有管理员账号密码或者不用登录后台的情况下直接执行页面的操作,下面我们通过三个危害比较严重页面进行描述。
1. 删除任意管理员账号
在admin目录下的admin_delete.asp,由于没有引入session.asp文件,仅是判断提交的id是否为数字或是否为空的情况下,就带入SQL语句中,删除指定id的管理员用户,代码如下图14所示。

图14
针对上述代码,黑客即使不知道管理员账户的Id信息,只需要构造一个URL列表,进行批量访问就可以实现删除管理员账号的功能,如下图15所示,通过提交id=3,删除指定管理员id为3的账号信息。

图15
2. 修改任意管理员密码
与admin_delete.asp相同,由于没有引入session.asp文件,admin目录下的admin_modify.asp没有验证访问该页面的用户权限就直接执行修改指定id的管理员账号密码的操作,导致黑客可以利用该漏洞实现修改任意管理员密码的操作,该漏洞代码如下图16所示。

图16
当提交id=1时,便可以直接访问id值为1的管理员账号,并通过表单提交的方式直接修改该管理员的密码,进而使用修改后的密码直接登录管理后台,修改密码页面如下图17所示。

图17
3. 网站首页插入恶意代码
在admin目录下,CategoryManagement.asp文件的作用是修改首页显示的分类信息,由于没有引入session.asp文件,可导致黑客可以通过访问该文件直接修改首页分类信息,该文件部分代码如下图18所示。

图18
由于该操作直接涉及到首页代码显示的操作,而且对写入数据没有任何过滤,导致黑客可以向网站首页中写入任何数据,包括恶意代码,如下图19和图20所示,黑客通过写入iframe框架的方式向网站首页中引入其他网站代码,如果代码中包含恶意挂马代码,则访问网站的用户就会受到恶意代码的攻击。

图19

图20
防范越权访问漏洞
针对该程序的越权访问漏洞的防范,只需要判断访问页面的用户是否具有管理员权限即可,在本程序中作者是通过引入seeion.asp文件来判断的,因此只需要在其他未引入session.asp的后台管理文件中添加代码<!--#include file="seeion.asp"-->引入seeion.asp即可实现判断和防范。
富文本编辑器漏洞
在程序后台中,为了方便对文本字符的方便快捷操作,程序员引入了第三方富文本编辑器软件FckEditor程序,而引入的FckEditor版本为存在上传文件漏洞的版本,黑客可以利用该富文本编辑器漏洞上传网页木马文件获取网站的webshell。由于Fckeditor程序限制了ASP和ASA等脚本类型文件的上传,所以只能借助IIS6及以上版本的解析漏洞获取。通过访问FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=shell.asp在定义的上传目录中创建一个shell.asp的文件夹,然后在该文件夹下上传一个修改了后缀名为gif的ASP一句话木马,如下图21所示。

图21
然后我们点击上传的文件,发现一句话木马写入成功,并且利用该一句话木马顺利写入功能较多的ASP webshell,如下图22和图23所示。

图22

图23
防范富文本编辑器漏洞
由于使用的富文本编辑器程序绝大多数为第三方开发,并且由于编辑器代码的复杂性,Web应用程序员很难修改编辑器本身的漏洞,所以针对富文本编辑器漏洞的防范主要包括以下几方面:
1. 删除不必要的文件。由于富文本编辑器大多数为第三方开发,功能比较复杂,而对于使用编辑器的Web应用程序来说,需要使用的文件只有一部分,因此对于使用范围以外的文件,建议将其删除,以防止因存在漏洞导致黑客入侵,如eWebedito程序中的admin_login.asp、admin_default.asp等文件,对于Web程序的使用不是必须的,所以可将其删除,防止黑客通过该文件登录直接获取webshell。
2. 当富文本编辑器有安全漏洞补丁或更安全的新版本出现时,程序员应对存在漏洞的文件进行修补或者替换为安全性高的新版本。
3. 可以通过在调用的富文本编辑器中加入Web应用程序权限验证代码,防止黑客通过直接访问Web应用程序的富文本编辑器直接操作,虽然该方法无法从根本上解决编辑器漏洞,但是可以在一定程度上防止黑客直接调用富文本编辑器相关文件进行操作。
4. 严格限制网站目录的写入和脚本执行权限,尤其针对上传目录的权限设置,关闭脚本执行权限,即使黑客通过上传漏洞将文件上传到web目录下,由于没有执行权限,webshell也无法运行。
通过对Web应用程序源码分析的方式挖掘程序中可能存在的漏洞,是目前代码审计工作的重要组成部分。通过对Web程序的白盒测试,可以发现很多隐藏在Web应用程序中利用条件比较复杂苛刻的漏洞信息。所以,在日常的安全测试过程中,应在原有的黑盒测试的基础上,增加代码分析审计内容,挖掘更多的可被黑客恶意利用的漏洞信息,保护应用程序及数据信息的安全性,防止敏感信息泄露。
|