SQL注入进阶:掌握布尔盲注和延时注入攻击技巧

数据来源

一、什么是盲注?

        盲注是指一种利用应用程序漏洞进行的攻击技术,攻击者通过在输入参数中注入恶意代码或数据来探测、提取和修改应用程序的敏感数据。它通常用于测试 Web 应用程序的安全性,并且可能导致许多安全问题,如信息泄露、远程命令执行等。

        在盲注攻击中,攻击者通常无法直接获得程序内部的敏感信息,例如程序源代码、数据库凭据等,因此需要通过不同方法构造特定的攻击载荷并提交给目标应用程序,然后观察其反馈以确定攻击的有效性和结果。

        其中,最常见的两种盲注类型是基于时间的盲注布尔盲注。基于时间的盲注会执行某些操作,并记录需要的时间(例如休眠或 CPU 利用率),这样攻击者可以使用响应时间来推断出某些答案是否正确。而布尔盲注则会利用应用程序在布尔运算时遵循真/假逻辑的特性,尝试通过构造合适的查询语句,达到从如何应答得出需要的信息的目的。

        盲注攻击风险很高,但由于它通常很难被识别和阻止,所以也成为了许多渗透测试和黑客活动中经常使用的技术。要避免盲注攻击,请确保在处理任何输入数据时都进行有效的验证、过滤和编码,尽可能使用预编译语句,以避免 SQL 注入等攻击。同时,您应该加强对应用程序的安全审计和漏洞扫描工作,定期更新并修补程序以防止恶意攻击。

二、布尔盲注

原理

        布尔盲注是指一种基于应用程序响应逻辑的盲注攻击技术,通过构造特定的查询语句,向目标应用程序提交带有恶意负载的请求,并观察程序的响应来推断出需要的敏感信息。

        在布尔盲注中,攻击者尝试修改应用程序的查询语句,以便程序在响应时反映出某些操作结果 (如真或假),从而确定某些特定答案或确认应用程序中的漏洞。例如,攻击者可能利用应用程序的错误消息来判断存在的漏洞类型、参数的数量和格式等问题。

        具体来说,在布尔盲注中,攻击者首先识别目标应用程序中可以进行注入攻击的输入参数,然后通过使用各种技术来构造特定的注入负载,例如 UNION SELECT 和 OR 运算符等,并在操作过程中进行不同的调整和实验。

        通常,攻击者需要创建一系列设计猜测值并向目标应用程序发送这些值,同时根据程序的响应情况来验证这些猜测值是否正确。攻击者还可以根据响应时间或错误消息等特征来推断结果。

        当攻击者成功地实现了一个布尔盲注攻击时,他们通常能够获得目标应用程序的敏感信息,如数据库名称、表名、字段等信息,并通过进一步攻击来获取更多的数据或特权。为了避免布尔盲注漏洞,请在处理输入时始终进行有效的验证和过滤,并使用参数化查询等技术以最大程度地消除这种类型的SQL注入攻击。

盲注函数

在进行盲注攻击时,攻击者通常会使用一些专门的函数和工具来构造有效的恶意负载并操作应用程序。以下是几个常见的盲注函数:

  1. SUBSTRING - 用于从字符串中提取指定位置的子串。例如,SUBSTRING("hello world",1,5) 返回 "hello"。
  2. RAND() - 用于生成一个随机数,并可以用于盲注攻击的时间推断技术中。例如 SELECT IF(RAND() > 0.5, 'sleep', '') 可以根据RAND()函数返回的值是否大于0.5来控制程序是否休眠。
  3. SLEEP() - 用于强制应用程序等待指定的秒数,也是盲注攻击中基于时间的盲注的实现方式之一。例如,SELECT * FROM mytable WHERE id=1 AND sleep(10),如果程序响应时间超过10秒,则说明id为1的行确实存在。
  4. LENGTH() - 用于获取字符串或二进制数据的长度。例如,SELECT LENGTH(user_name) FROM users WHERE id=1 执行后会返回用户名称的字符数目。
  5. ASCII() - 返回将字符转换为整数的 ASCII 值。例如,SELECT ASCII('A') 在多数情况下返回 65。
  6. CONCAT() - 用于将两个或多个字符串连接起来。例如,CONCAT('hello', 'world') 返回 "helloworld"。 等等。

