sql盲注之二进制注入
二进制盲注(Binary Blind Injection)是一种特殊的SQL注如技术,它结合了盲注和二进制注入的特点。在这种公鸡中,公鸡者无法直接看到SQL查询的结果,因此他们需要通过其他方式来推断数据库的响应。二进制盲注通常涉及到将二进制数据插入到SQL查询中,并通过观察应用程序的行为来推断注入是否成功。
原理分析
二进制盲注的原理在于利用数据库引擎对二进制数据的处理方式,以及应用程序对查询结果的处理方式。由于是盲注,公鸡者无法直接看到查询结果,因此他们需要依赖于应用程序的其他行为,如页面渲染时间、错误消息或者特定功能的触发与否。
利用方式
公鸡者通常会采取以下步骤来进行二进制盲注:
- 识别注入点:公鸡者首先需要找到一个可能存在SQL注如的输入点,如搜索框、登录表单等。
- 构造恶意SQL语句:公鸡者构建一个恶意的SQL语句,该语句包含二进制数据,用于测试或提取信息。
- 编码恶意SQL语句:公鸡者将这个SQL语句转换成二进制格式,可能是通过十六进制编码或其他编码方式。
- 注入并观察响应:公鸡者将编码后的二进制数据插入到输入点,并观察应用程序的响应。这可能包括页面加载时间的变化、特定错误消息的出现或者特定功能的触发。
- 分析响应:公鸡者根据应用程序的响应来推断注入是否成功,以及可能的数据库信息。
示例Payload
假设我们有一个搜索功能,公鸡者怀疑它存在SQL注如漏动,并且是盲注类型。公鸡者可能会使用以下步骤来测试和利用这个漏动:
- 测试注入点:公鸡者可能会发送一个简单的测试payload,如
' OR '1'='1
,看看是否会导致应用程序的行为发生变化。 - 构造二进制盲注payload:如果测试成功,公鸡者可能会构造一个更复杂的payload来提取信息。例如,为了确定数据库名的长度,公鸡者可能会使用以下payload:
' AND LENGTH(DATABASE())>N--
这里的N
是一个数字,公鸡者会逐个尝试不同的N
值,直到找到正确的数据库名长度。
- 编码payload:如果应用程序只允许特定的字符集,公鸡者可能会将payload编码为二进制格式。例如,将上面的payload编码为十六进制:
%27%20AND%20LENGTH(DATABASE())%3E0%23
- 注入并观察响应:公鸡者将编码后的payload发送到搜索框,并观察应用程序的响应。如果数据库名的长度确实大于0,应用程序可能会表现出不同的行为。
- 分析响应:公鸡者根据应用程序的响应来推断数据库名的长度,并继续构造payload来提取更多信息。
请注意,上述payload仅为示例,实际情况下公鸡者可能会使用更复杂的技术和payload来绕过安全措施。
sql盲注之ASCII注入
在SQL盲注公鸡中,ASCII注入是一种常见的技术,它利用ASCII编码来逐个字符地猜测和提取数据库中的信息。由于是盲注,公鸡者无法直接看到SQL查询的结果,因此他们需要通过观察应用程序的响应来推断注入是否成功。
原理分析
ASCII注入的原理在于利用ASCII编码来构造SQL语句,以便逐个字符地提取信息。公鸡者会构造一系列的SQL语句,每个语句都尝试猜测某个字符的ASCII值。通过观察应用程序的响应(如页面渲染时间、错误消息或特定功能的触发),公鸡者可以推断出哪些ASCII值对应于有效的字符。
利用方式
公鸡者通常会采取以下步骤来进行ASCII盲注:
- 识别注入点:公鸡者首先需要找到一个可能存在SQL注如的输入点,如搜索框、登录表单等。
- 构造SQL语句:公鸡者构建一个SQL语句,该语句包含一个条件判断,用于比较猜测的ASCII值与实际值。
- 注入并观察响应:公鸡者将构造好的SQL语句注入到输入点,并观察应用程序的响应。这可能包括页面加载时间的变化、特定错误消息的出现或者特定功能的触发。
- 分析响应:公鸡者根据应用程序的响应来推断注入是否成功,以及可能的数据库信息。
示例Payload
假设我们有一个搜索功能,公鸡者怀疑它存在SQL注如漏动,并且是盲注类型。公鸡者可能会使用以下步骤来测试和利用这个漏动:
- 测试注入点:公鸡者可能会发送一个简单的测试payload,如
' OR '1'='1
,看看是否会导致应用程序的行为发生变化。 - 构造ASCII盲注payload:如果测试成功,公鸡者可能会构造一个更复杂的payload来提取信息。例如,为了确定数据库名的第一个字符的ASCII值,公鸡者可能会使用以下payload:
' AND ASCII(SUBSTRING((SELECT database()), 1, 1)) > N--
这里的N
是一个数字,代表一个ASCII值。公鸡者会逐个尝试不同的N
值,直到找到正确的ASCII值。
- 注入并观察响应:公鸡者将构造好的payload发送到搜索框,并观察应用程序的响应。如果数据库名的第一个字符的ASCII值确实大于
N
,应用程序可能会表现出不同的行为。 - 分析响应:公鸡者根据应用程序的响应来推断数据库名的第一个字符的ASCII值,并继续构造payload来提取更多信息。
请注意,上述payload仅为示例,实际情况下公鸡者可能会使用更复杂的技术和payload来绕过安全措施。
练习
这两个payload都可以,用or和and都可以用and就是用真条件,用or就是假条件。
在bp里跑一下,用数字和狙击手模式
跑的结果
使用Burp Suite进行数字爆破是一种常见的技术,特别是在处理基于数字的认证系统或密码时。以下是使用Burp Suite进行数字爆破的一般步骤:
步骤1:捕获请求
首先,你需要使用Burp Suite的代理功能捕获包含数字参数的HTTP请求。例如,这可能是一个登录请求,其中用户名和密码都是数字。
- 启动Burp Suite,并确保代理监听器已开启。
- 配置浏览器或其他客户端工具,使其通过Burp Suite代理发送请求。
- 执行一个包含目标数字参数的请求。
步骤2:重放请求
在Burp Suite的“Proxy”选项卡中,你会看到捕获的请求。选择这个请求,并将其发送到“Repeater”模块进行进一步操作。
步骤3:设置爆破参数
在“Repeater”模块中,选择你要爆破的数字参数。你可以通过手动输入不同的数字来测试不同的值。
步骤4:自动化爆破
如果你需要测试大量的数字组合,可以使用Burp Suite的“ Intruder”模块来自动化这个过程。
- 将捕获的请求从“Proxy”或“Repeater”模块发送到“Intruder”模块。
- 在“Intruder”模块中,设置公鸡的类型(如“Sniper”、“Battering Ram”、“Pitchfork”或“Cluster Bomb”)。
- 定义你的字典文件,该文件包含你想要测试的所有数字组合。
- 开始公鸡,Burp Suite将自动发送请求并记录响应。
步骤5:分析结果
在“Intruder”模块的结果窗口中,你可以查看每种数字组合的响应代码、响应时间和响应内容。通过分析这些结果,你可以确定哪个数字组合是正确的。
注意事项
- 进行数字爆破可能需要大量时间和计算资源,特别是当数字组合的数量非常大时。
- 在进行爆破公鸡之前,请确保你有合法的权限,否则这种行为可能被视为非法入侵。
- 为了避免被目标网站封禁,你可能需要调整公鸡的速度,或者使用代理池来分散请求。
示例
假设我们要爆破一个四位数字的密码。我们可以按照以下步骤操作:
- 捕获包含密码参数的HTTP请求。
- 将请求发送到“Repeater”模块,并手动尝试一些密码组合。
- 将请求发送到“Intruder”模块,并设置公鸡类型为“Sniper”。
- 定义字典文件,该文件包含所有可能的四位数字组合。
- 开始公鸡,并分析结果以找出正确的密码。
插一段题外
这是一个csdn的博主
链接
burpsuite爆破密码(含验证码)_burpsuite暴破数字-CSDN博客
密码是五位数字,所以想着爆破,但在burpsuite抓包后发现,每次登录,验证码都会改变,而且验证码不可以为空。这时就要去设置macros,具体设置方法
切换到 Burpsuite 的 Project options 选项卡,点击Macros下的add按钮
注意:爆破时要设置一个线程,多线程可能会爆破不出来。
在Burp Suite中进行爆破公鸡时,你可以通过设置线程数来控制公鸡的速度和并发性。线程数决定了同时运行的公鸡线程的数量,这会影响公鸡的效率和服务器负载。以下是如何在Burp Suite中设置一个线程的具体步骤:
步骤1:打开“Intruder”模块
在Burp Suite的顶部菜单栏中,点击“Intruder”选项卡,进入“Intruder”模块。
步骤2:配置公鸡
在“Intruder”模块中,有五个主要的配置选项:公鸡名称、公鸡类型、位置、字典和线程。
步骤3:设置线程数
在“线程”选项卡中,你可以设置线程数。默认情况下,线程数可能已经设置为一个适当的值,但你可以根据需要进行调整。
步骤4:保存设置并开始公鸡
设置完线程数后,点击“Start attack”按钮,开始爆破公鸡。
这段SQL查询语句的目的是尝试获取数据库中的第一个表名。它使用了多种方法来绕过某些安全限制,例如字符编码转换、字符串长度检查和注释符号的使用。
以下是对每个查询的解释:
dwwa
这部分看起来像是输入错误或者无关的文本。1' and (select count(table_name) from information_schema.tables where table_schema=database())=1
这个查询试图通过比较表中的表数量是否为1来执行条件判断。如果表的数量确实为1,那么这个条件将为真,否则为假。0' or (select count(table_name) from information_schema.tables where table_schema=database()$=1$ #
这个查询使用了一个错误的注释符号($
),并且试图通过逻辑或操作符(or
)来执行条件判断。由于语法错误,这个查询将无法执行。0' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=1#
这个查询试图通过比较第一个表名的长度是否为1来执行条件判断。如果表名的长度确实为1,那么这个条件将为真,否则为假。1' and substr(bin acsii substr('select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)=1#
这个查询试图通过比较第一个表名的第一个字符的ASCII值是否为1来执行条件判断。如果该字符的ASCII值确实为1,那么这个条件将为真,否则为假。
需要注意的是,这些查询都存在潜在的安全问题,因为它们可能被用于SQL注如公鸡。在实际环境中,应该采取适当的措施来防止此类公鸡,例如使用参数化查询或预编译语句。
ASCII(substr(user(),1,1))
这段代码是一个SQL注如的例子,它用于在数据库中提取信息。下面是对这段代码的详细解释:
user()
:这是一个MySQL函数,它返回当前数据库连接的用户名。在SQL注如的上下文中,公鸡者可能会使用这个函数来了解他们正在以哪个用户的身份执行查询。substr(user(), 1, 1)
:substr
是一个字符串截取函数,它接受三个参数:要截取的字符串、起始位置和截取的长度。在这个例子中,它从user()
返回的用户名字符串中截取第一个字符。ASCII(substr(user(), 1, 1))
:ASCII
是一个函数,它返回给定字符的ASCII码值。在这个例子中,它将截取的用户名字符串的第一个字符转换为其对应的ASCII码值。
综合起来,这段代码的效果是获取当前数据库连接的用户名的第一个字符,并将其转换为ASCII码值。在SQL注如公鸡中,公鸡者可能会使用这样的代码来逐步提取数据库的信息,比如用户名、密码、数据库结构等。通过这种方式,公鸡者可以了解系统的安全性,并可能进一步利用这些信息进行更深入的公鸡。
请注意,讨论这些公鸡技术的目的是为了更好地理解如何防御它们,而不是鼓励非法活动。在进行任何形式的渗tou测试或安全评估之前,必须获得相应的授权。
id=1 and if(substr(bin(ascii(substr(user(),1,1))),1,1)=0, sleep(5),1)#&Submit=submit
加个判断如果,字符串user位置1到1的字符,转换为ascii码,如果等于1的话就延迟5秒,不为1直接返回1
SQL注如绕过方式
使用大小写
使用SQL注释
使用URL编码
使用动态的查询执行
使用空字节
嵌套剥离后的表达式
SQL注如是一种常见的网络公鸡手段,公鸡者通过在应用程序的输入中插入恶意的SQL代码,从而操纵后端数据库,获取未授权访问或执行破坏性操作。为了绕过应用程序的安全措施,公鸡者可能会采用多种技巧和技术。以下是您提到的几种SQL注如绕过方式的详细解释:
使用大小写
某些应用程序可能只对特定的大小写组合进行过滤。公鸡者可以通过改变SQL关键字的大小写来绕过这些过滤器。例如,如果应用程序过滤了SELECT
,公鸡者可以尝试使用sEleCt
或SeLeCt
。
使用SQL注释
SQL注释可以用来绕过输入验证和过滤。例如,公鸡者可以使用注释符号(如--
或/* */
)来注释掉SQL语句的其余部分,从而使过滤器失效。例如:
' OR '1'='1'--
使用URL编码
应用程序可能不会正确解码URL编码的字符,导致过滤器无法识别恶意代吗。公鸡者可以将SQL注如payload进行URL编码,例如将空格编码为%20
,单引号编码为%27
等。
使用动态的查询执行
公鸡者可以构造动态SQL查询,使得SQL注如payload更加难以检测。例如,使用字符串拼接来构建查询,而不是直接使用SQL关键字。
使用空字节
在某些编程语言和环境中,空字节(\x00
)可以用来终止字符串。公鸡者可以在注入payload中插入空字节,以绕过基于字符串长度的过滤器。
嵌套剥离后的表达式
如果应用程序对输入进行了字符剥离(如去除单引号),公鸡者可以嵌套多个剥离操作来构造有效的SQL语句。例如,如果应用程序去除了单引号,公鸡者可以使用双单引号来构造一个有效的单引号:
' OR ''='
在这个例子中,应用程序去除了外层的单引号,留下了内层的单引号,从而构造了一个有效的注入payload。
防御sql注如
防御SQL注如是保护应用程序安全的关键步骤。以下是一些常见的防御SQL注如的方式:
使用参数化语句
参数化语句是防御SQL注如最有效的方法之一。通过使用参数化查询,可以确保用户输入不会被解释为SQL代码,从而避免注入风险。例如,在PHP中可以使用PDO
或MySQLi
的预准备语句(prepared statements)来实现参数化查询。
输入验证
通过对用户输入进行严格的验证,可以有效地防止SQL注如。例如,可以检查输入是否符合预期的格式、长度和数据类型。这种方法通常被称为“白名单”验证,即只允许预期的输入通过。
白名单
白名单策略是指仅允许预期的输入通过验证。任何不在白名单上的输入都会被拒绝。这种方法可以显著降低SQL注如的风险。
黑名单
黑名单策略是指禁止某些已知的危险输入。例如,可以编写规则来禁止单引号、分号等字符。然而,黑名单策略存在一定的局限性,因为不可能预见所有的公鸡方式。
编码输出
在输出用户提供的数据时,对其进行编码,可以防止SQL注如。例如,可以使用HTML实体编码来防止注入公鸡。然而,这种方法并不适用于所有情况,因为编码并不能完全消除注入风险。
使用存储过程
存储过程是一组预编译的SQL代码,可以接受参数并执行复杂的数据库操作。通过使用存储过程,可以减少SQL注如的风险,因为用户输入通常作为参数传递,而不是直接嵌入到SQL代码中。
综合运用上述方法,可以有效地防御SQL注如公鸡。需要注意的是,没有任何一种方法可以单独提供完全的安全保障,因此建议结合多种策略来提高应用程序的安全性。
使用参数化语句
在PHP中,使用mysqli
、PDO
等数据库扩展提供的参数化查询功能可以有效防止SQL注如。参数化查询通过将用户输入与SQL命令分离,确保用户输入不会被当作SQL代码执行。
使用mysqli
的参数化查询示例:
$stmt = $mysqli->prepare("INSERT INTO MyUsers (firstname, lastname) VALUES (?, ?)");
$stmt->bind_param("ss", $firstname, $lastname); // "ss" 表示两个参数都是字符串类型
$stmt->execute();
使用PDO
的参数化查询示例:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM employees WHERE name = :name");
$stmt->execute(['name' => $name]);
输入验证
输入验证是在接收用户输入时进行的检查,以确保输入符合预期格式和类型。良好的输入验证可以大大减少安全风险。
白名单
白名单是一种验证策略,只允许列表中明确指定的输入通过。这是一种非常安全的做法,因为它限制了输入的可能性。
白名单验证要点:
- 数据类型:确保输入是预期的数据类型,如整数、字符串等。
- 数据大小:检查输入的长度或数值大小是否在合理范围内。
- 数据范围:对于数字型数据,确保其在预期的数值范围内。
- 数据内容:验证输入的内容是否符合特定的格式要求,如电子邮件地址、电话号码等。
黑名单
黑名单是一种验证策略,它试图阻止已知的恶意输入。然而,这种方法不如白名单安全,因为它依赖于已知的不良模式,而新的公鸡模式可能会被忽略。
黑名单验证方法:
- 正则表达式:使用正则表达式匹配和阻止已知的恶意字符或模式。
- 特殊字符过滤:移除或转义可能导致问题的特殊字符,如单引号、分号等。
尽管黑名单可以提供一定程度的保护,但它不是防御SQL注如的最佳方法,因为它不能覆盖所有潜在的公鸡向量。
综上所述,结合使用参数化语句、输入验证(尤其是白名单验证)是防御SQL注如和其他注入公鸡的最有效方法。同时,定期更新和维护安全策略,以及对应用程序进行安全审计,也是保持应用程序安全的重要环节。