基于Web的酒店点评系统安全测试研究
2016-12-26苏乾,侯俊
苏 乾,侯 俊
(上海理工大学 光电信息及计算机工程学院,上海 200093)
基于Web的酒店点评系统安全测试研究
苏 乾,侯 俊
(上海理工大学 光电信息及计算机工程学院,上海 200093)
为防范基于Web应用程序的漏洞攻击,文中对一个Web页面的酒店点评系统安全性能进行了测试。研究了该酒店点评系统在运行中各个环节上出现的Web应用程序漏洞。针对其中3种主要漏洞:SQL注入、跨站脚本攻击及跨站请求伪造,根据其产生原理和攻击过程,提出了过滤特殊字符和加密关键传递参数的防御方法,并给出相应的程序代码。测试结果显示,该酒店点评系统能有效地防范Web应用程序漏洞,提高了系统的安全性。
Web酒店点评系统;SQL注入;跨站脚本攻击;跨站请求伪造
漏洞是指信息系统中的软件、硬件或通信协议中存在缺陷或不适当的配置,从而可使攻击者在未授权的情况下访问或破坏系统,导致信息系统面临安全风险[1]。2014年,CNVD(国家信息安全漏洞共享平台)收集新增漏洞9 163个,包括高危漏洞2 394个(占26.1%),中危漏洞6 032个(占65.8%),低危漏洞737个(占8.1%)。最新数据显示,仅2015年11月,CNVD共协调处置了2 311起涉及我国政府部门以及银行、民航等重要信息系统部门以及电信、传媒、公共卫生、敃育等相关行业的漏洞事件[2],可见对Web漏洞的研究和防范迫在眉睫。
本文设计了一个用php实现的Web酒店用户评论展示系统,基本页面展示近期用户点评,允许用户在游客状态下填写评论后发表,经系统过滤保存评论内容后在页面展示,另外选择管理员登陆,在验证账号密码后可执行对点评的删除等操作,该系统功能实现流程如图1所示。
图1 实现功能流程图
该系统的点评留言功能及登录功能在互联网上得到了广泛应用,同时也存在多处高危漏洞,这些漏洞引起的安全隐患,会暴露用户的详细信息、允许恶意用户执行任意的数据库查询,甚至允许通过远程命令行访问服务器,从而造成对Web 应用程序的破坏或用户隐私信息被窃取。本文分析漏洞出现的原理,对该酒店点评系统进行测试,改进代码,以实现能对漏洞进行防范的功能。
1 SQL注入攻击及安全防范
SQL注入(SQL Injection)攻击是指恶意用户输入用来影响被执行的SQL脚本[3]。由于Web端应用程序没有对用户输入数据的合法性进行判断,数据服务器运行恶意SQL命令后,通过和数据库交互从而获得私密信息,因此使数据库信息遭到破坏。
一种脚本注入式的攻击方式是攻击者在Web页面的输入区域,如表单的输入区域或页面请求查询的字符串,输入别有用心构造的SQL语句插入特殊字符和指令,提交后的数据会被数据服务器误认为是将要执行的指令语句。
在本酒店点评系统中,管理员需在Web应用程序的登录验证(login)页面登陆后才能对用户点评进行删除等操作, 管理员需要输入用户名(username)以及对应的密码(password)进行登录操作,应用程序通过用户提交的这两个参数来进行操作,其原理是通过查找原本建立好userstable中的用户名(username)和匹配密码(password)的结果进行授权访问,经典的SQL指令形式为
select*from userstable where username=’admin’ and password=’admin’
若攻击者给username赋值“abc’ or 1=1 -- ”,将其输入提交给服务器后,服务器将执行由其构造出来的指令,SQL指令形式变成
select*from userstable where username=’abc’ or 1=1 -- and password=’abc’
该语句中执行了两个判断,只要其中一个条件成立,则返回正确的授权,同时由于语句中的“1=1”在逻辑上是永远成立的,“--”表示后面所有的语句为注释语句,因此这语句是恒成立的,导致应用程序不能正确验证用户身份,会错误授权攻击者访问。
为了防范此类攻击方式,系统采用对输入用户名信息进行过滤的方法,其详细代码如下
Function Inputcheck()
{ if (instr(request(“$username”),”’”)>0 or instr(request(“$username”),”or”)>0) then
reponse.write””
response.end
end if
}
此段功能函数对输入的用户名当中是否含有“’”和“or”字符进行识别,若存在非法字符则返回相关提示,以防止用户恶意利用此漏洞获得管理员登录权限。
另一种攻击方式是基于当一个查询指令被拒绝后,数据库会返回包含有调试信息的错误消息,从而使攻击者可通过返回的信息得到应用程序的数据库以及漏洞参数。通常通过输入不匹配的URL进行攻击,如
正确URL:http://www.hotel.com/manage/?id =2
SQL注入:http://www.hotel.com/manage/?id =2’
此时如果应用程序返回错误信息
Select name FROM userstable WHERE id=2’
则攻击者可从返回的信息中得到:username、userstable、id字段名等私密信息从而进行更为精确的漏洞攻击。为防范此类型的漏洞攻击,需要对HTTP请求的参数进行检测,本系统中添加了一段用于过滤请求参数的代码,存储于一个公共的php文件中便于其他文件的调用,其代码如下
foreach($_POST as $post_sql>=$post_post)
{ if(is_numeric($var_getvalues))
$_POST[strtolower($post_sql)] = intval($post_post);
else
$_POST[strtolower($post_sql)] = addslashes($post_post);
}
foreach($_GET as $get_sql>=$get_get)
{ if(is_numeric($var_getvalues))
$_GET[strtolower($get_sql)] = intval($get_get);
else
$_GET[strtolower($get_sql)] = addslashes($get_get);
}?>
当用户向访问的Web页面提交参数时,通过上述代码,利用intval()与addslashes()分别对提交的数据信息$_POST和$_GET中的整形参数及字符型参数进行转换,能有效地防止SQL参数注入的攻击。
SQL注入漏洞对Web应用造成损坏巨大,同时也有相应的检查措施,分为入侵前的检测和入侵后的检测。入侵前的检测可通过手工方式,也可使用SQL注入软件,主要目的是为了预防SQL注入攻击。而对于入侵后的检测,主要是查看审计日志,SQL注入漏洞攻击成功后,会在IIS日志和数据库中留下“痕迹”。比如在Web服务器中启用日志记录,则IIS日志会记录下访问者的IP地址等信息,SQL注入通常会大量访问一个页面,通过查看日志文件的大小以及日志内容便可判断是否曾经发生SQL注入攻击[4]。
对SQL注入的防御措施,主要从检验提交信息的有效性入手,主要总结如下几个方面:限制数据输入及查询字符的长度,检测关键字和特殊字符;将用户输入的危险字符进行过滤或转义;去除代码中的敏感信息;对数据信息进行封装和加密处理;指定错误返回页面以及限制数据库的访问权限等。
2 跨站脚本攻击及安全防范
HTML是Web页面的一种基本描述语言,同时HTML中也可嵌入其他的脚本语言,比如“”。当浏览器遇到起始标签[5]。若用户填写了相关的内容提交,若没有相应的过滤,就会导致跨站脚本XSS(Cross-Site Scripting Attack)漏洞的出现[6]。
在本文的酒店点评系统中,发表点评功能对游客状态的用户开放,用户在填写点评后点击发表,随后将保存的点评展示在点评列表中,但若用户恶意输入一些脚本语言代码,例如:,而系统没有对点评内容没有过滤,点击发表评论后,系统并没有把用户输入的代码显示在点评列表上,而是已执行Java脚本语句的方式弹出消息框提示“warning!”。
[7],XSS的实现过程如图2所示。
图2 XSS漏洞攻击流程
根据HTML页面引用用户输入的形式,XSS攻击大致分为3类:存储型的XSS、反射型的XSS和基于DOM的XSS[8-9]。
存储型的XSS(stored XSS),最常检测的到漏洞出处就是类似留言、评论这种Web页面。攻击者通常直接将脚本代码输入到被攻击Web站点的表格中,当其他用户来访问这个页面时,输入的脚本并非以静态数据显示,而是作为指令代码开始执行。
唐山市21个水功能区中10个水功能区设为禁止设置入河排污口水域:大黑汀水库水源地保护区;潵河河北承德、唐山保留区;沙河河北秦皇岛饮用水源区;龙湾河河北唐山饮用水源区;泉水河河北唐山饮用水源区;陡河河北唐山饮用水源区;还乡河河北唐山饮用水源区1;引滦专线天津水源地保护区1;小青龙河北唐山农业用水区;还乡河河北唐山饮用水源区2。
反射型XSS(reflected XSS),就是将脚本文件嵌入到URL地址的CGI参数中,攻击者将链接发送给潜在的受害者;当受害者点击链接时,页面被下载,但其中的内容被嵌入在URL中的脚本修改了。在此过程中,只有用户在点击了被篡改过的链接时,页面载入过程中才执行完成。
基于DOM 的XSS攻击,其是通过修改Web页面DOM节点数据信息而形成的漏洞攻击。例如一段JavaScript代码访问一个URL请求参数并使用此信息添加到自己的页面,但这个信息未使用HTML的实体编码,就可能出现XSS漏洞。
XSS攻击所攻击的主要目标并不是Web服务器本身,而是登录网站的用户,其一般不会夺取访问Web服务器的管理权限,XSS攻击的目的是:(1)劫持用户的Web行为,监视浏览历史、表单输入、发送接受的数据,或将目标站点重新定向到钓鱼网站;(2)窃取用户Cookie,获取用户身份,从而获得对网站的操作权限;(3)目前最多的XSS蠕虫攻击,可用来打广告、刷流量、挂木马、破环网站数据等[10]。
因此,需要在发表点评的系统中加入能有效防御XSS漏洞的手段,本例采用str_replace()函数对页面的输入输出内容中的特殊字符进行编码,代码如下
FUNCTION code_filter($cMyString)
{ $cMyString = trim($cMyString);
$cMyString = str_replace(“"”,”””, $cMyString);
$cMyString = str_replace (“@