需要注意的是,这些函数不仅可以用于盲注攻击,还经常在正常应用程序设计和开发过程中使用。在编写应用程序时,请注意务必正确验证和转义输入数据,以避免可能的安全问题。

布尔盲注流程

布尔盲注是一种基于 boolean 值运算的盲注攻击方法。攻击者需要构造恶意负载来实现修改查询语句、获取系统信息等目标。通常,布尔盲注攻击可以分为以下几个步骤:

  1. 识别可注入的参数:攻击者需要找到目标应用程序中可以进行注入攻击的输入参数,例如表单字段或 URL 参数等。通常,这些参数将通过创建它们自己的测试用例和手动编写 SQL 查询等技术来查找。

  2. 构造布尔条件查询语句:攻击者利用已知条件和未知条件构造包含真/假运算符(AND,OR)的查询字符串,并使用语句 UNION SELECT 或 SELECT,来将攻击者自己的恶意负载注入目标应用程序。

  3. 根据页面响应分析反馈结果:根据目标应用程序返回的页面内容判断是否发现安全漏洞并可以进一步进行渗透测试。如果网络流量过高或响应速度迟缓,则很可能表明存在严重的安全问题。在此过程中,攻击者可以使用作为优化工具的脚本、扫描器或代理来简化测试过程并自动处理大量待测试的请求。

  4. 推断答案:通过观察目标应用程序的响应状态,如状态码、是否出现错误消息或负载乘系统响应时间等来推断是否存在漏洞。攻击者可以根据响应速度及返回信息的种类对响应结果进行不同的重组和调整。在此过程中,攻击者也可能使用其他高级技术,例如联合注入和错误注入等方法,以获取更深入的系统信息和获得更显著的攻击成功。

需要注意的是,布尔盲注虽然实现方法比较复杂,但作为 SQL 注入漏洞攻击的一种常用方式,仍旧需要开发人员注意保障应用程序的安全性,防止应用程序被恶意攻击并遭受数据泄露或敏感信息暴露等风险。

手工盲注思路

手工盲注是一种通过手动构造 SQL 注入负载来实现攻击的技术。相比于自动化的 SQL 注入工具,手工盲注需要更多的知识和经验,并且攻击成功的概率较低。下面是一个通用的手工盲注流程:

  1. 识别可注入参数:首先需要找到应用程序中可能存在 SQL 注入漏洞的输入参数,比如 URL 参数、表单字段等。

  2. 确定注入点:在确认了可注入参数后,就需要确定具体注入点的位置,即找到恶意负载可以被注入的地方。

  3. 获取系统信息:从注入点开始构建不同的 SQL 查询语句,观察目标系统的响应行为,进而推断出系统内部的结构、版本号等信息。

  4. 判断目标数据库管理系统类别:通过获取系统信息获得目标系统所使用的数据库类型,从而针对不同类型数据库的差异性进行进一步攻击。

  5. 构造 SQL 注入语句并发送负载请求:根据已获得的数据结构构造相应的恶意负载,并与正常请求混合在一起,向目标应用程序提交。

  6. 分析反馈结果:观察目标应用程序返回的页面内容来判断是否发现安全漏洞,如果存在,则确认漏洞类型、影响范围并寻找后续攻击路径。

  7. 利用 SQL 注入漏洞:根据已发现的漏洞并通过手工或脚本编写恶意语句来利用目标漏洞,如获取系统管理员密码、删除表等恶意行为。

        需要注意的是,在进行手工盲注时,一定要谨慎处理敏感信息和数据,确保没有泄露数据或不当使用数据。同时,建议应用程序开发人员在设计开发时要关注此类安全问题,防止恶意攻击进而破坏整个系统以及用户信息。

下面简要介绍手工盲注的步骤):

1.判断是否存在注入,注入是字符型还是数字型

2.猜解当前数据库名

3.猜解数据库中的表名

4.猜解表中的字段名

5.猜解数据

下面用DVWA靶场进行演示

  

