第2章 SQL注入测试 本章目标 ·寻找SQL注入 。确认SQL注入 ·自动发现SQL注入
22S0L注入攻击与防御 2.1 概述 一般通过远程测试判断是否存在SQL注入(例如,通过Internet并作为应用渗透测试的 部分),所以通常没有机会通过查看源代码来复查注入的查询结构。这导致经常需要通过推理 来进行大量测试,即“IfI see this,then this is probably happening at the back end.”。 本章从使用浏览器与Wb应用进行交互这一视角来讨论发现SQL注入问题时所涉及的技 术。我们将阐述如何证实发现的问题是SQL注入而非其他问题(如XML注入)的相关技术。最 后介绍如何将$QL注入的发现过程自动化以便提高检测简单SQL注入示例的效率。 2.2寻找S0L注入 SQL注入可以出现在任何从系统或用户接收数据输入的前端应用中,这些应用之后被用于 访问数据库服务器。本节将重点关注最常见的Wb环境。最开始我们只使用一个Web浏览器。 在Web环境中,Web浏览器是客户端,它扮演向用户请求数据并将数据发送到远程服务 器的前端角色。远程服务器使用提交的数据创建SQL查询。该阶段的主要目标是识别服务器 响应中的异常并确定是否是由SQL注入漏洞产生的。 虽然本章包含很多示例和场景,但我们仍然无法介绍所有会被发现的SQL注入。可以这 样来理解:有人教你怎样将两个数相加,但没有必要(或尝试着)将所有可能的数都相加,只要 知道怎样将两个数相加,就可以将该原理应用到所有涉及加法的场合。SQL注入也是一样的道 理。我们需要理解怎样做以及为什么这样做,剩下的就是实践问题。 我们很难访问到应用的源代码,因此需要借助推理进行测试。要理解并进行攻击,拥有一 种分析型思维模式非常重要。理解服务器响应时需要非常细心,这样才能了解服务器端正在发 生的情况。 借助推理进行测试比想象中要容易。它只是向服务器发送请求,然后检测响应中的异常。 读者可能认为寻找SQL注入漏洞是向服务器发送随机值,但在理解了攻击逻辑和基本原理之 后,您将会发现该过程简单而有趣。 2.2.1借助推理进行测试 识别$QL注入漏洞有·一种简单的规则:通过发送意外数据来触发异常。该规则包括如下 含义: ·识别Web应用上所有的数据输入。 ·了解哪种类型的请求会触发异常。 ●检测服务器响应中的异常。 就是这么简单。首先要清楚Wb浏览器如何向Web服务器发送请求。不同的应用会有不 同的表现方式,但基本原理是相同的,因为它们均处在基于Wb的环境中。 识别出应用接收的所有数据后,需要修改这些数据并分析服务器对它们的响应。有时响应 中会直接包含来自数据库的SQL错误,这时所有工作都将变得非常简单。有时要不断集中精 力以便检测响应中细微的差别
第2章SQL注入测试23 1.识别数据输入 Wb环境是一种客户端/服务器架构。浏览器(作为客户端)向服务器发送请求并等待响应。 服务器接收请求,产生响应,将其发送回客户端。很明显,双方必须存在某种方式的约定。否 则,客户端请求某些内容,服务器将不知道怎样回复。双方必须使用一种协议作为双方的约定, 这种协议就是HTTP。 我们的首要任务是识别远程Wb应用所接收的所有数据输入。HTTP定义了很多客户端可 以发送给服务器的操作,但我们只关注与寻找SQL注入相关的两种方法:GET和POST。 GET请求 GET是一种请求服务器的HTTP方法。使用该方法时,信息显示在URL中。点击一个链 接时,一般会使用该方法。通常,Web浏览器创建GET请求,发送给Wb服务器,然后在浏 览器中呈现结果。GET请求对用户是透明的,但是发送给W©b服务器的GET请求却如下所示: GET /search.aspx?text-lcd$20monitors&cat=1&num-20 HTTP/1.1 Host:www.victim.com User-Agent:Mozilla/5.0 (X11;U;Linux x86 64;en-US;rv:1.8.1.19) Gecko/20081216 Ubuntu/8.04 (hardy)Firefox/2.0.0.19 Accept:text/xml,application/xml,application/xhtml+xml, text/html:q=0.9,text/plain;q=0.8,image/png,*/*:q=0.5 Accept-Language:en-gb,en;q=0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive:300 Proxy-Connection:keep-alive 该请求在URL中发送参数,格式如下所示: ?parameterl-valuel¶meter2-value2¶meter3-value3.. 上述示例中包含三个参数:text、cat和num。远程应用将检索这些参数的值,将它们用于 事先设计好的目的。对于GET请求来说,只需在浏览器的导航栏中稍作修改即可操纵这些参 数。此外,还可以使用代理工具,稍后将进行介绍。 POST请求 POST是一种用于向wb服务器发送信息的HTTP方法。服务器执行的操作则取决于目标 URL。在浏览器中填写表单并点击Submit按钮时通常使用该方法。浏览器会完成所有工作, 下面的例子给出了浏览器发送给远程Web服务器的内容: POST /contact/index.asp HTTP/1.1 Host:www.victim.com User-Agent:Mozilla/5.0 (X11;U;Linux x86_64;en-US;rv:1.8.1.19) Gecko/20081216 Ubuntu/8.04 (hardy)Firefox/2.0.0.19 Accept:text/xml,application/xml,application/xhtml+xml, text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
24SQL注入攻击与防御 Accept-Language:en-gb,en;q=0.5 Accept-Encoding:gzip.deflate Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive:300 Referer:http://www.victim.com/contact/index.asp Content-Type:application/x-www-form-urlencoded Content-Length:129 first-Johnslast=Doe&email=john@doe.comsphone=5551234566title=Mr&country=US& comments=I$20would820like820to$20request$20information 这里发送给Wb服务器的值与GET请求的格式相同,不过现在这些值位于请求的底部。 注意: 请记住,数据如何在浏览器中呈现并不重要。有些值可能是表单中的隐藏字段,也可能是 带一组选项的下拉字段;有些值则可能有大小限制或者包含禁用的字段, 请记住,这些都只是客户端功能,我们可以完全控制发送给服务器的内容。不要将客户端 接口机制看作安全功能。 读者可能会问:如果浏览器禁止我修改数据怎么办?有两种解决办法: ·浏览器修改扩展 。代理服务器 浏览器修改扩展是运行于浏览器之上的插件,它能够实现一些附加功能。例如,针对Mozilla Firefox的Web Developer插件(https://addons.mozilla,org/en-US/firefox/.addon/6O)允许显示隐藏字 段、清除大小限制、将所选的字段转换成输入字段及其他任务。当设法操纵发送给服务器的字 段时该插件非常有用。Tamper Data(htps:/addons..mozilla.org/en-US/firefox/addon/966)是另一款 用于Firefox的有趣插件,可以使用Tamper Data查看并修改HTTP和HTTPS请求中的头和POST 参数。还有-一款是SQL Inject Me(https:/addons.mozilla.org/en-US/firefox/addon/7597),该工具借 助在HTL页面中找到的表单字段来发送数据库转义字符串。 第二种解决方案是使用本地代理。本地代理是一些介于浏览器和服务器之间的软件,如图 2-1所示。这些软件运行在本地计算机上。图2-1中给出的是本地代理所处位置的逻辑表示方式。 代 理 用户 远程服务器 图2-1代理拦截发给Wb服务器的请求 图2-1展示了如何使用代理服务器避开客户端的限制。代理负责拦截发给Wb服务器的请 求,用户可随意修改请求的内容。要实现该目标,需要完成如下两件事情: ●在自己的计算机上安装一个代理服务器 ●配置浏览器以使用代理服务器
第2章SQL注入测试25 安装用于SQL注入攻击的代理时,存在很多可选软件。其中最有名的是Paros Proxy、 WebScarab和Burp Suite,它们都可以拦截流量并修改发送给服务器的数据。这几款软件间也 存在一些差异,通常需要根据个人喜好来具体选择使用哪一款。 安装并运行代理软件之后,您需要检查代理正在侦听的端口。设置浏览器以使用代理,这 时准备工作己基本完成。根据所选浏览器的不同,设置选项会位于不同的菜单中。例如在 Mozilla Firefox中,单击Edit PreferencesAdvanced Network|Settings。. 诸如FoxyProxyt(https:/∥addons.mozilla.org/en-US/firefox/.addon/.2464)等的Firefox插件允许您 在预设的代理设置间进行切换。该功能非常有用,可为您节省不少时间。 在Internet Explorer中,可单击Tools|Internet Options|ConnectionsLan SettingsProxy Server 来访问代理设置。 运行代理软件并将浏览器指向它之后,就可以开始测试目标Wb站点并操纵发送给远程 应用的参数了,如图2-2所示。 burp suite v1.2 burp intruder repeater window help target proxy spider scanner intruder repeater sequencer decoder comparer comms alerts imtercept options history request to http://www.vctim.com.80 [127.0.0.1] forward drop intercept is on action raw params headers hex POST request to /contac/index.asp name value cookie ASPSESSIONIDSCSRA..YLEKSMTFEKQNUPICEPRBODM JUDCEHIOH new body le ody ohn remove body last Doe body email sohnedoe.com body phone 555123456 down C00e Country comments would like to reque body encoding:application/x-www-form-urlencoded 图2-2 Burp Suite拦截POST请求 图2-2展示了Burp Suite拦截POST请求并修改字段的过程。该请求已被代理拦截,用户 可任意修改其内容。修改完之后,用户应单击forward按钮,这样一来,修改后的请求将发送 给服务器。 在后面的“2.6.2确认SQL注入”一节中,我们将讨论可以将哪些类型的内容注入到参数 中以便触发SQL注入漏洞