扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本文中,主要探讨Web应用程序的安全性,主要包括漏洞攻击者如何利用不安全的Web应用程序来危害整个服务器或者破坏一个网站、以及开发人员如何避免引入这些漏洞。主要介绍业界几个需要被着重考虑的Web应用程序的安全问题:SQL注入、表格和脚本以及Cookies和会话管理。
SQL(结构化查询语言)是基于美国国家标准学会(ANSI)标准,并作为共同的语言与数据库通信。每个数据库系统增加了一些专有功能到基本的ANSI SQL。
SQL注入是一门将制作好的SQL注入用户输入字段的一种技术,它是网页形式的一部分——用来绕过自定义登录到网站。然而,SQL注入也可以用于登录或者接管一个网站,因此要确保其能防止攻击很重要。
开发人员和管理员可以采取许多不同的步骤解决SQL注入的问题。以下是为开发者提供的解决方案:
· 过滤的所有输入字段单引号(' ),以防止未经授权的登录。
· 过滤器SQL命令的所有输入字段,如插入,选择,工会,删除和exec ,以保护服务器操作。 (请确保操作是在过滤单引号后进行)
· 限制输入字段长度(这将限制攻击者的选择),并用服务器端脚本验证输入长度。
表1 常见的攻击者攻击SQL服务器储存过程
存储过程 |
用处 |
xp_cmdshell |
执行数据库电脑操作系统的外部命令 |
xp_sendmail |
从数据库电脑发送一封邮件 |
xp_regaddmultistring xp_regdeletekey xp_regdeletevalue xp_regenumkeys xp_regenumvalues xp_regread xp_regremovemultistring xp_regwrite |
控制注册管理的各项因素 |
xp_servicecontrol |
启动,停止和暂停服务。可用于攻击者停止关键服务或者激活可被利用的服务,如Telnet服务器服务。 |
· 使用选项来过滤“转义字符” (用于注入SQL代码,比如单引号) ,如果该数据库提供了该功能。
· 除了Web 服务器,将数据库在不同的计算机的Web服务器上。一旦数据库遭到黑客攻击,也很难攻击到Web服务期。
· 限制的服务器端脚本的用户权限。从服务器端脚本中记录到数据库的通常的做法是使用管理用户,但这可能同事也让攻击者趁机运行需要管理用户的数据库任务(如修改表或运行存储过程) 。所以用最小的用户权限分配来达到此目的。
· 删除所有不必要的扩展存储过程来限制攻击者的可能性。
· 将数据库放置到一个单独的空间(在防火墙后面) ,与Web容器和应用服务器相隔离。
不同于开发商,管理员没有代码的控制权,不能代表程序员产生变化。然而管理员可以通过运行一些测试,并确保代码安全来降低风险:
· 确保Web服务器给返回一个自定义错误页。这样一来,服务器将不会返回SQL错误,这将使攻击者更难获得SQL数据。(自定义错误页面不应该包含任何可能有助于攻击者的信息,不同于常规将返回部分SQL的错误页面。)
· 只部署从Web服务器分离数据的Web应用程序。
· 聘请外部机构对Web服务器上执行穿透测试,并寻找SQL注入攻击。
· 使用一个专用的自动扫描设备来探索由程序员的失误导致的SQL注入漏洞。
· 部署安全解决方案来验证用户输入并过滤SQL注入企图。
窗体用于允许用户输入,但也可以用来管理会话,并在会话内传输的重要数据(如用户或会话标识符)。攻击者可以暴露嵌入在创窗口中的数据,并通过Web应用暴露其他用户信息,或以较低的价格在电子商务中进行交易。3种暴露形式如下:
· 禁用客户端脚本
· 在URL中传递参数
· 通过隐藏字段传递参数
一些开发人员使用客户端脚本来验证各种方式输入字段:
· 限制输入字段的大小
· 禁止某些字符(如单引号)
· 执行其他类型的验证(这些可以具体到每个站点)
通过禁用客户端脚本( JavaScript或VBScript)中,此验证可轻松绕过。开发人员应该在服务器端验证所有字段。这可能需要服务器上的额外资源。
窗口有两种方法来传递数据: post和get 。 post命令。在内容流发送数据和get命令在URL中发送数据。攻击者可以利用get命令来发送无效或不正确的数据,或发送恶意代码。
例如,假设我们有这样的形式:
...
<form action="login.asp" method="get">
<p>Username:<input type=text name="username" /></p>
<p>Password:<input type=password name=password /></p>
<p><input type="submit" name="submit" value="login" /></p>
</form>
...
让我们假设用户输入someusername作为用户名,somepassword为密码。浏览器会被重定向到这个URL
http://thesite/login.asp?username=someusername?password=somepassword
攻击者可以通过简单地修改URL的数据(利用此类型的URL在浏览器的地址栏)。这个方法可以用在电子商务网站来改变项目的价格。例如,看看下面的网址:
http://somesite/checkout.asp?totalprice=100
攻击者可以简单地改变“TOTALPRICE”的值,并执行检出有以较低的价格比之意。这可以简单地通过改变这样的URL来完成:
http://somesite/checkout.asp?totalprice=50
Web应用程序将执行检验,但总价为50美元(代替了100美元)。
另一种情况是,在登录后,用户识别正在使用GET发送,让攻击者修改它,并在另一个用户的名义执行操作。以下网址就是一个例子
http://somesite/changeuserinfo.asp?user=134
攻击者可以更改“用户”的值,并当存在用户的时候获得该用户的数据。
POST在发送数据的时候使用的是HTTP命令。不同于get,这种方法不会显示在URL中的数据,但它也更容易被利用。考虑以下表格:
... <form action="checkout.asp" method="post"> <input type="hidden" name="UserID" value="102" /> <p><input type="submit" name="submit" value="checkout" /></p> </form> ...
这种形式使用POST传输用户的标识符。攻击者可以保存HTML ,修改用户ID字段,修改检测路径(链接到原来的网站,如:
<form action="http://example/checkout.asp"…), ,运行(通过双击HTML页面的局部修改版),并提交修改后的数据。
开发人员可以使用GUID 或通过加密的信息,修改管理会话信息隐藏起来的数据来阻止攻击者。
· 管理会话信息: 大多数服务器端脚本技术允许开发人员来存储用户的会话信息,这是节省特殊会话信息最安全的方法,因为所有的数据都存储在本地Web服务器计算机上。
· 使用GUID:全局唯一标识符或GUID是一个128位的随机生成的数字具有2128的可能值。GUID可以作为用户标识符被Web应用程序程序员使用。 假设一个Web服务器有40亿用户(大约232 ,远远超过了上网人数),这意味着平均每个用户有296可能值(2128 /232 = 296 )。由于296接近于7后面28个0,攻击者就没有机会猜测,访问正确的GUID 。
· 对数据进行加密:开发人员可以加密通过数据,而不是用明文通过数据。这些数据应该用主密钥加密(仅在Web服务器上储存的对称密钥用于储存客户端数据) 。如果攻击者试图修改加密数据,客户端将检测到有人篡改数据。
值得注意的是:切勿使用用户的信息衍生信息作为隐藏的标识符,如用户名MD5 hash。攻击者会尝试找到这样的快捷方式,并暴露它们。
Web会话根据不同的服务器端脚本技术有不同的实现方式,但一般当用户输入该网站它们就会启动,并且当用户关闭浏览器或会话超时它们就会终止。会话用于跟踪用户的活动,诸如用户加入商品到购物车中,该网站通过使用会话标识符跟踪商品进度。
会话使用cookie(由网站每个站点或每个页面发送的数据,由用户的浏览器存储)。每次用户访问Web站点时就发送了一个cookie,浏览器会发送 cookie返回到该网站。(虽然Cookie可以被用来跟踪用户的上网行为和被认为是一个主要的隐私威胁,但他们仍然是会话管理的最佳媒介。 )会话使用Cookie来识别用户,并以积极的会话标识符配对。
攻击者可以滥用会话和cookie,下面部分将处理各种风险:
· 会话盗窃
· 通过发送数据到其他用户管理会话
· Web服务器的cookie的攻击
· 保护会话
假设一个用户在登录到使用会话的网站。该网站作为验证过标记会话并允许身份验证的用户浏览安全区域。运用post或get来保存弱会话标识符或其他相关的 识别数据(如电子邮件地址)不是最好的选择。取而代之的是,网站可以使用cookie命令来保存敏感数据,但攻击者也可以攻破。服务器端的cookie是 另一种选择。
让我们假设网站使用电子邮件地址作为识别数据。之后,用户必须登录后,系统才会发送给浏览器一个包含用户的电子邮件地址的cookie。对于每一个用户将 访问的页面,浏览器将发送包含用户E-mail地址的cookie。该网站会检查Cookie中的数据,并允许用户访问通过许可证的网页。
攻击者 可能修改在cookie中的数据。然而,假设cookie包含someemail@site.com ,我们每次访问网站的时候就可以自动访问限制区域。如果攻击者将他cookie中的E- mail地址(位于他的计算机上)改为someotheremail@site.com ,下一次攻击者访问站点时,他就会被默认为是该用户 ,允许他访问用户的数据。
有些用户禁用cookies(保护自己的隐私),这表明也不允许会话管理(其需要Cookies)。除非该网站使用的是安全性较低方法来管理会话,跟踪用户的唯一方法是通过使用IP地址作为识别码。然而,这种方法有很多问题:
· 有些用户通过浏览网络地址转换(NAT),如企业用户,它们将共享一个或有限数量的IP地址。
· 有些用户上网通过匿名代理,他们将分享这个代理的IP地址(虽然有些代理通过发送客户端的地址来允许Web站点使用它的会话管理)。
· 有些用户使用拨号连接和共享一个IP地址区,这意味着当用户断开连接时,下一个连接的用户将得到该IP地址。(这个问题可以用一个短的IP超时来解决,在时间到期之后,IP地址不会被链接到一个会话。)
确保会话跟踪的最好方法是使用一个难以猜测的标识符,来确定是否是来自用户的数据,如加密字符串或GUID ,并将该标识符链接到用户的IP地址。以防多个用户共享一个IP地址,会话标识符可用于区分它们。
此外,短的超时时间可以在限制的时间用完以后,删除活动会话。这表明,如果用户不正常关闭浏览器(如在一台计算机或浏览器崩溃的情况下),该会话由服务器关闭。
攻击者通过专用软件打开很多连接,使用cookies管理来耗尽Web服务器的资源。由于当一个浏览器关闭时,该软件不会发送“关闭”事件,该会话不会被删除直到超时。在此期间,该会话的信息被保存或者在存储器中或硬盘驱动器,浪费资源。
解决这个问题的方法是配置防火墙,以便它不容许更大于每秒特定数目的连接,这将阻止攻击者启动无限数量的连接。
有些攻击是不属于任何特定类别的一部分,但他们仍然对Web应用程序构成显著风险。其中易损坏的脚本,尝试强制性登录,和缓冲区溢出。
有人公开使用的脚本(这在本质上是等同于Web应用程序)包含错误,允许攻击者查看或修改文件,甚至接管Web服务器的计算机。找出Web服务器是否包含 这样的脚本最好的方法是运行一个漏洞扫描器,不管是免费的或商用的。如果找到这样一个脚本,它会被更新(更新为不容易受攻击的版本)或被其他脚本替代。
攻击者可以尝试使用字典进行强制性登录(一个标准的Web登录或自定义的ASP)。有许多的打击这种强制性攻击的方法:
· 限制每个IP地址的每秒连接数(在防火墙级别或服务器端脚本级别进行定义)
· 强制用户选择包含大写和小写字母和数字的高安全性密码
缓冲区溢出可以用来获得对Web服务器的控制。攻击者发送大量包含汇编代码的输入,如果脚本存在漏洞,字符串会被执行,并且通常运行一个木马程序,这将允许攻击者接管计算机。
Web应用程序比客户端应用程序更难保证安全性,因为它不像Web服务器有四,五个主要供应商的Web服务器,它 有大量的Web应用程序和自定义脚本数量,而且每个都可能包含潜在的漏洞。对于开发人员来说,确保应用程序安全的最佳方法是使用建议的安全措施和可以扫描代码的软件,并提醒用户潜在的安全问题。管理员需要定期扫描其Web站点中的漏洞。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者