LOW:

代码:

<?php 

if( isset( $_GET[ 'Submit' ] ) ) { 
    // Get input 
    $id = $_GET[ 'id' ]; 

    // Check database 
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; 
    $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors 

    // Get results 
    $num = @mysql_numrows( $result ); // The '@' character suppresses errors 
    if( $num > 0 ) { 
        // Feedback for end user 
        echo '<pre>User ID exists in the database.</pre>'; 
    } 
    else { 
        // User wasn't found, so the page wasn't! 
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); 

        // Feedback for end user 
        echo '<pre>User ID is MISSING from the database.</pre>'; 
    } 

    mysql_close(); 
} 

?> 

        可以看到,Low级别的代码对参数id没有做任何检查、过滤,存在明显的SQL注入漏洞,同时SQL语句查询返回的结果只有两种,可以自行输入:-1和1进行测试

`User ID is MISSING from the database.`(`数据库中缺少用户ID`)

‘与‘

User ID exists in the database.(数据库中存在用户ID),因此这里是SQL盲注漏洞。

注入方法一:布尔盲注

输入:1' and 1=1 #,显示存在:(and 是与的意思)

输入1' and 1=2 #,显示不存在:

 结论:存在字符型的盲注。

然后猜解数据库名:输入1" and length(database())=4 #,显示存在:说明长度为4

其他用法可以在靶场自己尝试,可以参考:DVWA之SQL注入(盲注)_dvwa sql盲注_风吹千里的博客-CSDN博客

 DVWA-sql注入(盲注) - N0r4h - 博客园

注入技巧

        布尔盲注(Boolean-based Blind Injection)是一种通过构造带有布尔条件的 SQL 注入负载实现的攻击技术,通过判断 SQL 查询结果是否为真或者假,得出 SQL 语句中存在漏洞的结论。以下是一些常用的布尔盲注技巧:

  1. 利用 IF() 函数:IF() 函数可以根据条件判断是否满足某个条件,并返回不同的结果。例如,在 MySQL 中,可以使用 SELECT IF(1=1, 'true', 'false') 这样的语句来判断 1 是否等于 1,并返回 true 或 false。

  2. 利用 EXISTS() 函数:EXISTS() 函数可以判断某个值是否存在于查询结果中。例如,在 SQL Server 中,可以使用 SELECT 'true' WHERE EXISTS(SELECT * FROM Users WHERE Name='admin' AND Passwd='123456') 这样的语句来判断是否存在用户名和密码均为 admin 和 123456 的用户,并返回 true 或 false。

  3. 利用逻辑运算符:逻辑运算符包括 AND、OR 和 NOT 等,可以用于组合多个条件判断语句。例如,在 Oracle 中,可以使用 SELECT 'true' FROM dual WHERE 1=1 OR 1=2 来判断是否存在某条记录,并返回 true 或 false。

        需要注意的是,在进行布尔盲注时,攻击者需要了解目标数据库类型,从而知道该数据库支持哪些函数和操作符,根据实际情况选择合适的技巧。同时,防范布尔盲注攻击的关键在于应用程序设计人员需要充分了解 SQL 注入的原理和常见攻击方式,并采取安全措施保障系统的安全性。

三、延时注入 

        延时注入是一种盲注的技术,它利用了SQL语句返回结果的速度,使得攻击者可以通过构造特殊的负载延迟SQL语句的执行时间来判断是否存在漏洞并进一步进行攻击。常见的延时注入包括 sleep 命令或者 waitfor delay 命令等。

        实际上,延时注入和普通的 SQL 注入十分相似,不同之处在于其核心思想是利用目标系统响应时间的差异性来推断出敏感信息。攻击者通常需要找到合适的延时,并根据系统对于超时的行为进行调整,防止请求超时或者判断失误的情况发生。同时,攻击者还需要持续不断地通过延时时间、回显或响应码等信息判断是否有漏洞被发现。

针对延时注入攻击,防护方面也可以采取一些方法来保障系统安全:

  1. 对输入进行严格限制:在应用程序设计时,需要对用户提交的数据进行验证及过滤,以避免存在可利用的输入注入点。

  2. 选择安全的编程语言和数据库服务:开发人员需要选择具有良好安全性的编程语言或数据库服务,并严格按照安全规范进行开发与管理。

  3. 使用预编译的参数化查询:如果需要动态组织 SQL 语句,应当使用参数化查询等技术执行 SQL 查询,而不是通过字符串拼接的方式完成 SQL 语句的构造。

  4. 监测工具、日志审计、异常及时报警:对于应用程序的访问,运维人员可以使用监控工具和系统日志来实现实时监测,如有异常情况及时向相关人员发送报警信息并及时处理。

延时注入技巧 

        延时注入是一种通过构造带有延迟的 SQL 注入负载实现的攻击技术。其核心思想是在目标系统执行 SQL 语句的过程中,增加一些额外的等待时间,使得攻击者能够得到更准确的信息并进一步进行攻击。以下是一些常用的延时注入技巧:

  1. 利用 SLEEP() 函数:SLEEP() 函数可以使 SQL 查询线程暂停一段时间,可以使用它来模拟长时间的数据库查询操作。例如,在 MySQL 中,可以使用 SELECT * FROM table WHERE id=1 AND SLEEP(5) 这样的语句来让查询线程暂停 5 秒钟。

  2. 利用 WAITFOR DELAY 命令:WAITFOR DELAY 命令是 SQL Server 中专门用于延时的命令,使用该命令可以让 SQL 查询线程等待指定的时间再返回结果。例如,WAITFOR DELAY '0:0:5' 就是让查询线程等待 5 秒钟。

  3. 利用 IF() 函数:IF() 函数可以根据条件判断是否进行延迟,如果条件为真则模拟长时间查询操作,否则立即返回结果。例如,在 MySQL 中,可以使用 SELECT IF(1=1, SLEEP(10), 'false') 这样的语句来让查询线程等待 10 秒钟。

  4. 利用 TIME_OUT 值:有些数据库管理系统允许设置查询的时间限制,例如 Oracle 中的 SQLNET.OUTBOUND_CONNECT_TIMEOUT 参数。攻击者可以通过构造负载模拟超时场景,从而得以判断系统漏洞并进一步进行注入。

需要注意的是,在进行延时注入时,攻击者需要综合考虑目标数据库类型、网络状况、系统响应速度等因素,并根据实际情况调整延时时间,避免过长或过短的时间影响攻击效果。同时,建议应用程序设计人员在开发时要关注此类安全问题,采取有效的措施防止恶意攻击的发生。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当使用Burp Suite进行SQL注入漏洞测试时,布尔盲注是一种常用的技术之一。布尔盲注是一种盲注攻击技术,它通过在SQL查询中使用布尔逻辑来确定数据库中的信息。以下是一些步骤来测试布尔盲注漏洞: 1. 配置Burp Suite:首先,确保已正确配置Burp Suite以拦截和修改HTTP请求和响应。您可以在Burp Suite的Proxy选项卡下设置代理,并根据需要配置浏览器或应用程序以使用该代理。 2. 找到注入点:使用Burp Suite的Spider或Repeater工具来找到潜在的注入点。这可以是URL参数、表单字段或Cookie值等。 3. 构造注入语句:使用布尔盲注技术,构造适当的注入语句来测试漏洞。例如,您可以尝试通过在WHERE子句中使用布尔逻辑来判断条件是否为真或假来确定数据库中的信息。 4. 检测响应差异:发送经过注入处理的请求,并观察响应是否有所不同。如果响应正常,可能意味着注入失败;如果响应出现错误或有其他差异,可能意味着注入成功。 5. 使用布尔逻辑验证条件:根据不同的响应,使用布尔逻辑来验证条件是否为真或假。例如,您可以通过在注入语句中使用AND或OR运算符来检查条件。 6. 执行进一步的测试:根据验证的结果,您可以进一步探测和利用漏洞。使用Burp Suite的其他工具和插件来自动化和加快测试过程。 请注意,在进行任何安全测试之前,确保您已获得适当的授权,并仅在合法范围内进行测试。此外,始终遵循道德黑客和安全测试的最佳实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗蛋的博客之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值