# 检测

> *译自：*[*Detection*](https://github.com/sqlmapproject/sqlmap/wiki/Usage#detection)

下面的相关选项可用于自定义检测环节。

## 级别

选项：`--level`

使用这个选项需要给出一个参数用于指定即将进行检测的级别。总共有**五**个级别。默认的级别是 **1**，该级别只会进行简单的检测（请求）。与之不同的是，级别 **5** 会更详细地对更大范围 payloads 和 boundaries（作为 SQL payload 的前缀和后缀）进行检测。sqlmap 使用的 payloads 直接从文本文件 `xml/payloads.xml` 中载入。根据该文件顶部的相关指导说明进行设置，如果 sqlmap 漏过了特定的注入，你可以选择自己修改指定的 payload 用于检测。

这个选项设置不止会影响 sqlmap 使用的 payload，还会影响到相关的测试注入点：**总是**测试 GET 和 POST 的相关参数，级别大于等于 **2** 则会测试 HTTP Cookie 头部，级别大于等于 **3** 则会测试 HTTP UserAgent/Referer 头部值。

总而言之， 如果 SQL 注入检测的难度越高，则需要设定越高的 `--level` 值。

强烈建议在向 sqlmap 邮件列表反馈 sqlmap 无法检测到特定类型的注入之前，尝试设定一个更高的 `--level` 值用于检测。

## 风险

选项：`--risk`

这个选项需要给出一个参数用于指定即将进行检测的风险程度。总共有**三**个风险级别。默认的级别是 **1**，对大多数 SQL 注入点而言是没有任何风险的。风险级别 **2** 则会在默认的检测上添加大量时间型盲注（Time-based blind）语句测试，级别 **3** 则会在原基础上添加`OR` 类型的布尔型盲注（Boolean-based blind）测试。

在某些场景下，例如对 `UPDATE` 语句进行 SQL 注入，注入一个 `OR` 类型的 payload 会导致目标数据表的所有记录进行更新，显然这个不是攻击者想要的结果。针对这个场景及其他相关场景，sqlmap 引入了 `--risk` 这个选项。通过这个选项：用户可以指定检测特定的 payload，同时用户可任意选择使用可能比较危险的操作。正如上面的选项提及到的，sqlmap 使用的 payloads 是直接在文本文件 `xml/payloads.xml` 载入的，该文件支持用户自定义编辑添加。

## 页面对比

选线：`--string`，`--not-string`，`--regexp` 和 `--code`

默认区分一个 `True` 查询和 `False` 查询（布尔型盲注背后的相关理念概念）是通过对比注入前后返回的结果页面是否一致进行判断的。

不过这个参照方法并不一定有效，因为可能就算没有进行注入，页面内容也会进行相应更新。例如：页面上有计数器、动态的广告横幅、或者任何基于时间而非用户输入内容进行动态渲染的内容。为了避免类似的情况，sqlmap 会尽可能尝试识别出对应的代码段所返回的请求内容并做好相关的处理。有时候，可能无法正确处理该情况，这也是为什么 sqlmap 允许用户提供一个字符串（`--string` 选项），这个字符串**需要**出现在原页面（这个并不是强制规定）**和**所有查询结果为 `True` 的页面查询中，并且**不**出现在查询结果为 `False` 的页面。除了提供静态的字符串外，用户可以提供正则表达式（`--regexp` 选项）用于匹配。此外，用户可以提供一个字符串（`--not-string` 选项），该字符串**不**能出现在原页面或者所有查询结果为 `True` 的页面，而**总是**出现在查询结果为 `False` 的页面。

通过对相关的参数注入非法值并手动对比原页面（未经过注入）和注入结果页面的不同，就可以轻易地得到目标字符串。通过这种方式的定义，页面不同的判定则会是基于用户指定的字符串或者正则表达式的匹配。

如果用户知道可以通过 HTTP 状态码区分 `True` 查询和 `False` 查询（例如：`200` 对应 `True`，`401` 对应 `False`），那么可以向 sqlmap 提供对应的信息。（例如：`--code=200`）。

开关：`--text-only` 和 `--titles`

如果用户知道可以通过 HTML 标题区分 `True` 查询和 `False` 查询（例如：`Welcome` 对应 `True`，`Forbidden` 对应 `False`），那么可以使用 `--titles` 开启基于标题对比的开关。

如果 HTTP 响应报文中存在无效信息（例如：脚本、嵌套元素等），可以通过过滤页面的内容（开关 `--text-only`）而只获取文本内容。通过这种方式，大多数情况下，这样会自动调优检测引擎。
