测试SQL注入漏洞

SQL注入攻击对依赖数据库后端生成动态内容的Web应用程序构成巨大风险。 在这种类型的攻击中,黑客操纵Web应用程序,试图将他们自己的SQL命令注入数据库发出的命令。 有关示例,请参阅文章SQL注入数据库攻击。 在本文中,我们来看看几种测试Web应用程序的方法,以确定它们是否容易受到SQL注入攻击。

自动SQL注入扫描

一种可能性是使用自动Web应用程序漏洞扫描程序,如HP的WebInspect,IBM的AppScan或Cenzic的Hailstorm。 这些工具都提供了简单的自动化方法来分析您的Web应用程序,以发现潜在的SQL注入漏洞。 但是,它们非常昂贵,每个座位的价格高达25,000美元。

手动SQL注入测试

什么是糟糕的应用程序开发人员要做的? 实际上,您可以运行一些基本测试来仅使用Web浏览器评估Web应用程序的SQL注入漏洞。 首先,请注意:我描述的测试仅查找基本的SQL注入缺陷。 他们不会检测到先进的技术,并且使用起来有些繁琐。 如果您可以负担得起,请使用自动扫描仪。 但是,如果你无法处理这个价格标签,手动测试是一个很好的第一步。

评估应用程序是否易受攻击的最简单方法是尝试无害的注入攻击,如果攻击成功但实际上并不会损害数据库,但会为您提供证据证明您需要纠正问题。 例如,假设您有一个简单的Web应用程序,该应用程序在数据库中查找个人并提供联系信息。 该页面可能使用以下URL格式:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike

我们可以假定这个页面执行数据库查找, 使用类似下面的查询

SELECT phone FROM directory WHERE lastname ='chapple'and firstname ='mike'

让我们试验一下。 通过上面的假设,我们可以对测试SQL注入攻击的URL进行简单更改:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1

如果Web应用程序没有得到适当的SQL注入保护,它只是将这个虚假的名字插入到它对数据库执行的SQL语句中,导致:

选择手机从目录WHERE lastname ='chapple'和firstname ='mike'AND(从虚假选择计数(*))> 0或'1'='1'

您会注意到上面的语法与原始URL中的语法稍有不同。 我冒昧地将它们的ASCII编码变量转换为ASCII码,以便更容易地遵循该示例。 例如,%3d是'='字符的URL编码。 我也为类似的目的添加了一些换行符。

评估结果

当您尝试使用上面列出的URL加载网页时,测试会出现。 如果Web应用程序运行良好,则会在将查询传递到数据库之前从输入中去除单引号。 这只会导致对包含一堆SQL的名字的人进行奇怪的查找! 您会看到类似于下面的应用程序的错误消息:

错误:未找到名称为mike + AND +的用户(从+假选择+ count(*)+)+%3e0 + OR + 1%3d1 Chapple!

另一方面,如果应用程序容易受到SQL注入攻击,它将直接将该语句传递给数据库,从而产生两种可能性之一。 首先,如果你的服务器有详细的错误消息(你不应该这么做!),你会看到类似这样的东西:

Microsoft OLE DB Provider for ODBC驱动程序错误'80040e37'[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称'假'。 /directory.asp,第13行

另一方面,如果您的Web服务器不显示详细的错误消息,则会出现更通用的错误,例如:

内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求。 请联系服务器管理员,告知错误发生的时间以及可能导致错误的任何事情。 有关此错误的更多信息可能在服务器错误日志中可用。

如果您收到上述两个错误之一,那么您的应用程序很容易受到SQL注入攻击! 您可以采取一些措施来保护您的应用程序免受SQL注入攻击,其中包括: